Debugowanie reguł iptables via target TRACE

Spis treści

Linux'owy firewall w postaci iptables może czasami mieć zdefiniowanych sporo reguł. W takim gąszczu jest czasem ciężko się odnaleźć. Bywa zwykle tak, że dodając kolejną regułę chcemy przyblokować szereg pakietów, a mimo to przechodzą one przez zaporę jak gdyby nigdy nic. W takim przypadku zaczyna się mozolne przeszukiwanie reguł w iptables i próba ustalenia, którą z nich zaakceptowała interesujący nas pakiet. Nie musimy jednak głowić się aż tak, by w miarę szybko dociec jak te reguły przez filtr przechodzą i jak są przetwarzane. Możemy skorzystać z mechanizmu śledzenia reguł, który jest wbudowany bezpośrednio w iptables . Mowa oczywiście o target TRACE . W tym artykule zobaczymy jak przy pomocy TRACE ustalić, przez które reguły i łańcuchy przechodzi pakiet.

Kilka słów o target TRACE

Przede wszystkim, target TRACE może być wykorzystany tylko w tablicy raw . Chodzi o to, że zarówno w kierunku do maszyny jak i od niej, pakiety przechodzą pierw przez tę tablicę i śledzenie reguły musi się zacząć zaraz na samym początku. W przeciwnym razie ten proces nie miałby sensu. Każdy pakiet, który spełnia kryteria określone w takiej regule, zostanie zalogowany. Informacje w logu będą w formie TRACE: tablename:chainname:type:rulenum . Każdy wpis ma prefiks TRACE: , po którym mamy nazwę tablicy ( tablename ) i łańcucha w niej ( chainname ). Z kolei type może przyjąć wartość rule dla zwykłych reguł, return dla łańcuchów użytkownika oraz policy dla wbudowanych łańcuchów. Natomiast jeśli chodzi o rulenum , to jest to numer reguły w danym łańcuchu. Więcej informacji na temat target TRACE można znaleźć w man iptables-extensions.

Śledzenie reguł z target TRACE

Wszystkie te powyższe informacje będą nieco klarowniejsze, gdy rozpatrzymy sobie jakiś przykład. Jeśli mamy problemy z ogarnięciem przepływu reguł przez pusty filtr, to dobrze jest się zapoznać z tym poniższym diagramem:

iptables-przeplyw-pakietow-netfilter

Może nie wydaje się on zbyt skomplikowany ale nie uwzględnia on żadnych łańcuchów użytkownika, no i nie ma też w nim reguł, które mogą blokować ruch. Tak czy inaczej, jeśli już zbudowaliśmy swój firewall i przy jego rozbudowie coś nam nie gra, to najwyższy czas skorzystać z target TRACE . Jakiś czas temu, gdy bawiłem się kontrolą ruchu sieciowego na linux'ie, część z pakietów podczas testów nie trafiała do tych kolejek, do których powinna. Problemem było przepisywanie się znaczników, które były nakładane w kolejnych regułach mających target MARK . Minęło wtedy trochę czasu zanim ustaliłem przyczynę ale na pewno poszłoby mi o wiele szybciej, gdybym wiedział o target TRACE . Poniższy przykład będzie raczej banalny w porównaniu do kształtowania ruchu ale zawsze liczy się zasada działania, którą można odnieść do każdej sytuacji. Dodamy sobie regułę, która powinna blokować ruch przychodzący na port 21 (FTP):

# iptables -t filter -I tcp 5 -p tcp -m tcp --dport 21 -j DROP

Po dodaniu tej powyższej reguły, z "jakichś bliżej nieznanych" nam przyczyn, użytkownicy nie mogą się podłączyć do FTP'a. By zobaczyć jak działa śledzenie reguł w iptables dodajemy te dwie poniższe reguły do filtra:

# iptables -t raw -A OUTPUT -p tcp -m tcp --sport 21 -j TRACE
# iptables -t raw -A PREROUTING -p tcp -m tcp --dport 21 -j TRACE

Mają one za zadanie śledzić pakiety, które trafiają na port 21. Zarówno te przychodzące na maszynę, jak i te z niej wychodzące. Co się stanie jeśli teraz jakiś użytkownik spróbuje się podłączyć do FTP'a? W logu powinniśmy zanotować sporo komunikatów. Wyglądają one mniej więcej tak jak te na tej poniższej fotce:

target-trace-iptables-log-pakiet

Powyżej mamy 8 komunikatów. Z nich możemy wyczytać, że pakiet pochodzi z adresu 192.168.10.10 i miał dotrzeć do hosta o adresie 192.168.1.150. Był także przeznaczony na port 21/tcp. Pakiet miał ustawioną flagę SYN , zatem był to pakiet inicjujący połączenie. Pierwszy komunikat mówi nam, że ten pakiet przeszedł przez tablicę raw i jej łańcuch PREROUTING . Z kolei policy oznacza, że została zastosowana domyślna polityka wbudowanego łańcucha (cyfra nas nie interesuje). Wiemy, zatem, że pakiet przeszedł przez tablicę raw i żadna reguła nic z nim nie zrobiła.

Następnie mamy trzy komunikaty dotyczące tablicy mangle . Widzimy, że dwa z nich mają rule . Cyfry w tym przypadku oznaczają, że pakiet został dopasowany do reguły 1 i 4 w łańcuchu PREROUTING w tej tablicy. Z kolei w trzecim komunikacie znów mamy policy co oznacza, że pakiet został potraktowany zgodnie z polityką tego wbudowanego łańcucha. Cyfra 5 w tym przypadku nas nie interesuje. Czyli krótko mówiąc, pakiet przeszedł przez dwie reguły w tablicy mangle , które z nim coś zrobiły i został przesłany dalej.

Jako, że ten pakiet ma ustawioną flagę SYN , to jest to nowe połączenie, a te przechodzą tablicę nat . W logu mamy jeden komunikat dotyczący tej tablicy, który wskazuje na policy . Zatem pakiet został potraktowany zgodnie z polityką łańcucha PREROUTING w tablicy nat i został przesłany dalej.

Kolejny komunikat w logu informuje nas, że pakiet trafia ponownie do tablicy mangle , tym razem do łańcucha INPUT . Przechodzi przez niego, jako że mamy tutaj ponownie policy .

Ostatnie dwa komunikaty dotyczą tablicy filter . Pakiet po trafieniu do tej tablicy został dopasowany do 8 reguły w łańcuchu INPUT. W tym przypadku było to przekierowanie do łańcucha tcp . Następnie widzimy, że pakiet w tym drugim łańcuchu został dopasowany do 5 reguły. I na tym kończy się droga pakietu.

Mając informację na temat tego, gdzie zakończyła się droga pakietu, możemy odszukać tę regułę, bo przecie znamy tablicę, łańcuch oraz numer reguły. Możemy to zrobić przy pomocy polecenia iptables -t filter -nvL tcp --line-numbers :

target-trace-iptables-regula

Wyżej widzimy czarno na białym (właściwie to pomarańczowo na czarnym), że reguła numer 5 wskazuje na tę, którą dodaliśmy na początku artykułu. By umożliwić połączenie z FTP, trzeba ją usunąć lub zmienić.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.