Tuż po postawieniu serwera dobrze jest go zamknąć (nawet tylko na czas utwardzania) za firewallem. Oczywiście nie zaszkodzi zostawić zaporę po skonfigurowaniu systemu. Po co niby ktoś ma grzebać nmapem przy naszych otwartych portach? Scenariusz, który tutaj opiszę przewiduje maszyny z jednym (jakiś wolno stojący serwerek) i dwoma interfejsami (domowa sieć, maskarada).
1. pojedynczy interfejs
[root@srv ~] # ifconfig eth0 Link encap:Ethernet HWaddr 00:50:56:84:01:a5 inet addr:1.2.3.4 Bcast:1.2.3.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2798890 errors:0 dropped:1575 overruns:0 frame:0 TX packets:6365 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:219527970 (209.3 MiB) TX bytes:1314821 (1.2 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:6294 errors:0 dropped:0 overruns:0 frame:0 TX packets:6294 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:627245 (612.5 KiB) TX bytes:627245 (612.5 KiB)
Podstawowy interfejs to eth0 z ip 1.2.3.4. Teraz doinstalujemy skrypt firewalla o nazwie shorewall. Jest to perlowa nakładka na iptables:
[root@srv ~] # apt-get install shorewall -y
a następnie skopiujemy potrzebne pliki do konfiguracji tego pakietu:
[root@srv ~] # cd /etc/shorewall/ [root@srv /etc/shorewall] # cp /usr/share/doc/shorewall/examples/one-interface/* . [root@srv /etc/shorewall] # rm shorewall.conf.gz
Należy także pamiętać, że aby firewall działał po restarcie systemu, trzeba przestawić flagę startup=0 na startup=1 w pliku /etc/default/shorewall. Teraz możemy przejść do konfiguracji zapory. Domyślna polityka będzie zabraniać wszelkich połączeń przychodzących oraz wychodzących (REJECT) do naszego serwera, a także logowanie odrzuconych pakietów i dodania na czarną listę wybranych adresów IP. W następnym kroku pozwolimy na przychodzący ICMP (ping) oraz otworzymy selektywnie tylko następujace porty:
- 22/tcp (SSH tylko dla grupy ADMINS),
- 53/udp (wychodzące żądania do serwera nazw)
Edytujemy plik /etc/shorewall/rules do postaci:
[root@srv /etc/shorewall] # cat rules # allow ping ACCEPT $FW net icmp ACCEPT net $FW icmp # allow ssh access from admin host ACCEPT net:$ADMINS $FW tcp 22 # allow outgoing dns requests ACCEPT $FW net:$DNS udp 53
Plik ten odpowiedzialny jest za tworzenie reguł. Pierwsze pole określa akcję (ACCEPT), następne strefę źródłową ($FW to zmienna przechowująca dane o naszym hoście), strefę docelową (net), protokół sieciowy, port docelowy, port źródłowy. Dokładna lista znajduje się w pliku /usr/share/doc/shorewall/examples/one-interface/rules, a ich opis w
man shorewall-rules
Teraz poprawimy /etc/shorewall/policy tak, by pakiety przychodzące i wychodzące były odrzucane i logowane:
[root@srv /etc/shorewall] # cat policy $FW net REJECT info net all REJECT info # The FOLLOWING POLICY MUST BE LAST all all REJECT info
I na koniec dodamy jeszcze pliki params (przechowuje zmienne używane w definicji reguł w pliku rules) oraz blacklist (czarna lista zawierająca adresy IP)
[root@srv /etc/shorewall] # cat params ADMINS=1.2.3.4 DNS=2.3.4.5 [root@srv /etc/shorewall] # cat blacklist 3.4.5.6
2. dwa interfejsy
Tą konfigurację można wykorzystać w przypadku, gdzie chcemy stworzyć programowy router, np dla rozdziału łącza w sieci lokalnej.
[root@srv ~] # ifconfig eth0 Link encap:Ethernet HWaddr 00:50:56:84:01:a5 inet addr:83.83.83.83 Bcast:x.x.x.x Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2798890 errors:0 dropped:1575 overruns:0 frame:0 TX packets:6365 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:219527970 (209.3 MiB) TX bytes:1314821 (1.2 MiB) eth1 Link encap:Ethernet HWaddr 00:50:56:84:01:a5 inet addr:192.168.10.1 Bcast:x.x.x.x Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2798890 errors:0 dropped:1575 overruns:0 frame:0 TX packets:6365 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:219527970 (209.3 MiB) TX bytes:1314821 (1.2 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:6294 errors:0 dropped:0 overruns:0 frame:0 TX packets:6294 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:627245 (612.5 KiB) TX bytes:627245 (612.5 KiB)
Na poczętek proponuję skopiować pliki z /usr/share/doc/shorewall/examples/two-interfaces/ i przeprowadzić konfigurację w identyczny sposób, jak to miało miejsce dla jednego interfejsu.
[root@srv /etc/shorewall] # cp /usr/share/doc/shorewall/examples/two-interfaces/* /etc/shorewall/
A następnie poprawić wpis w /etc/shorewall/masq zostawiając tylko tę podsieć, którą mamy skonfigurowaną na interfejsie eth1. OK, teraz trzeba jeszcze się upewnić, że plik /etc/shorewall/shorewall.conf zawiera parametry ROUTE_FILTER=Yes oraz BRIDGING=Yes.
Czas na podniesienie firewalla. Uruchamiamy shorewall-a z parametrem safe-restart. Dzięki temu będziemy mieli szansę na interwencję, jeśli omyłkowo odcięliśmy się od serwera – po 60 sekundach bezczynności konsola restartu shorewall-a przywróci stan reguł iptables sprzed restartu
[root@srv /etc/shorewall] # shorewall safe-restart
To wszystko, hosty możemy blokować poprzez /etc/shorewall/blacklist. Jeśli jednak to wam nie wystarczy, polecam skrypty baroo – bardzo dobry zestaw do obsługi małych sieci (QoS, NAT, firewall, blokowanie ruchu P2P, limity down/upload per IP lub MAC).
Dlaczego używasz tej nakładki zamiast samego iptables? Chodzi o wygodę? Co Cię przekonało do tego pakietu?
Chodzi wyłącznie o wygodę obsługi. Definiowanie stref ruchu w sieci przy pomocy shorewalla jest dla mnie bardziej przejrzyste, niż używanie natywnie iptables.