Jak wyczyścić tablicę conntrack'a w debianie

Spis treści

Sporo użytkowników lunux'a, zwłaszcza dystrybucji debian, korzysta z własnych skryptów firewall'a aplikujących reguły iptables . Tego typu rozwiązanie ma jednak swoje wady i zalety. Niewątpliwie do zalet można zaliczyć brak dodatkowego oprogramowania obsługującego zaporę sieciową. Jeśli chodzi zaś o wady, to niestety cały skrypt trzeba sobie dobrze przemyśleć przed zaaplikowaniem. Ludzie często zapominają tutaj o śledzeniu połączeń przez kernel. To właśnie na podstawie wpisów w /proc/net/ip_conntrack lub /proc/net/nf_conntrack system wie, które pakiety należy na zaporze przepuścić, a które zablokować. Jeśli teraz dodajemy reguły do filtra iptables , to nowa polityka zapory nie będzie odnosić się do tych nawiązanych już połączeń, które są określone w tablicy conntrack'a. By się upewnić, że tego typu scenariusz nigdy nas nie spotka, musimy tę tablicę opróżnić.

Czy tablica conntrack'a powinna być czyszczona

Przede wszystkim, większość zapór sieciowych w linux'ch operuje na stanach połączeń, przykładowo NEW, ESTABLISHED, INVALID. W momencie, gdy jakiś host z sieci próbuje nawiązać połączenie z naszym serwerem, kernel umieszcza wpis w tablicy conntrack'a. Poniżej mamy dwa wpisy:

tcp      6 60 SYN_RECV src=192.168.10.100 dst=192.168.10.10 sport=59334 dport=443 src=192.168.10.10 dst=192.168.10.100 sport=443 dport=59334
tcp      6 432000 ESTABLISHED src=192.168.10.100 dst=192.168.10.10 sport=59334 dport=443 src=192.168.10.10 dst=192.168.10.100 sport=443 dport=59334 [ASSURED]

Mamy tutaj połączenie na port 443/tcp. W protokole TCP połączenia mają kilka faz. Wyżej widzimy, że serwer otrzymał pakiet synchronizacyjny ( SYN_RECV ) i po chwili połączenie zostało ustanowione ( ESTABLISHED ). Na tym porcie chcemy teraz założyć jakąś politykę, przykładowo, dostęp do serwera www zostanie odmówiony w określonych godzinach. Jeśli dodalibyśmy stosowne reguły do skryptu iptables i przeładowali zaporę, to tylko nowe żądania będą zrzucane. A co w przypadku osób mających aktywne sesje, np. pobierają one pliki z tego serwera? System nie odmówi im dostępu i nie przerwie transferu danych. Jeśli chcemy mieć pewność, że cały ruch do serwera przejdzie przez nowe reguły firewall'a, to musimy tę tablicę conntrack'a wyczyścić.

Czyszczenie tablicy conntrack'a

W różnych linux'ach czyszczenie tablicy może przebiegać nieco inaczej. Zależy to od możliwości zapisu plików /proc/net/ip_conntrack lub /proc/net/nf_conntrack . W OpenWRT mamy możliwość zapisu tych plików przy pomocy echo f . Niemniej jednak w debianie ta opcja odpada:

# ls -al /proc/net/*_conntrack
-r--r----- 1 root root 0 2016-06-05 11:46:07 /proc/net/ip_conntrack
-r--r----- 1 root root 0 2016-06-05 11:46:07 /proc/net/nf_conntrack

Nie wiem czemu w debianie nie da rady zapisać bezpośrednio tych plików ale w tej dystrybucji mamy narzędzia, które umożliwiają operowanie na tablicy conntrack'a. Te narzędzia zawarte są w pakiecie conntrack . Zainstalujmy zatem je sobie.

Ilość aktualnie śledzonych połączeń możemy odczytać poniższym poleceniem:

# conntrack -C
43

Liczba 43 wskazuje na ilość wpisów w tablicy i nie jest to ilość aktualnych połączeń. By opróżnić teraz całą tablicę śledzonych połączeń, wpisujemy w terminalu to poniższe polecenie:

# conntrack -F
conntrack v1.4.3 (conntrack-tools): connection tracking table has been emptied.

Jeśli ponownie spróbujemy odczytać ilość wpisów w tablicy, to powinniśmy zobaczyć tam liczbę 0 :

# conntrack -C
0

Oznacza to, że wszystkie sesje zostały ubite, a ewentualne pakiety z nimi związane zostaną oznaczone jako INVALID i zrzucone na zaporze sieciowej.

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.