Sieci w Linuksie/Netfilter/iptables/przykłady
trywialne firewalle
edytujWydawać 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
edytujPoniż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