Szukaj


drukuj pdf
FireWall
Wprowadzenie
Te wskazówki są przeznaczone dla osób dysponujących dużą wiedzą w zakresie administrowania serwerami dedykowanymi pod Linuxem. Manipulowanie firewall'em może być niebezpieczne . Możesz nawet doprowadzić do zablokowania Twojego serwera - będziesz musiał go ponownie uruchomić metodą HARD. Jeżeli pomylisz się w ostatnim skrypcie, i ustawisz go na samouruchomienie, utracisz dostęp do serwera ! Uważaj - jeżeli nie czujesz się na siłach nie dokonuj zmian w Twoim firewall'u !

Czym jest firewall ?
Jest to program. który blokuje niektóre porty Twojego serwera i otwiera inne. Wyobraź sobie swój dom : masz w nim drzwi od frontu i od tyłu. Nigdy nie używasz tych drugich, a więc je zamurowujesz. Dlaczego? Ponieważ stwarzają ryzyko włamania . Z firewall'em jest podobnie. Zamyka się wszystkie porty, które nie są potrzebne.

Z których portów korzystasz ?
Przede wszystkim, należy bacznie uważać, co się robi. Zawsze istnieje ryzyko pomylenia portów i zamknięcia złego. Wyobraź sobie, że blokujesz port SSH. Trzeba będzie zrestartować serwer przez telnet albo przez webmin, lub nawet fizycznie :/

Uważaj
Porty domyślnie otwarte w serwerach OVH to:
21 - ftp (serwer FTP, można pozostawić w zależności od potrzeb).
22 - ssh (zaszyfrowany dostęp do shella, zostaje !).
23 - telnet (niezaszyfrowany dostęp do shella, zostaje przy naprawie).
25 - smtp (serwer poczty przychodzącej, zostaje w większości przypadków).
53 - dns (serwer DNS, zostaje w większości przypadków).
80 - http (serwer web, zostaje).
110 - pop3 (dostęp do emaili, zostaje w większości przypadków).
143 - imap (dostęp do emaili, zostaje jeżeli nie korzystasz z pop3).
443 - https (szyfrowany dostęp do sieci, pozostawić w zależności od potrzeb).
10000 - webmin (tablica konfiguracji serwera, zostaje jeżeli z niej korzystasz).

Powyższe porty są otwierane automatycznie, możesz jednak mieć programy, które otwierają inne porty.
Ty decydujesz, które zachować, a które nie. Gdy już dokonasz wyboru, przejdziemy do uruchamiania.

Iptables
Iptables to bardzo skuteczny firewall instalowany na wszystkich serwerach OVH. Jego działanie jest następujące : otworzymy niektóre porty i zamkniemy wszystkie pozostałe. W tym przykładzie pozostawimy tylko port 22 (SSH) i 80 (HTTP). To tylko przykład, który musisz dostosować do swoich potrzeb.

Połącz się z SSH w root.
Najpierw sprawdź wersję iptable :
$ /sbin/iptables -V
iptables v1.2.4

Ta wersja jest za stara. Zainstalujemy wersję 1.2.9:
$ cd /root
$ wget http://www.netfilter.org/files/iptables-1.2.9.tar.bz2
$ tar xvfj iptables-1.2.9.tar.bz2
$ cd iptables-1.2.9
$ make KERNEL_DIR=/usr/src/linux
$ make install KERNEL_DIR=/usr/src/linux
$ cd /sbin
$ mv iptables iptables.old
$ mv iptables-restore iptables-restore.old
$ mv iptables-save iptables-save.old
$ ln -s /usr/local/sbin/iptables iptables
$ ln -s /usr/local/sbin/iptables-restore iptables-restore
$ ln -s /usr/local/sbin/iptables-save iptables-save
$ /sbin/iptables -V
iptables v1.2.9


Iptables został zaktaulizowany.
Indeksujemy istniejące reguły :

$ /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination


Mamy trzy rubryki : Input, Forward i Output.
Interesuje nas na razie tylko rybryka Input (dla ruchu przychodzącego). Autoryzujemy porty 22 i 80 :
$ /sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
$ /sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT


-A INPUT : umieszczamy naszą regułę przy wejściu firewall.
-i eth0 : oto interfejs, który nas interesuje.
-p tcp : protokół ten to TCP (na razie interesuje nas tylko ten).
--dport 22 : reguła znajdzie zastosowanie dla portu SSH (n° 22).
-j ACCEPT : Akceptuję ruch.

Tworzymy nową listę :
$ /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT tcp — anywhere anywhere tcp dpt:www

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Rubryka Input wypełnia się - to dobry znak ;) Domyślna polityka polega na przyjmowaniu wszystkiego => Chain INPUT (policy ACCEPT). Chcemy zablokować cały ruch, którego wcześniej nie autoryzowaliśmy. Dodamy zatem regułę, która zablokuje inne porty. Pozostaje jeden problem : przy wykonywaniu połączenia z naszego serwera do serwera kernel.org (aby pobrać nowe jądro - to tylko przykład), serwer ustanowi połączenie ze stroną i będzie czekał na odpowiedź. Żądanie połączenia zostanie wysłane, ale jak powróci skoro wszystkie porty zostały zablokowane ? Na szczęście, iptables jest w stanie wybrać pakiety ze względu na ich stan. Dodamy więc regułę :
$ /sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Pozostaje nam tylko zablokować resztę (uwaga, to od tego momentu firewall zacznie naprawdę działać; sprawdź więc, czy dobrzez wprowadziłeś reguły. Jeżeli tak nie jest, zablokujesz swój serwer !)
$ /sbin/iptables -A INPUT -i eth0 -j DROP

Przy tej regule mamy dwie opcje.
1. Albo rezygnujemy z pakietów - wówczas odrzucony pakiet będzie wymazywany. Klient będzie oczekiwał na odpowiedź aż to timeoutu.
2. Albo odrzucamy pakiety (REJECT w miejsce DROP) - w momencie nadejścia nieporządanego pakietu, klient otrzyma wiadomość o wystąpieniu błędu i nie będzie dłużej oczekiwał, ponieważ otrzyma odpowiedź negatywną.

Odrzucanie pakietów jest bardziej właściwe, ale rezygnacja z nich jest bardziej bezpieczna. Stałe wysyłanie pakietów do niewłaściwego portu spowoduje, że Twój serwer nie odbierze ich, natomiast dzięki opcji odrzucania, odpowiedź zajmie mu trochę czasu. WYBÓR NALEŻY DO CIEBIE!

Firewall już funkcjonuje. Spróbuj przeskanować swój serwer, a przekonasz się, że tylko port 22 i 80 są otwarte. Nie zdziw się długim czasem skanowania. Jest to spowodowane działaniem reguły DROP.

Aby znieść firewall wpisz:
$ /sbin/iptables -F INPUT

Komenda ta wymaże wszystkie reguły z rubryki INPUT.

Jeżeli chcesz dodać kolejną regułę pomiędzy regułę pierwszą i drugą, wpisz :
$ /sbin/iptables -I INPUT 2 ... i następnie Twoją nową regułę


Aby usunąć regułę nr 3, wpisz :
$ /sbin/iptables -D INPUT 3


Aby całkowicie zablokować adres IP :
$ /sbin/iptables -I INPUT 1 -s -j DROP


Blokowanie adresu IP
  • Jeżeli chcesz zablokować protokół ICMP (połączenia ping), musisz pozwolić pingować przynajmniej ping.ovh.net, proxy.p19.ovh.net, proxy.rbx.ovh.net, proxy.ovh.net, proxy.sbg.ovh.net, proxy.bhs.ovh.net. Pozwoli to ekipie OVH sprawdzić, jaki jest stan Twojego serwera. Mususz również mieć aktywne IP uzyskane w następujący sposób:

IP Twojego serwera ma formę aaa.bbb.ccc.ddd
Należy autoryzować IP: aaa.bbb.ccc.250
Przykład: dla serwera 213.186.57.143, należy autoryzować 213.186.57.250 dla serwera SLA oraz 213.186.57.251 dla serwera MRTG (dostęp do RTM). W przypadku nowego systemu monitoringu icmp należy autoryzować pule następujących IP: 92.222.184.0/24, 92.222.185.0/24, 92.222.186.0/24, 167.114.37.0/24.

Jeżeli posiadasz serwer Xeon/HG, autoryzuj równiez IP aaa.bbb.ccc.249 (reguła tymczasowa).

  • Jeżeli zablokujesz wszystkie połączenia ping, również te pochodzące z OVH, nie będziemy mogli nadzorować pracy Twojego serwera, a gdy ten sie zepsuje, nie zostaniemy o tym powiadomieni.
Aby autoryzować ping na naszych serwerach, wprowadz następujące reguły:

/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 37.187.231.251 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.184.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.185.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.186.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 167.114.37.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.sbg.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.bhs.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.250 -j ACCEPT # IP = aaa.bbb.ccc otrzymane zgodnie ze wcześniejszą regułą
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.249 -j ACCEPT # tymczasowo, tylko dla serwerów HG
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.251 -j ACCEPT # IP dla systemu monitoringu


  • Jeżeli chcesz ograniczyć dostęp jedynie do Twojego adresu IP na poziomie SSH, radzimy pozostawić cache.ovh.net. Dzięki temu, w przypadku problemów z Twoim serwerem, będziemy mogli interweniować i naprawić maszynę. Jeżeli zamkniesz port 22 dla ekipy OVH, nie będziemy mogli Ci pomóc w razie blokady serwera.
Aby autoryzować SSH na naszych serwerach, wprowadz następującą regułę:
sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT

  • Jeżeli masz serwer plików RAID nie zapomnij autoryzować połączeń NFS. Należy autoryzować wszystko, co wychodzi z sieci 192.168.0.0/16:
/sbin/iptables -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT

  • Jeżeli posiadasz klaster, należy autoryzować port 79, aby system OCO komunikował się z serwerem głównym:
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT


Przykład kompletnej konfiguracji

/sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 37.187.231.251 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.184.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.185.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.186.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 167.114.37.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 21 --source xx.xx.xx.xx -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source xx.xx.xx.xx -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.250 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.251 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -j REJECT

W tych regułach należy oczywiście zastąpić xx.xx.xx.xx adresem IP maszyny, której używasz, aby mieć dostęp do Twojego serwera przez ftp i ssh.

Zautomatyzowanie działania firewalla
Gdy Twój firewall jest już skonfigurowany, pozostaje Ci tylko utworzenie skryptu, który będzie się uruchamiał przy każdym uruchomieniu Twojego serwera. Oto przykład do umieszczenia w pliku o nazwie np. "firewall" w katalogu /etc/init.d/ :
#!/bin/sh

# chkconfig: 3 21 91
  • # description: Firewall

  • IPT=/sbin/iptables

    case "$1" in
    start)
    $IPT -F INPUT
    $IPT -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
    $IPT -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 21 --source xx.xx.xx.xx -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 22 --source xx.xx.xx.xx -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source proxy.rbx2.ovh.net -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.251 -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.250 -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
    $IPT -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source 37.187.231.251 -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source 92.222.184.0/24 -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source 92.222.185.0/24 -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source 92.222.186.0/24 -j ACCEPT
    $IPT -A INPUT -i eth0 -p icmp --source 167.114.37.0/24 -j ACCEPT
    $IPT -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
    $IPT -A INPUT -i eth0 -j REJECT
    exit 0
    ;;

    stop)
    $IPT -F INPUT
    exit 0
    ;;
    *)
    echo "Usage: /etc/init.d/firewall {start|stop}"
    exit 1
    ;;
    esac

    Przyznaj mu uprawnienia 700 i wpisz "/etc/init.d/firewall start", aby go uruchomić lub "/etc/init.d/firewall stop", aby go zatrzymać.Aby firewall był aktywowany automatycznie po uruchomieniu komputera :
    $ /sbin/chkconfig --level 3 firewall on
    $ /sbin/chkconfig --level 06 firewall off


    UWAGA!Zanim wpiszesz ten skrypt sprawdź, czy jest on odpowiedni. W przeciwnym wypadku Twój serwer zostanie zablokowany! Komunikacja między RTM a serwerem wymaga autoryzacji połączeń przychodzących i wychodzących na portach UDP 6100 do 6200