Sieci w Linuksie/Netfilter/iptables/przykłady

trywialne firewalle

edytuj

Wydawać by się mogło, że najprostszym firewallem (dla komputera nie będącego trasownikiem) będzie następująca konfiguracja:

iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

Jednak spowoduje ona natychmiastowe odcięcie od sieci. Jest to spowodowane tym, że łańcuchy w tablicy filter widzą wszystkie pakiety. Oznacza to, że domyślna polityka DROP łańcucha INPUT dotyczyć będzie również pakietów należących do połączeń inicjowanych przez sam komputer! Poprawną konfiguracją uniemożliwiającą dostęp z zewnątrz do komputera, ale jednocześnie pozwalającą na inicjowanie połączeń będzie:

iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

4. reguła używa modułu conntrack, który pozwala dopasowywać stany połączeń widziane przez mechanizm śledzenia conntrack.

DNAT pomiędzy dwiema sieciami publicznymi

edytuj

Poniższy przykład pokazuje w jaki sposób rozwiązać problem DNATowania adresów IP z jednej sieci publicznej na drugą, jeżeli używamy statycznego routingu i polityk.

Opis konfiguracji
ip a add 192.168.1.1/24 dev eth0		     # interfejs z pierwszą siecią serwerową
ip a add 192.168.2.1/24 dev eth1		# interfejs z drugą siecią serwerową
ip a add 10.0.10.2/30 dev eth2			# interfejs bramy dla pierwszej sieci
ip a add 10.0.20.2/30 dev eth3			# interfejs bramy dla drugiej sieci

ip route add default via 10.0.10.1 table t1	# brama domyślna dla pierwszej sieci
ip route add default via 10.0.20.1 table t2	# brama domyślna dla drugiej sieci

ip rule from 192.168.1.1/24 lookup t1 priority 100	     # polityka przypisująca ruch z sieci 1 do tabeli routingu t1
ip rule from 192.168.2.1/24 lookup t2 priority 100	# polityka przypisująca ruch z sieci 2 do tabeli routingu t2
Dokładny opis przypadku

Celem konfiguracji na routerze/firewallu jest utworzenie działającego DNAT pomiędzy adresami 192.168.2.0/24 osiągalnymi przez interfejs eth3, a adresami docelowymi 192.168.1.0/24 , inaczej mówiąc ruch wchodzący przez eth2 ma być NETMAPowany z adresów 192.168.2.0/24 na adresy 192.168.1.0/24.

Konfiguracja firewalla
iptables -t nat -A PREROUTING -i eth3 -d 192.168.2.0/24 -j CONNTRACK --set-mark 0x10		     # 1
iptables -t nat -A PREROUTING -i eth3 -d 192.168.2.0/24 -j NETMAP --to 192.168.1.0/24			# 2
iptables -t mangle -A PREROUTING -i eth0 -m connmark --mark 0x10 -j CONNMARK --restore-mark		# 3

ip rule nfmark 0x10 lookup t2 priority 50								# 4
Opis działania

Teoretycznie do realizacji DNAT wystarczyłaby reguła (2), jednak taka konfiguracja by nie zadziałała ponieważ podsystem routingu błędnie przypisałby pakiety powracające w ramach DNATowanych połączeń do tabeli t1 i w konsekwencji wysłał przez złą bramę, co w większości konfiguracji nie jest oczekiwanym efektem. Dlatego najpierw reguła (1) ustawia wewnątrz połączenia znacznik ctmark na wartość 0x10, a następnie realizowany jest DNAT za pomocą NETMAP. Gdy pakiety powracają przez interfejs eth0 sprawdzane jest w regule (3), czy należą do połączenia z ctmark o wartości 0x10, jeżeli tak, to wartość ta jest ustawiana dla każdego pakietu w nfmark. Linijka (4) ustawia dodatkową politykę, której zadaniem jest przypisanie powracających pakietów do odpowiedniej tabeli routingu (na podstawie ustawionej wartości nfmark na 0x10).

Uwagi

Należy pamiętać o tym, że jeżeli na tej samej maszynie jest realizowane filtrowanie pakietów, to w wyniku powyższego DNATu w tabeli filter widoczne będą pakiety, które przychodzą z interfejsu eth3, a kierowane są na adresy przypisane do interfejsu eth0, czyli poniższą regułę zdublować z uwzględnieniem nowej sytuacji (przy założeniu, że domyślną polityką jest DROP):

iptables -A FORWARD -i eth2 -d 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT

Dodatkowa reguła ma postać:

iptables -A FORWARD -i eth3 -d 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT