Sieci w Linuksie/Netfilter/iptables/dopasowania
Podstawowym elementem reguł w iptables są dopasowania. Dopasowanie sprawdza, czy pakiet spełnia zadane kryteria - jeżeli tak to:
- pakiet jest dodawany do licznika dopasowanych pakietów
- wykonywana jest akcja (jeżeli została podana)
Dostępne akcje są opisane w rozdziale Sieci:Linux/Netfilter/iptables/akcje.
Jeżeli w pojedynczym poleceniu iptables znajduje się więcej niż jedno dopasowanie podlegają one operacji iloczynu logicznego (AND). Oznacza to, że jeżeli pakiet ma zostać dopasowany muszą zajść na raz wszystkie dopasowania z danego polecenia. Poniższa reguła dopasuje pakiety, które pochodzą z adresu 192.168.0.100, adresem docelowym jest 192.168.0.1, protokołem TCP, a portami: źródłowym 32137, a docelowym 80.
iptables -A FORWARD -s 192.168.0.100 -d 192.168.0.1 -p tcp --sport 32137 --dport 80 -j ACCEPT
Aby móc wykonać alternatywę logiczną (OR) należy użyć łańcuchów. Poniższy zbiór reguł dopasuje pakiet, który: pochodzi z adresu 192.168.0.100 i protokołem jest TCP i ( adresem docelowym jest 192.168.0.1 lub portem źródłowym jest 32137 lub portem docelowym jest 80)
iptables -N OR iptables -A FORWARD -s 192.168.0.100 -p tcp -j OR iptables -A OR -d 192.168.0.1 -j ACCEPT iptables -A OR -p tcp --sport 32137 -j ACCEPT iptables -A OR -p tcp --dport 80 -j ACCPET
Znak ! dopasowanie oznacza zanegowanie występującego za nim dopasowania.
- Przykłady
iptables -A FORWARD -p tcp -s 192.168.1.3 -d 192.168.0.5 -j ACCEPT
- Powyższa reguła wpuszcza pakiety TCP pochodzące z adresu 192.168.1.3 i przeznaczone do adresu 192.168.0.5
iptables -A FORWARD -p tcp ! -s 192.168.1.3 -d 192.168.0.5 -j ACCEPT
- Powyższa reguła wpuszcza pakiety TCP NIE pochodzące z adresu 192.168.1.3 i przeznaczone do adresu 192.168.0.5
Podstawowe dopasowania
[edytuj]Podstawowymi opcjami dopasowującymi są:
- [!] -d --destination --dst adres[/maska] - dopasowuje adres docelowy pakietu (adres hosta, lub sieci w formacie CIDR). Jeżeli ta opcja nie jest podana dopasowywany jest każdy adres sieciowy. Np. -d 192.168.0.1, -d 192.168.0.0/16
- [!] -s --source --src adres - dopasowuje adres źródłowy pakietu (jw.). jw.
- [!] -i --in-interface interfejs[+] - dopasowuje pakiet na podstawie nazwy interfejsu wejściowego. Dodanie + dopasowuje wszystkie interfejsy zaczynające się na interfejs. Np zapis -i wlan+ dopasowuje pakiety, które weszły przez interfejsy, których nazwa zaczyna się od wlan. Domyślnie dopasowywane są pakiety wchodzące przez dowolny interfejs
- [!] -o --out-interface interfejs[+] - dopasowuje pakiet na podstawie nazwy interfejsu wyjściowego.
- Uwaga: Jeżeli dodaje się dodatkowe adresy IP do interfejsu za pomocą ipconfig nazwy interfejsu postaci eth0:0, eth0:1, itp. są tylko aliasami używanymi przez program ifconfig - w iptables wszystkie te zapisy są równoważne eth0, a zapis '-i eth0:1' powoduje błąd składni. Narzędzie ip pozwala dodawać wiele adresów IP do pojedynczego interfejsu bez tworzenia aliasów.
- [!] -p --protocol protokół - dopasowuje pakiet na podstawie protokołu warstwy 4 (TCP, UDP, ICMP, itp.). Można używać wartości numerycznych, jak i nazw zgodnie z zawartością pliku /etc/protocols. Podanie wartości '0' pozwala na dopasowanie dowolnego protokołu, jest to wartość domyślna.
- Uwaga: Poniższe dwie opcje wymagają podania opcji -p wraz z protokołem, dla którego istnieje pojęcie portu (np. TCP, UDP). Wiele protokołów nie używa takiego pojęcia - na przykład AH, ESP, GRE, ICMP.
- [!] --dport --destination-port port1[:port2] - dopasowuje pakiet na podstawie portu docelowego protokołu warstwy 4. Można podać pojedynczy port, lub zakres portów, zarówna za pomocą numerów, jak i nazw zgodnych z zawartością pliku /etc/services. Zapis ':liczba' jest równoważny zapisowi '0:liczba', a 'liczba:' - 'liczba:65535', jeżeli port2 jest większy niż port1 następuje automatyczne odwrócenie zakresu. Przykłady: -p udp --dport 44444, -p tcp --dposrt ftp-data:ftp
- [!] --sport --source-port port1[:port2] - dopasowuje pakiet na podstawie portu źródłowego protokołu warstwy 4. jw.
- [!] -f - dopasowuje pakiet, który nie jest pierwszym fragmentem sfragmentowanego pakietu.
-p tcp
[edytuj]Dopasowanie protokołu TCP pozwala na wybranie dodatkowych opcji (prócz --sport i --dport opisanych powyżej):
- [!] --tcp-flags maska komp - dopasowuje tylko pakiet z ustawionymi odpowiednimi flagami. Na flagach ustawionych w pakiecie najpierw jest przeprowadzona operacja & (bitowe AND) z maską, a potem porównanie z komp ( flagi pakietu & maska == komp). Maskę jak i komp można podać w postaci liczbowej, albo za pomocą nazw symbolicznych (SYN ACK FIN RST URG PSH ALL NONE), jako logiczne OR dla nazw symbolicznych używa się przecinka.
- [!] --syn - opcja ta dopasowuje pakiety z ustawioną (tylko) flagą SYN. Jest równoważna --tcp-flags SYN,RST,ACK,FIN SYN)
- [!] --tcp-option numer - dopasowuje pakiety z ustawioną opcją o zadanym numerze.
- Numery opcji
- 1 - NO-OP, pusta instrukcja
- 2 - maksymalny rozmiar segmentu (ang. Maximum Segment Size)
- 3 - skalowanie okna transmisji (ang. window scaling)
- 4 - zgoda na użycie SACK (ang. Selective ACKnowledgement)
- 5 - opcja SACK
- 8 - znacznik czasu
- 14 - żądanie alternatywnej sumy konktrolnej (MD5)
- 15 - alternatywna suma kontrolna
- Przykłady
iptables -A FORWARD -p tcp --tcp-flags SYN,RST,ACK,FIN SYN -j ACCEPT
Powyższa reguła dopasowuje pakiety z ustawioną flagą SYN w następujący sposób: najpierw tworzona jest maska binarna, za pomocą której z pakietu wybierane są flagi SYN, RST, ACK, FIN, a następnie liczba ta jest porównywana z wartością SYN. Dla przykładu pakiet z ustawionymi flagami SYN i ACK będzie miał binarne flagi 0100 1000 (w zapisie little-endian), maska będzie 1110 1000, 0100 1000 & 1110 1000 = 0100 1000, co następnie jest porównywane z flagą 0100 0000, pakiet nie zostaje dopasowany.
-p icmp
[edytuj]Dopasowanie protokołu ICMP pozwala na wybranie dopasowywanych komunikatów.
- [!] --icmp-type nazwa - pozwala na doposowanie komunikatu na podstawie nazwy symbolicznej
- [!] --icmp-type typ[/kod] - pozwala na dopasowanie komunikatu na podstawie typu (i kodu)
- Nazwy symboliczne komunikatów ICMP:
- any
- echo-reply (pong)
- destination-unreachable
- network-unreachable
- host-unreachable
- protocol-unreachable
- port-unreachable
- fragmentation-needed
- source-route-failed
- network-unknown
- host-unknown
- network-prohibited
- host-prohibited
- TOS-network-unreachable
- TOS-host-unreachable
- communication-prohibited
- host-precedence-violation
- precedence-cutoff
- source-quench
- redirect
- network-redirect
- host-redirect
- TOS-network-redirect
- TOS-host-redirect
- echo-request (ping)
- router-advertisement
- router-solicitation
- time-exceeded (ttl-exceeded)
- ttl-zero-during-transit
- ttl-zero-during-reassembly
- parameter-problem
- ip-header-bad
- required-option-missing
- timestamp-request
- timestamp-reply
- address-mask-request
- address-mask-reply
- Uwagi
- Większość wyżej wymienionych komunikatów jest odpowiedzią na wcześniej wysłany pakiet (pakiety), dlatego w przypadku użycia modułu state zostaną one złapane przez dopasowanie -m state --state RELATED.
- Przykłady
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
- Powyższa reguła wpuszcza pingi.
iptables -A OUTPUT -p icmp --icmp-type redirect -j ACCEPT
- Ta reguła pozwala routerowi na wypuszczanie pakietów ICMP redirect w przypadku, jeżeli zna lepszą bramę niż on sam.
-m addrtype
[edytuj]Moduł ten służy do dopasowywania pakietów na podstawie rodzaju adresu sieciowego (unicast, multicast, itp.). Rozpoznawane są następujące opcje:
- [!] --src-type typ[,...] - dopasowuje pakiety na podstawie rodzaju źródłowego adresu.
- [!] --dst-type typ[,...] - dopasowuje pakiety na podstawie rodzaju docelowego adresu.
- --limit-iface-in interfejs - ogranicza sprawdzanie typu adresu tylko do wybranego interfejsu wejściowego.
- --limit-iface-out interfejs - ogranicza sprawdzanie typu adresu tylko do wybranego interfejsu wyjściowego.
- Rozpoznawane typy adresów
- UNSPEC - niezdefiniowany adres (np. 0.0.0.0)
- UNICAST - adres unicast (adres hosta)
- LOCAL - adres lokalnego komputera
- BROADCAST - adres rozgłoszeniowy
- ANYCAST - adres anycast
- MULTICAST - adres multicast
- XRESOLVE -
- BLACKHOLE - adres typu blackhole (routing donikąd)
- UNREACHABLE - adres niedostępny
- PROHIBIT - adres zablokowany (przez administratora)
- THROW -
- NAT -
- Uwagi
- Opcje --limit-iface-in i --limit-iface-out prawdopodobnie tym różnią się od -i i -o, że optymalizują przetwarzanie reguły (sprawdzanie typu adresu może być pracochłonne, więc dla pakietu z innego interfejsu niż wybrany nie są sprawdzane niezależnie od normalnej kolejności przetwarzania reguły).
- Typy BLACKHOLE, UNREACHABLE, PROHIBIT różnią się od siebie tym, że w przypadku routingu blackhole pakiety znikają, natomiast w przypadku dwóch pozostałych wysyłany jest pakiet ICMP z informacją, że host jest nieosiągalny (lub dostęp został zabroniony).
Przykłady:
iptables -A FORWARD -m addrtype --dst-type BROADCAST -j DROP
- Ta reguła nie przepuszcza pakietów rozgłoszeniowych. Dla sieci 192.168.0.0/24 oznacza to adres 192.168.0.255.
iptables -A FORWARD -m addrtype --dst-type BLACKHOLE -j ACCEPT
- Ta reguła przepuszcza ruch typu blackhole, jednak nie zostanie on i tak dalej przekazany ponieważ routing blackhole odrzuca pakiety idące w tym kierunku.
-m ah
[edytuj]Moduł ten pozwala na dopasowanie wartości SPI (Security Parameter Index) dla pakietów protokołu AH (Authentication Header). Aby użyć tego modułu należy równocześnie użyć '-p ah'. Moduł ten posiada tylko jedną opcję:
- [!] --ahspi spi1[:spi2] - dopasowuje pakiet, którego SPI wynosi spi1 (lub zawiera się w zakresie <spi1,spi2>).
-m cluster
[edytuj]-m comment
[edytuj]Moduł ten służy do dodania komentarza do reguły. Maksymalna długość komentarza to 255 znaków. Posiada jeden parametr:
- --comment "komentarz" - Ustawia zadany komentarz. Komentarz musi być w cudzysłowiu (pojedynczym, lub podwójnym), ponieważ inaczej powłoka rozbije poszczególne słowa na parametry wywołania programu.
- Przykłady
iptables -A INPUT -m comment --comment "Ponizej bardzo wazne reguly"
- Powyższa reguła doda komentarz wyświeltany w następujący sposób:
# iptables -L INPUT Chain INPUT (policy ACCEPT) target prot opt source destination all -- anywhere anywhere /* Ponizej bardzo wazne reguly */
-m connbytes
[edytuj]Moduł ten dopasowuje pakiety na podstawie całkowitej liczby bajtów (pakietów), które przeszły (w jedną, w drugą, bądź w obie strony) w połączeniu, do którego należy dany pakiet. Możliwe jest też dopasowanie na podstawie średniego rozmiaru pakietu w połączeniu. Moduł ten używa danych z moduły conntrack, więc wyniki pomiarów dotyczą rzeczywistych połączeń. Według manuala iptables liczniki są 64bitowe, jednak nie można ustawić górnego limitu powyżej 4 miliardów - 2^32. Dla połączeń, które nie są śledzone ten moduł nigdy nie dopasowuje. Opcje modułu:
- --connbytes-dir {original|reply|both} - ustawia kierunek, który jest brany pod uwagę podczas obliczania liczby bajtów/liczby pakietów/średniego rozmiaru pakietu. original oznacza, że pod uwagę brany będzie tylko ruch w kierunku, w którym dane połączenie było inicjalizowane, reply oznacza, że pod uwagę brany będzie kierunek powrotny względem inicjowania połączenia, both oznacza sumaryczny pomiar obu.
- --connbytes-mode {packets|bytes|avgpkt} - ustawia tryb dopasowania. packets oznacza dopasowanie na podstawie liczby pakietów, bytes bajtów, a avgpkt na podstawie średniego rozmiaru pakietu.
- [!] --connbytes od:[do] - ustawia dopasowywany przedział. Liczby należy podać w postaci dziesiętnej bez żadnych mnożników. Dwukropek po dolnym limicie jest obligatoryjny, a domyślnym limitem górnym jest rozmiar licznika.
- Przykłady
iptables -A FORWARD -m connbytes --connbytes-dir both --connbytes-mode bytes --connbytes 2147483648: -j REJECT
- Powyższa reguła spowoduje zrywanie połączeń, które przekroczą sumarycznie 2GB przesłanych danych.
iptables -t mangle -A PREROUTING -m connbytes-dir both --connbytes-mode bytes --connbytes 1048576: -j MARK --or-mark 0x100000
- Powyższa reguła ustawia bit 20 w znaczniku firewalla dla połączeń, których sumaryczny ruch przekroczył 1MB. Znacznik ten może zostać później użyty przez mechanizm QoS w celu odpowiedniego potraktowania połączeń, w których przesyłane jest dużo danych.
-m connlimit
[edytuj]Moduł ten pozwala na limitowanie połączeń z danego adresu źródłowego. Moduł ten posiada dwie opcje:
- --connlimit-upto liczba - dopasowuje jeżeli liczba połączeń jest poniżej zadanej (od 0 do liczba)
- --connlimit-above liczba - dopasowuje jeżeli liczba połączeń jest większa od zadanej.
- --connlimit-mask maska - ustawia długość prefiksu źródłowych adresów sieciowych, których ma dotyczyć limitowanie. Wartością domyślną jest 32, co oznacza pojedynczy host.
- --connlimit-saddr - grupuje do zliczania adresy według adresu źródłowego
- --connlimit-daddr - grupuje do zliczania adresy według adresu docelowego
- Uwagi
- Zliczane są połączenia, do których należą pakiety, które dopasowane by zostały przez regułę, gdyby nie został użyty moduł connlimit. Oznacza to, że poniższa reguła
iptables -A FORWARD -p tcp --syn --dport 22 -d 192.168.120.4 -m connlimit --connlimit-above 2 -j REJECT
przepuści dwa połączenia SSH do adresu IP 192.168.120.4, a każde kolejne zostanie odrzucone do czasu, aż któreś z tych dwóch nie zostanie zamknięte. Powyższa reguła zadziała identycznie jak poniższa
iptables -A FORWARD -p tcp --dport 22 -d 192.168.120.4 -m connlimit --connlimit-above 2 -j REJECT
różnica polegać będzie jedynie na wydajności przetwarzania reguł.
- Przykłady
iptables -A FORWARD -p tcp --syn --dport 22 -d 192.168.120.4 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT
- Powyższa reguła wprowadza limit połączeń dla SSH na 2 równoczesne połączenia z każdej sieci /24. Oznacza to, że z sieci 192.168.1.0/24 będą się mogły połączyć 2 hosty, ale w tym samym czasie połączyć się będą mogły również 2 hosty z sieci 172.16.16.0/24 jak i każdej innej /24.
iptables -A FORWARD -p tcp --syn --dport 80 -d 195.0.0.12 -m connlimit --connlimit-above 16 --connlimit-mask 27 -j DROP
- Powyższa reguła wprowasza limit połączeń dla WWW na 16 równoczesnych połączeń z sieci /27.
-m connmark
[edytuj]Moduł ten dopasowuje pakiety na podstawie znacznika połączenia (ang. connection mark). Jest to inny rodzaj znacznika, niż fwmark dopasowywany przez moduł mark. Znaczniki connmark ustawia się za pomocą celu CONNMARK. Dopasowanie to posiada jedną opcję:
- [!] --mark wartość[/maska] - dopasowuje pakiet na podstawie wartości znacznika połączenia. Jeżeli maska jest podana to najpierw robiona jest operacja bitowa AND z maską, a potem porównanie z podaną wartością (wartość == connmark & maska).
-m conntrack
[edytuj]Moduł ten pozwala na dopasowanie pakietu na podstawie stanu z mechanizmu conntrack. Moduł ten przyjmuje następujące opcje:
- [!] --ctstate stan[,...] - dopasowuje pakiety na podstawie przynależności do jednego z podanych stanów połączenia. Opis dostępnych stanów znajduje się poniżej.
- [!] --ctproto protokół - dopasowuje pakiet na podstawie protokołu warstwy 4 (UDP. ICMP. itp.). Można podać numer protokołu, lub jego nazwę (zgodnie z /etc/protocols).
- [!] --ctorigsrc adres - dopasowuje pakiet na podstawie oryginalnego adresu źródłowego.
- [!] --ctorigdst adres - dopasowuje pakiet na podstawie oryginalnego adresu docelowego.
- [!] --ctreplsrc adres - dopasowuje pakiet na podstawie adresu źródłowego odpowiedzi.
- [!] --ctrepldst adres - dopasowuje pakiet na podstawie adresu docelowego odpowiedzi.
- [!] --ctorigsrcport port - dopasowuje pakiet na podstawie oryginalnego portu źródłowego.
- [!] --ctorigdstport port - dopasowuje pakiet na podstawie oryginalnego portu docelowego.
- [!] --ctreplsrcport port - dopasowuje pakiet na podstawie portu źródłowego odpowiedzi.
- [!] --ctrepldstport port - dopasowuje pakiet na podstawie portu docelowego odpowiedzi.
- [!] --ctstatus status[,...] - dopasowuje pakiet na podstawie statusu połączenia. Poniżej znajdują się opisy możliwych statusów.
- [!] --ctexpire czas[:czas] - dopasowuje pakiet na podstawie pozostałego czasu życia wpisu w tablicy conntrack. Można podać albo pojedynczą wartość w sekundach, albo zakres czasu.
- --ctdir {ORIGINAL|REPLY} - dopasowuje pakiet na podstawie kierunku ruchu pakietów. ORIGINAL oznacza kierunek, w którym połączenie zostało zainicjowane, a REPLY kierunek powrotny. Nie podanie tej opcji powoduje, że zostaną dopasowane pakiety idące w obu kierunkach.
- Możliwe stany
- INVALID - pakiet nie należy do żadnego znanego połączenia.
- NEW - pakiet rozpoczyna nowe połączenie
- ESTABLISHED - pakiet należy do istniejącego połączenia
- RELATED - pakiet rozpoczyna połączenie powiązane z istniejącym
- SNAT - wirtualny stan oznaczający, że oryginalny adres źródłowy pakietu jest inny niż adres docelowy odpowiedzi (czyli jest SNATowany).
- DNAT - wirtualny stan oznaczający, że oryginalny adres docelowy pakietu jest inny niż adres źródłowy odpowiedzi (czyli jest DNATowany).
- Możliwe statusy
- NONE - żaden z poniższych.
- EXPECTED - to połączenie jest spodziewane, np. zostało przewidziane przez moduł pomocniczy conntrack.
- SEEN_REPLY - conntrack zaobserwował pakiety idące w obu kierunkach tego połączenia
- ASSURED - wpis w tablicy conntrack nie powinien być nigdy przedwcześnie skasowany.
- CONFIRMED - połączenie jest potwierdzone, rozpoczynający pakiet opuścił lokalną maszynę
- Uwagi
- Jeżeli nie ma żadnego NATowania, to zachodzi:
- --ctorigsrc 192.168.0.45 i --ctrepldst 192.168.0.45 dopasują te same pakiety
- --ctorigdst 10.0.0.10 i --ctreplsrc 10.0.0.10 dopasują te same pakiety
- analogicznie zachodzi dla opcji dopasowujących numery portów
- Jeżeli używany jest NAT, to we wszystkich tablicach prócz raw za pomocą tego modułu można dopasowywać pakiety na podstawie rzeczywistych adresów, z których pakiety pochodzą i na które zostaną wysłane.
- Przykłady
Ustawienia NAT:
iptables -t nat -A PREROUTING -d 192.168.100.10 -j DNAT --to-destination 10.168.100.10 # 1 iptables -t nat -A POSTROUTING -s 192.168.100.10 -j SNAT --to-source 10.168.100.10 # 2
Dla powyższych ustawień NAT:
iptables -A FORWARD -m conntrack --ctorigdst 192.168.100.10 # 3
- Powyższa reguła dopasuje pakiety, które idą w kierunku 10.168.100.10 i podlegają DNAT oraz pakiety powracające
iptables -A FORWARD -m conntrack --ctorigdst 192.168.100.10 --ctdir REPLY # 4
- Powyższa reguła dopasuje pakiety z reguły (3), które idą w kierunku powrotnym.
iptables -A FORWARD -m conntrack --ctorigdst 192.168.100.10 ! --ctstate DNAT # 5
- Powyższa reguła dopasuje pakiety, które idą w kierunku 192.168.100.10 i nie są DNATowane. Sytuacja taka może jedynie mieć miejsce dla pakietów generowanych lokalnie, ponieważ takie pakiety nie podlegają (1), ale w tedy nie są widziane w łańcuchu FORWARD. Dlatego ta reguła może dopasować tylko pakiety należące do połączeń nawiązanych przed dodaniem reguły (1) do firewalla.
iptables -A FORWARD -m conntrack --ctorigsrc 192.168.100.10 # 6
- Powyższa reguła dopasuje pakiety, których oryginalnym adresem źródłowym jest 192.168.100.10. Pakiety te będą należeć do połączeń nawiązywanych przez hosta 192.168.100.10.
-m cpu
[edytuj]-m dccp
[edytuj]-m dscp
[edytuj]-m ecn
[edytuj]-m esp
[edytuj]-m hashlimit
[edytuj]-m helper
[edytuj]Moduł ten pozwala dopasować pakiet na podstawie modułu conntrack, który śledzi połączenie, do którego należy ten pakiet. Moduł ten posiada jedną opcję:
- [!] --helper napis - definiuje, który moduł conntrack ma być sprawdzony. Np. "ftp" dopasuje moduł nf_conntrack_ftp odpowiadający za śledzenie połączeń ftp. Jeżeli usługa działa na innym porcie niż standardowy (21) można dodać numer portu w postaci "-nr", np. "ftp-2121".
- Przykłady
iptables -A FORWARD -m helper --helper ftp -j ACCEPT
-m iprange
[edytuj]Moduł ten pozwala na dopasowanie pakietu na podstawie zadanego zakresu adresów IP. Moduł ten posiada dwie opcje:
- [!] --src-range od[-do] - dopasowuje pakiet na podstawie przynależności adresu źródłowego do zadanego zakresu.
- [!] --dst-range od[-do] - dopasowuje pakiet na podstawie przynależności adresu docelowego do zadanego zakresu.
- Uwagi
- Należy podawać pełne zakresy adresów IP, zapis niekompletny jest uzupełniany zerami, np. 192 to 192.0.0.0
- Zakres dla którego pierwszy adres IP jest większy od drugiego nie dopasuje żadnego adresu.
- Przykłady
iptables -A FORWARD -m iprange --src-range 192.168.1.10-192.168.1.20 -j ACCEPT
Dopasowuje pakiety z hostów z zakresu od 192.168.1.10 do 192.168.1.20 (włącznie).
-m ipws
[edytuj]-m length
[edytuj]Moduł ten pozwala na dopasowanie pakietu na postawie długości ładunku warstwy 3. Moduł ten posiada jedną opcję:
- [!] --length długość1[:długość2] - dopasowuje długość zawartości pakietu IP.
- Przykłady
iptables -A FORWARD -m length --length 0 -j LOG --log-prefix 'fwl_test'
Dopasowuje pakiety nie zawierające danych (a jedynie nagłówek IP).
-m limit
[edytuj]-m mac
[edytuj]Moduł ten pozwala na dopasowanie źródłowego adres MAC w ramce ethernetowej zawierającej analizowany pakiet IP. Moduł ten posiada tylko jeden parametr:
- [!] --mac-source XX:XX:XX:XX:XX - dopasowuje źródłowy adres MAC. Obsługiwane są małe i wielkie litery w zapisie szesnastkowym
- Uwagi:
- Nie ma sensu analizować docelowego adresu MAC w iptables, ponieważ jeżeli pakiet jest analizowany przez iptables, to znaczy że jest przetwarzany przez podsystem IP, a więc docelowym adresem MAC był adres lokalnego hosta.
- Wyjątkiem od powyższej zasady są mosty sieciowe, jednak w tym przypadku o wiele elastyczniejszym narzędziem jest ebtables.
- W celu filtrowania ruchu na poziomie ARP należy natomiast użyć arptables
-m mark
[edytuj]Moduł ten pozwala na dopasowanie pakietu na podstawie znacznika przypisanego temu pakietowi (opis znacznika znajduje się przy opisie celu MARK). Moduł ten posiada tylko jeden parametr:
- [!] --mark wartość[/maska] - specyfikuje dopasowywaną wartość znacznika oraz maskę. Znacznik pakietu jest najpierw poddawany operacji AND z maską, a potem porównywany z podaną wartością (wartość == znacznik & maska). Domyślną wartością maski jest 0xFFFFFFFF.
- Przykłady
iptables -A FORWARD -m mark --mark 1/1 -j ACCEPT
- Dopasowuje pakiety, które mają ostatni bit znacznika ustawiony na 1.
iptables -A FORWARD -m mark --mark 1/7 -j ACCEPT
- Dopasowuje pakiety, dla których znacznik % 8 == 1 (czyli binarnie znacznik kończy się ciągiem 001).
iptables -A FORWARD -m mark --mark 0x10000/0x10000 -j ACCEPT
- Dopasowuje pakiety, dla których znacznik ma 16 bit (licząc od 0) ustawiony na 1.
-m multiport
[edytuj]Moduł ten pozwala na dopasowanie pakietu na podstawie numeru portu. W przeciwieństwie do --{d|s}port pozwala na specyfikowanie maksymalnie do 15 portów w jednej regule. Moduł ten może zostać użyty tylko razem z opcją -p tcp lub -p udp. Dostępne opcje:
- [!] --source-ports --sports port[,port|,port:port]... - dopasowuje pakiet, jeżeli port źródłowy znajduje się wśród wymienionych (lub w jednym z wymienionych zakresów) portów. Poszczególne porty i zakresy portów są rozdzielone przecinkiem, a separatorem w zakresie jest dwukropek. Zakres portów liczony jest jako dwa porty w ogólnej liczbie specyfikowanych portów.
- [!] --destination-ports --dports port[,port|,port:port]... - dopasowuje pakiet, jeżeli port docelowy znajduje się wśród wymienionych (lub w jednym z wymienionych zakresów) portów. j.w.
- [!] --ports port[,port|,port:port]... - dopasowuje pakiet, jeżeli port docelowy lub źródłowy znajduje się wśród wymienionych (lub wymienionych zakresów) portów.
- Przykłady
iptables -A FORWARD -p udp -m multiport --dports 33434:33494,44444:44504 -j ACCEPT
- Dopasowuje pakiety, które prawdopodobnie zostały wysłane przez hosta w wyniku użycia poleceń traceroute, lub tracepath.
-m odf
[edytuj]-m owner
[edytuj]Dopasowuje pakiet na podstawie właściciela gniazda dla lokalnie wygenerowanych pakietów. Te dopasowanie może zostać użyte jedynie w łańcuchach OUTPUT i POSTROUTING. Pakiety przekazywane nie mają przyporządkowanego gniazda. Pakiety wygenerowane przez jądro posiadają gniazdo, ale zwykle nie posiadają właściciela. Opcje modułu:
- [!] --uid-owner użytkownik|UID[-UID] - dopasowuje pakiet na podstawie właściciela gniazda, z którym powiązany jest pakiet. Właśiciel może zostać podany jako nazwa użytkownika (w tedy zostanie sprawdzony plik /etc/passwd w celu znalezienia UID), lub można bezpośrednio podać UID (lub zakres UID).
- [!] --gid-owner gupa|GID[-GID] - dopasowuje pakiet na podstawie grupy właściciela gniazda, z którym powiązany jest pakiet. Grupa może zostać podana jako nazwa grupy (w tedy sprawdzany jest plik /etc/groups w celu znalezienia GID), lub można bezpośrednio podać GID (lub zakres GID).
- [!] --socket-exists - dopasowuje pakiet, jeżeli istnieje gniazdo z którym powiązany jest pakiet.
- Uwagi
- UID/GID właściciela gniazda może nie być UID/GID procesu, który używa tego gniazda. Jest to związane z istnieniem wywołań systemowych setuid i setgid, które pozwalają procesowi na zmianę UID i GID w czasie działania. W ten sposób może się zdarzyć (a nawet bardzo często się zdaża), że aplikacja po zainicjowaniu wszystkich komponentów (i np. otwarciu gniazd sieciowych) zmienia UID na mniej uprzywilejowane. Bardzo często działają w ten sposób różne demony systemowe, które muszą mieć uprawnienia roota, aby otworzyć port <1024, ale po jego otwarciu przyjmują bezpieczniejsze uprawnienia nieuprzywilejowanego użytkownika.
- Przykłady
iptables -A OUTPUT -p tcp --sport 32768: -m owner --uid-owner 1000-2000 -j ACCEPT
- Powyższa reguła pozwala zwykłym użytkownikom otwierać porty efemeryczne powyżej 32768. Zwykli użytkownicy w większości dystrybucji (ale nie wszystkich!) mają UID kolejno od 1000 wzwyż.
iptables -A OUTPUT -p tcp --syn -m owner --uid-owner 0 -j LOG --log-prefix 'FWX'
- Powyższa reguła loguje wszystkie próby nawiązywania połączeń TCP przez gniazda, których właścicielem jest root.
-m physdev
[edytuj]Moduł ten służy do dopasowywania pakietów przechodzących przez interfejs typu bridge. Interfejs mostowy działa na podobnej zasadzie jak przełącznik sieciowy - przekazuje ramki Ethernet pomiędzy portami interfejsu mostowego. Opcje akceptowane przez moduł physdev
- [!] --physdev-in interfejs[+] - dopasowuje pakiety, które weszły przez dany port interfejsu mostowego. Dopasowanie dotyczy wszystkich pakietów, które wchodzą przez dany port mostu - nie tylko te pakiety, które będą przekazywane przez most, ale również te, które będą routowane.
- [!] --physdev-out interfejs[+] - dopasowuje pakiety, które będą przekazywane przez dany port interfejsu mostowego. jw.
- [!] --physdev-is-in - dopasowuje pakiety, które przybyły przez port interfejsu mostu.
- [!] --physdev-is-out - dopasowuje pakiety, które wyjdą przez port interfejsu mostu.
- [!] --physdev-is-bridged - dopasowuje pakiety, które faktycznie podlegają przekazaniu przez most sieciowy.
Przykład użycia modułu physdev - konfiguracja mostu:
brctl addbr br0 brctl addif br0 eth0 brctl addif br0 eth1 ip link set dev eth0 up ip link set dev eth1 up ip link set dev br0 up
Przykłady reguł:
iptables -A FORWARD -m state --physdev-in eth0 -j ACCEPT
- Dopasowuje pakiety, które weszły przez interfejs eth0
iptables -A FORWARD -m state --physdev-in eth0 --physdev-is-bridged -j ACCEPT
- Dopasowuje pakiety, które weszły przez interfejs eth0 i będą mostowane (a nie rutowane)
iptables -A FORWARD -m state --physdev-in eth0 ! --physdev-is-bridged -j ACCEPT
- Dopasowuje pakiety, które weszły przez interfejs eth0 i będą rutowane. Reguła ta jest podobna do poniższej:
iptables -A FORWARD -i br0 -j ACCEPT
- Ta reguła jest równoważna poniższej regule (zakładając, że w systemie istnieją tylko dwa interfejsy eth):
iptables -A FORWARD -m physdev --physdev-in eth+ ! --physdev-is-bridged -j ACCEPT
-m pkttype
[edytuj]Moduł ten dopasowuje pakiet na podstawie typu ramki warstwy łącza. Moduł ten posiada jedną opcję:
- [!] --pkt-type unicast|broadcast|multicast - dopasowuje pakiet należący do podanego typu.
-m policy
[edytuj]-m quota
[edytuj]Moduł ten dopasowuje pakiet na podstawie zdefiniowanej quoty (ograniczenia zasobów). Zasada działania modułu jest następująca: podczas dodawania reguły do iptables ustawiana jest pewna wartość quoty w bajtach, za każdym razem gdy reguła dopasowuje pakiet quota jest zmniejszana o rozmiar tego pakietu. Gdy quota spadnie do 0, moduł ten w danej regule przestaje dopasowywać pakiety. Moduł ten posiada jedną opcję:
- --quota bajty - ustawia quotę na zadaną liczbę bajtów.
- Przykłady
iptables -A INPUT -p tcp --dport 22 --syn --quota 2000 -j ACCEPT
- Powyższa reguła pozwala na nawiązanie tylko ograniczonej liczby połączeń SSH, ponieważ po wyczerpaniu limitu 2000 bajtów na pakiety SYN, reguła przestaje dopasowywać.
-m rateest
[edytuj]-m realm
[edytuj]-m recent
[edytuj]Moduł ten służy do dopasowywania pakietów na podstawie częstotliwości ich obserwacji (lub zliczeń). Opcje akceptowane przez ten moduł:
- --name lista - nazwa listy, na której będą przechowywane dane .
- --rdest - zapamiętywane na liście będą adresy docelowe.
- --rsource - zapamiętywane na liście będą adresy źródłowe.
- [!] --set - ta opcja zawsze dopasowuje, dodaje adres IP do listy.
- [!] --rcheck - ta opcja dopasowuje pakiet jeżeli adres IP znajduje się na liście.
- [!] --remove - ta opcja dopasowuje pakiet jeżeli adres IP znajduje się na liście, po czym usuwa adres IP z listy.
- [!] --update - ta opcja dopasowuje pakiet jeżeli adres IP znajduje się na liście, aktualizuje czas poperzedniej obserwacji adresu IP
- [!] --seconds sekundy - ta opcja w połączeniu z rcheck i update ogranicza dopasowanie do obserwacji adresu IP w ciągu ostatnich sekundy sekund.
- [!] --hitcount trafienia - ta opcja w połączeniu z rcheck i update ogranicza dopasowanie do obserwacji adresu IP na conajmniej trafienia razy.
- --rttl - ta opcja w połączeniu z rcheck i update ogranicza dopasowanie pod warunkiem zgadzania się TTL i źródłowego adresu IP z tym, który dodany został do listy jako pierwszy. Ta opcja ma za zadanie przeciwdziałać możliwości ataku DoS przeciw modułowi recent z wykorzystaniem fałszowania adresów źródłowych (ang. address spoofing).
Dodatkowo moduł jądra xt_recent posiada następujące parametry, które można podać podczas ładowania modułu (w linii poleceń programu modprobe, lub na stałe w pliku /etc/modprobe.conf).
- ip_list_tot=liczba - ustawia maksymalny rozmiar tablicy do przechowywania adresów IP na liczba. Parametr ten powinien być typu uint (ang. unsigned integer). Domyślnie 100.
- ip_pkt_list_tot=liczba - ustawia maksymalną liczbę pamiętanych pakietów dla danego adresu IP (max. 255) (uint). Domyślnie 20.
- ip_list_hash_size=liczba - ustawia rozmiar tablicy mieszającej służącej do wyszukiwania adresów IP. Ten parametr powinien być potęgą liczby 2, inaczej zostanie zaokrąglony w dół do najbliższej potęgi 2 (uint). Wartość 0 oznacza, że rozmiar tablicy zostanie obliczony na podstawie ip_pkt_list_tot. Domyślnie 512.
- ip_list_perms=liczba - liczba ósemkowa definiująca uprawnienia do plików /proc/net/xt_recent/* (uint). Domyślnie 644 (odczyt/zapis dla właściciela, odczyt dla pozostałych).
- ip_list_uid=liczba - UID (identyfikator liczbowy użytkownika) właściciela plików /proc/net/xt_recent/* (uint)
- ip_list_gid=liczba - GID (identyfikator liczbowy grupy) właściciela plików /proc/net/xt_recent/* (uint)
Listy adresów IP są unikatowe w obrębie całego Netfilter. Oznacza to, że do jednej listy można odwoływać się w różnych tablicach/łańcuchach. W przypadku zbyt dużych wartości parametrów ip_list_tot oraz ip_pkt_list_tot możliwe jest przeprowadzenie ataku DoS na ten moduł (ponieważ listy będą zajmować zbyt dużo pamięci RAM). Ostatnie 3 parametry służą do określenia, którzy użytkownicy mogą podejrzeć zawartość list w systemie plików proc, lub nawet zmodyfikować ich zawartość. Do modyfikacji zawartości list służą następujące polecenia:
- `echo +adres >/proc/net/xt_recent/lista` - dodaje adres ip do listy
- `echo -adres >/proc/net/xt_recent/lista` - usuwa adres ip z listy
- `echo / >/proc/net/xt_recent/lista` - kasuje zawartość listy
- Przykłady
iptables -A INPUT -m state --state NEW -p tcp -m recent --name scan --set # 1 iptables -A INPUT -m state --state NEW -p tcp -m recent --name scan --update --seconds 10 --hitcount 10 -j DROP # 2
Reguła (1) dodaje do listy adresy IP, które próbują nawiązać połączenie TCP (na dowolny port). Reguła (2) aktualizuje listę pakietów i odrzuca kolejne pakiety, jeżeli w ciągu ostatnich 10 sekund pojawiło się więcej niż 10 pakietów pochodzących z jednego adresu IP. Te dwie reguły pozwalają na stworzenie prymitywnej obrony przed skanowaniem portów za pomocą pakietów TCP SYN, jednak ustawienie ich na np. serwerze WWW spowoduje prawdopodobnie katastrofę (w przypadku protokołu HTTP możliwe jest pojawianie się bardzo wielu krótkich połączeń z jednego adresu IP). Tak samo katastrofę spowoduje dodanie reguł w tablicy filter, które łapią wszystkie pakiety danego połączenia, a nie tylko 1.
iptables -A INPUT -p icmp --icmp-type echo-request -m recent --name knockknock --set # 1 iptables -A INPUT -p icmp --icmp-type echo-request -m recent --name knockknock --update # 2 iptables -A INPUT -p tcp --dport 22 -m recent --name knockknock --rcheck --seconds 5 --hitcount 15 -j ACCEPT # 3 iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT # 4
Reguła (1) dodaje do listy adres IP, który pinguje hosta. Reguła (2) aktualizuje listę pakietów, a reguła (3) wpuszcza połączenia SSH pod warunkiem, że w poprzedzających 5 sekundach otrzymano z danego adresu IP 20 pingów. Reguła (4) umożliwa wpuszczenie pozostałych pakietów nawiązanego połączenia SSH niezależnie od stanu listy knocknock. Zestaw tych 4 reguł daje w wyniku firewall, w którym należy najpierw w odpowiedni sposób zapukać, aby móc wejść przez port 22. W zależności od pozostałych reguł korzystniejsze pod względem wydajności mogłoby być przeniesienie reguły (4) na początek, nie mogłaby to jednak być reguła postaci -m state --state ESTABLISHED -j ACCEPT, ponieważ połknęłaby ona pingi.
iptables -A FORWARD -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT # 1 iptables -A FORWARD -p tcp --dport 22 -m recent --name forcessh --rdest --set # 2 iptables -A FORWARD -p tcp --dport 22 -m recent --name forcessh --rdest --update --seconds 120 --hitcount 5 -j DROP # 3
Reguła (1) przepuszcza nawiązane połączenia. Reguła (2) dodaje do listy forcessh docelowy adres IP, na który następuje połączenie, natomiast reguła (3) odrzuca wszystkie kolejne połączenia, jeżeli nastąpiło więcej niż 5 prób połączenia w ciągu ostatnich 2 minut. Taka konfiguracja pozwala bronić serwer SSH przed atakiem bruteforce za pomocą botnetu. Serwer OpenSSH posiada opcje pozwalające na blokowanie błędnych prób logowania, jednak zabezpieczenie to nie sprawdzi się, jeżeli każda próba logowania będzie pochodzić z innego adresu IP.
-m sctp
[edytuj]-m set
[edytuj]-m socket
[edytuj]-m state
[edytuj]Moduł dopasowujący state pozwala na dopasowanie na podstawie następujących stanów (związanych z działaniem mechanizmu conntrack) opisanych poniżej: NEW, ESTABLISHED, RELATED, INVALID. Moduł ten posiada tylko jedną opcję:
- [!] --state stan[,...] - dopasowuje pakiety, których stan jest zgodny ze specyfikowaną wartością.
- Opis stanów
- NEW - stan dla pierwszego pakietu pozwalającego na poprawne nawiązanie połączenia dla danego protokołu stanowego, lub pierwszy pakiet danej transmisji protokołu bezstanowego. Przykłady:
- pakiet TCP z ustawioną flagą SYN będzie miał stan NEW
- pakiet ICMP z ustawionym typem wiadomości 8 (echo-request) będzie miał stan NEW
- pakiet UDP z zapytaniem DNS będzie miał stan NEW, ponieważ jest pierwszym pakietem idącym w danym kierunku
- ESTABLISHED - stan dla pakietów należących do nawiązanego połączenia. Nie jest to równoważne z połączeniem protokołu stanowego (patrz przykład).
- pakiet TCP z ustawionymi flagami SYN+ACK będący odpowiedzią na odpowiedni pakiet z flagą SYN ma stan ESTABLISHED pomimo, że według protokołu TCP połączenie jeszcze nie jest otwarte (a jedynie pół-otwarte)
- dowolny pakiet TCP z ustanowionego połączenia ma stan ESTABLISHED
- pakiet UDP z odpowiedzią DNS będzie miał stan ESTABLISHED ponieważ jest to pakiet powracający ze znanego kierunku
- pakiet ICMP z odpowiedzią echo-reply na ICMP echo-request będzie miał stan ESTABLISHED
- RELATED - stan dla pierwszego pakietu powiązanego z innym nawiązanym połączeniem. Każdy kolejny pakiet tego połączenia będzie miał stan ESTABLISHED. Przykłady:
- pakiet TCP z flagą SYN nawiązujący połączenie pasywne FTP będzie miał stan RELATED. Aby tak się stało musi być załadowany w jądrze moduł nf_conntrack_ftp (albo jądro skompilowane z opcją NF_CONNTRACK_FTP).
- pakiet ICMP destination-unreacheable z odpowiedzią na wysłany pakiet TCP SYN na nieistniejący adres będzie miał stan RELATED
- INVALID - pakiet nie należący do żadnego poprawnego połączenia. Przykłady:
- pakiet TCP z ustawionymi flagami SYN+ACK nie będący odpowiedzią na próbę nawiązania połączenia TCP
- pakiet ICMP z odpowiedzią ICMP echo-reply na nieistniejące zapytanie echo-request
- Przykłady
iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT # 1 iptables -A INPUT -m state --state RELATED -j ACCEPT # 2 iptables -A INPUT -m state --state NEW -p tcp --dport http -j ACCEPT # 3
Powyższa konfiguracja firewalla zadziała następująco:
- Ponieważ domyślną polityką w łańcuchu OUTPUT jest ACCEPT firewall wypuszcza wszystkie pakiety wychodzące
- Reguła 1 wpuszcza wszystkie pakiety należące do nawiązanych połączeń (zarówno wchodzących jak i wychodzących)
- Reguła 2 wpuszcza tylko pakiety należące do połączeń powiązanych z istniejącymi
- Reguła 3 wpuszcza tylko pakiety TCP pozwalające nawiązać połączenie na port 80.
Ponieważ stan NEW dla protokołu TCP oznacza pakiet z ustawioną wyłącznie flagą SYN, więc reguła ta nie wpuści np. pakietów służących do skanowania portów za pomocą techniki drzewka bożonarodzeniowego (czyli pakiety z zaświeconymi flagami: FIN, URG, PSH).
Ze względów wydajnościowych powyższa kolejność reguł jest znacznie lepsza, niż np. 3,2,1 - pakietów nawiązujących połączenia jest o kilka rzędów wielkości mniej, niż pakietów należących do tych połączeń. Jeżeli nie konfliktuje to z innymi elementami zapory (np. modułem ipp2p) należy reguły 1 i 2 umieszczać jak najbliżej początku łańcucha.
-m statistic
[edytuj]Moduł ten pozwala na dopasowanie pakietów na podstawie statystycznej. Moduł ten posiada 2 tryby działania specyfikowane za pomocą parametru --mode. Opcje modułu:
- --mode random|nth - tryb dopasowania. Tryb random oznacza, że pakiety będą dopasowywane losowo, a nth dopasowywanie co n-tego pakietu.
- --probability p - prawdopodobieństwo dopasowania pakietu dla trybu random. Liczba z przedziału 0 do 1.
- --every n - specyfikuje liczbę n dla trybu nth.
- --packet k - ustawia wartość startową licznika dla trybu nth. 0 <= k <= n-1.
- Przykłady
iptables -A FORWARD -i eth0 -m statistic --mode random --probability 0.1 -j LOG --log-prefix 'stat_probe'
Pozwala na logowanie 10% pakietów wybieranych losowo.
iptables -A FORWARD -i eth0 -m statistic --mode random --probability 0.001 -j DROP
Pozwala symulować połączenie gubiące 0,1% pakietów.
-m string
[edytuj]-m tcp
[edytuj]-m tcpmss
[edytuj]Moduł ten pozwala na dopasowanie MSS (ang. Maximum Segment Size) w nagłówku TCP. Użycie tego modułu ma jedynie sens dla pakietów z ustawioną flagą SYN lub SYN/ACK, ponieważ tylko w tym momencie ustawia się MSS. Moduł ten posiada tylko jedną opcję:
- [!] --mss wartość1[:wartość2] - dopasowuje MSS o zadanej wartości.
- Przykłady
iptables -t mangle -A POSTROUTING -o eth1 -p tcp --syn -m tcpmss --mss 1461:9000 -j LOG
- Loguje pakiety z flagą SYN, w których zdalny host ustawił pożądaną wielkość segmentu na większą niż 1460 bajtów. W przypadku sieci Ethernet bez włączonej funkcji Jumbo Frame, gdzie MTU zazwyczaj wynosi 1500, takie połączenia mogą sprawiać problemy.
- Uwagi
- Zobacz także cel TCPMSS, który pozwala na zmianę tego parametru w pakiecie.
-m time
[edytuj]Moduł ten pozwala na dopasowanie pakietów na podstawie czasu ich przybycia do systemu. Moduł ten obsługuje następujące opcje:
- --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] - dopasowuje pakiet, który przyjedzie po zadanej dacie. Data jest specyfikowana zgodnie ze standardem ISO 8601 (z "T"). Najwcześniejszą obsługiwaną datą jest 1970-01-01T00:00:00 (początek epoki uniksa), a najpóźniejszą 2038-01-19T04:17:07 (moment przepełnienia 32bitowego zapisu sekund od epoki uniksa). W przypadku nie podania tej opcji domyślną wartością jest 1970-01-01T00:00:00.
- --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] - dopasowuje pakiet, który przyjdzie przed zadaną datą. Specyfikacjia daty jw. W przypadku nie podania tej opcji domyślną wartością jest 2038-01-19T04:17:07.
- --timestart hh:mm[:ss] - dopasowuje pakiet, który przyjdzie po zadanym czasie w ciągu dnia. W zapisie czasu można używać wiodących zer - takie liczby dalej będą interpretowane dziesiętnie.
- --timestop hh:mm[:ss] - dopasowuje pakiet, ktory przyjedzie przed zadanym czasem w ciągu dnia. Uwagi jw.
- [!] --monthdays dzień[,...] - dopasowuje pakiet w wybrane dni miesiąca. Dni miesiąca są numerowane od 1. Dopasowanie 31-dnia miesiąca zadziała tylko w miesiącach, które mają 31 dni (analogicznie 29 luty zostanie dopasowany tylko w latach przestępnych).
- [!] --weekdays dzień[,...] - dopasowuje pakiet w wybrane dni tygodnia. Dni można podawać za pomocą 3literowych skrótów angielskich nazw Mon, Tue, Wed, Thu, Fri, Sat, Sun, lub liczb 1-7 (1-poniedziałe, 7-niedziela).
- --utc - wymusza interpretowanie podanych dat/czasów jako UTC.
- --localtz - wymusza interpretowanie podanych dat/czasów jako czas lokalny maszyny (zgodny z ustawioną w systemie strefą czasową). Opcja domyślna.
- Przykłady
iptables -A FORWARD -s 192.168.0.12 -m time --timestop 19:30 -j DROP
- Blokuje ruch sieciowy po wieczorynce.
iptables -A FORWARD -m time --monthdays 27 --timestart 9:00 --timestop 17:00 -j ACCEPT
- Przepuszcza ruch sieciowy dzień przed wypłatą w godzinach 9-17 ;).
iptables -A FORWARD -s 192.168.0.12 -m time --weekdays Sat,Sun --timestart 18:00 --timestop 19:30 -j ACCEPT
- W weekendy reglamentujemy dostęp do internetu na 1,5h od 18.
iptables -A FORWARD -m time --datestart 2009-12-24 --datestop 2009-12-27 -j DROP
- W od Wigilii do końca Bożego Narodzenia blokujemy.
- Uwagi
- Daty i godziny są uzupełniane do najniższej możliwej wartości w opcjach -start i do najwyżej możliwej wartości w opcjach -end. Oznacza to, że opcja --datestart 2010 jest równoważna --datestart 2010-01-01T00:00:00, a --datestop 2010 jest równoważna --datestop 2010-12-31T23:59:59.
- Opcje -stop dopasowują łącznie - tzn. opcja --timestop 13:00 dopasowuje pakiety do godziny 13:00:59, a nie 13:00.
-m tos
[edytuj]-m ttl
[edytuj]Moduł ten pozwala na dopasowanie wartości TTL pakietów IP. Posiada on następujące opcje:
- --ttl-eq wartość - dopasowuje pakiet, jeżeli jego TTL jest równe podanej wartości.
- --ttl-lt wartość - dopasowuje pakiet, jeżeli jego TTL jest mniejsze od podanej wartości.
- --ttl-gt wartość - dopasowuje pakiet, jeżeli jego TTL jest większe od podanej wartości.
- Przykłady
iptables -A FORWARD -i eth0 -m ttl --ttl-eq 127 -j DROP iptables -A FORWARD -i eth0 -m ttl --ttl-eq 63 -j ACCEPT
Pierwsza reguła odrzuci wszystkie pakiety wchodzące przez eth0 i posiadające wartość TTL 127 (w sieci lokalnej będzie to TTL większości systemów operacyjnych z rodziny Windows), a druga przepuści te posiadające TTL 63 (analogicznie do wcześniejszej uwagi będą to prawdopodobnie komputery z Linuksem).
-m u32
[edytuj]Moduł ten pozwala na ekstrakcję 4 bajtowych paczek z dowolnego miejsca pakietu i porównywanie ich z zadanymi parametrami. Moduł ten posiada tylko 1 opcję:
- [!] --u32' testy - dopasowuje pakiet na podstawie zdefiniowanych testów. Testy te są specyfikowane za pomocą specjalnego wbudowanego minijęzyka o składni opisanej poniżej.
- Składnia języka testów w postaci BNF
Pooniżej przedstawiona jest składnia języka testów w postaci BNF na podstawie strony man programu iptables.
testy := położenie "=" wartość | testy "&&" położenie "=" wartość wartość := zakres | wartość "," zakres zakres := liczba | liczba ":" liczba położenie := liczba | położenie operator liczba operator := "&" | "<<" | ">>" | "@"
- Uwagi
- Każda liczba n jest interpretowana tak samo jak zakres n:n. Każdy zakres n:m jest interpretowany jako włączny ( >= n i <= m).
- Operatory "&", "<<", ">>", "&&" mają takie samo znaczenie jak w języku C (bitowe AND, przesunięcie bitowe w lewo, przesunięcie bitowe w prawo, logiczne AND).
- Operator "@" oznacza użycie obliczonego położenia jako nowego przesunięcia (od tego momentu położenie na lewo od operatora to 0).
- Wszystkie operacje są wykonywane od lewej do prawej, nie ma priorytetów operatorów.
- Wyjście poza obszar pakietu oznacza, że reguła nie zostanie dopasowana.
- Przykłady
--u32 "6 & 0xFF = 1"
- Powyższa reguła sprawdza, czy protokołem warstwy 4 jest ICMP.
- Położenie 6 oznacza, że pobrane są 4 bajty o numerach 6-9.
- Operacja logiczna & 0xFF wybiera ostatni bajt (bajty są numerowane zgodnie z BigEndian!).
- Operacja = porównuje ten ostatni bajt z liczbą 1 (numer protokołu ICMP).
--u32 "6 & 0xFF = 6 && 4 & 0x3FFF = 0"
- Powyższa reguła sprawdza, czy protokołem warstwy 4 jest TCP oraz czy pakiet jest sfragmentowany.
- Pierwsza połowa wyrażenia ("6 & 0xFF = 6") działa identycznie jak poprzednio.
- Położenie 4 oznacza, że pobrane zostaną bajty 4-7.
- Operacja logiczna & 0x3FF wybiera ostatnie 14 bitów z bajtów 6-7. Pięć ostatnich bitów bajtu 6 oraz cały bajt 7 zawierają przesunięcie fragmentu (ang. fragment offset). Trzeci bit bajtu 6 to flaga MF (ang. more fragments) oznaczająca, że będą kolejne fragmenty tego pakietu.
- Operacja = porównuje wybrane 14 bitów z wartością 0. Tylko dla niesfragmentowanego pakietu te 14 bitów jest wyzerowana ponieważ, jeżeli:
- pakiet jest pierwszym fragmentem sfragmentowanego pakietu to zachodzi: "4 & 0x3FFF = 0x2000" (flaga MF jest ustawiona, a przesunięcie fragmentu wynosi 0).
- pakiet jest kolejnym fragmentem zachodzi "4 & 0x3FFF = 0x2001:0x3FFF" (flaga MF jest ustawiona, a przesunięcie fragmentu jest większe od 0).
- pakiet jest ostatnim fragmentem zachodzi "4 & 0x3FFF = 0x0001:0x1FFF" (flaga MF nie jest ustawiona, a przesunięcie fragmentu jest większe od 0).
--u32 "6 & 0xFF = 6 && 4 & 0x3FFF = 0 && 0 >> 22 & 0x3C @ 12 >> 26 & 0x3C @ 8 = 1,2,5,8"
- Powyższa reguła sprawdza, czy bajty 8-11 ładunku warstwy 4 (czyli za nagłówkiem TCP) są którejść z liczb 1,2,5,8.
- Pierwsze dwie części wyrażenia działają identycznie jak w poprzednich przykładach