Firewall 12 June 2012

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).

Tagi: , , , ,


Odpowiedzi: 2 do wpisu “Firewall”

  1. rtgn says:

    Dlaczego używasz tej nakładki zamiast samego iptables? Chodzi o wygodę? Co Cię przekonało do tego pakietu?

    • d2 says:

      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.

Zostaw odpowiedź