To jest proponowane pytanie kanoniczne dotyczące zrozumienia i debugowania zapory programowej w systemach Linux.
W odpowiedzi na odpowiedź EEAA i komentarz @ Shog, że potrzebujemy odpowiedniego kanonicznego pytania i odpowiedzi, aby zamknąć typowe stosunkowo proste pytania dotyczące iptables.
Jaka jest strukturalna metoda debugowania problemów z zaporą programową dla systemu Linux, strukturą filtrowania pakietów netfilter , o której często mówi interfejs użytkownika iptables ?
Jakie są typowe pułapki, powtarzające się pytania i proste lub nieco bardziej niejasne rzeczy, aby sprawdzić, czy administrator zapory sieciowej może przeoczyć lub w inny sposób skorzystać z wiedzy?
Nawet jeśli używasz narzędzi takich jak UFW , FirewallD (alias firewall-cmd
), Shorewall lub podobne, możesz skorzystać z patrzenia pod maską bez warstwy abstrakcji oferowanej przez te narzędzia.
To pytanie nie jest przeznaczone do porad dotyczących budowania zapór ogniowych: sprawdź dokumentację produktu i na przykład dodaj przepisy do iptables Trips & Tricks lub przeszukaj oznaczone iptables ufw firewalld firewalld cmd w poszukiwaniu istniejących częstych i dobrze ocenianych wysoko ocenianych wyników Pytania i odpowiedzi.
net.netfilter.nf_conntrack_log_invalid
na 255 ładnie przechwytuje nieprawidłowe pakiety, co może pomóc, jeśli jego stanowa część netfiltra powoduje złe zachowanie.Odpowiedzi:
Ogólnie:
Przeglądanie i modyfikowanie konfiguracji zapory wymaga uprawnień administratora (
root
), podobnie jak otwieranie usług w ograniczonym zakresie numerów portów. Oznacza to, że powinieneś być zalogowany jakoroot
lub alternatywnie użyć,sudo
aby uruchomić komendę jako root. Spróbuję oznaczyć takie polecenia opcją[sudo]
.Zawartość:
-I
i-A
iptables -L -v -n
1. Kolejność ma znaczenie lub różnica między
-I
i-A
Należy pamiętać, że reguły zapory są sprawdzane w kolejności, w jakiej są wymienione. Jądro przestanie przetwarzać łańcuch, gdy zostanie uruchomiona reguła, która zezwoli lub odrzuci pakiet lub połączenie.
Myślę, że najczęstszym błędem początkujących administratorów zapory jest to, że postępują zgodnie z prawidłowymi instrukcjami, aby otworzyć nowy port, taki jak ten poniżej:
a następnie odkryć, że to nie zadziała.
Powodem tego jest to, że
-A
opcja dodaje tę nową regułę, po wszystkich istniejących regułach, a ponieważ bardzo często ostateczna reguła w istniejącej zaporze sieciowej blokuje cały ruch, który nie jest wyraźnie dozwolony, co powodujeLub odpowiednik w iptables-save:
i nowa reguła otwierająca port TCP 8080 nigdy nie zostanie osiągnięta. (o czym świadczą liczniki uparcie pozostające przy 0 pakietach i zerowych bajtach).
Wstawienie reguły z
-I
nową regułą byłoby pierwszą w łańcuchu i będzie działać.2. Wyświetl aktualną konfigurację zapory
Moim zaleceniem dla administratora zapory jest przyjrzenie się rzeczywistej konfiguracji jądra Linuksa, a nie próba zdiagnozowania problemów z zaporą na podstawie przyjaznych narzędzi. Często po zrozumieniu podstawowych problemów można je łatwo rozwiązać w sprawie obsługiwanej przez te narzędzia.
Polecenie
[sudo] iptables -L -v -n
to twój przyjaciel (chociaż niektórzy lubiąiptables-save
lepiej). Często przy omawianiu konfiguracji przydatne jest użycie tej--line-numbers
opcji również do linii numerycznych. Odwołanie się do reguły #X ułatwia omawianie ich.Uwaga: reguły NAT są zawarte w danych
iptables-save
wyjściowych, ale muszą być wymienione osobno, dodając-t nat
opcję tj[sudo] iptables -L -v -n -t nat --line-numbers
.Uruchamianie polecenia wiele razy i sprawdzanie liczników inkrementacyjnych może być przydatnym narzędziem do sprawdzenia, czy nowa reguła faktycznie zostanie uruchomiona.
Alternatywnie wyjście
iptables-save
daje skrypt, który może zregenerować powyższą konfigurację zapory:Jest to kwestia preferencji, co łatwiej zrozumieć.
3. Interpretacja wyjścia
iptables -L -v -n
Polityka określa domyślną akcję zastosowań łańcuchach, gdy nie ma wyraźnych meczów regułą. W
INPUT
łańcuchu ustawionym na AKCEPTUJ cały ruch.Pierwsza reguła w łańcuchu INPUT jest od razu interesująca, wysyła cały ruch (źródło 0.0.0.0/0 i miejsce docelowe 0.0.0.0/0) przeznaczony dla portu TCP 22 (
tcp dpt:22
) domyślny port SSH do niestandardowego celu (fail2ban-SSH
) . Jak sama nazwa wskazuje, reguła ta jest utrzymywana przez fail2ban (produkt bezpieczeństwa, który między innymi skanuje pliki dziennika systemu w celu wykrycia ewentualnych nadużyć i blokuje adres IP sprawcy).Ta reguła zostałaby utworzona za pomocą wiersza polecenia iptables podobnego do
iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
lub znalezionego w danych wyjściowych iptables-save as-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. Często znajdziesz te zapisy w dokumentacji.Liczniki wskazują, że ta reguła dopasowała 784 000 pakietów i 65 megabajtów danych.
Ruch pasujący do tej pierwszej reguły jest następnie przetwarzany przez
fail2ban-SSH
łańcuch, który jako łańcuch niestandardowy znajduje się na liście poniżej łańcucha OUTPUT.Łańcuch ten składa się z dwóch reguł, po jednej dla każdego sprawcy (źródłowy adres IP 117.253.221.166 lub 58.218.211.166), który jest zablokowany (za pomocą a
reject-with icm-port-unreachable
).Pakiety SSH, które nie pochodzą z tych zablokowanych hostów, nie są jeszcze dozwolone ani wyłączone, a teraz po zakończeniu łańcucha niestandardowego będą sprawdzane względem drugiej reguły w łańcuchu INPUT.
Wszystkie pakiety, które nie były przeznaczone dla portu 22, przeszły pierwszą regułę w łańcuchu INPUT i zostaną również ocenione w regule INPUT # 2.
Reguła INPUT numer 2 sprawia, że ma to być stanowa zapora ogniowa , która śledzi połączenia. Ma to pewne zalety, tylko pakiety dla nowych połączeń muszą być sprawdzane pod kątem pełnego zestawu reguł, ale po dopuszczeniu dodatkowe pakiety należące do ustanowionego lub powiązanego połączenia są akceptowane bez dalszego sprawdzania.
Reguła wejściowa nr 2 pasuje do wszystkich otwartych i pokrewnych połączeń oraz pakietów zgodnych z tą regułą nie będzie wymagać dalszej oceny.
Uwaga: zmiany reguł w konfiguracji zapory stanowej wpłyną tylko na nowe połączenia, a nie na nawiązane połączenia.
Natomiast prosty filtr pakietów testuje każdy pakiet pod kątem pełnego zestawu reguł, bez śledzenia stanu połączenia. W takiej zaporze nie byłyby używane słowa kluczowe dotyczące stanu .
Reguła INPUT nr 3 jest dość nudna, cały ruch łączący się z
lo
interfejsem sprzężenia zwrotnego ( lub 127.0.0.1) jest dozwolony.Reguły INPUT 4, 5 i 6 są używane do otwierania portów TCP 22, 80 i 443 (domyślne porty odpowiednio dla SSH, HTTP i HTTPS) przez udzielenie dostępu do NOWYCH połączeń (istniejące połączenia są już dozwolone przez regułę INPUT 2).
W bezstanowej zaporze ogniowej reguły te pojawiałyby się bez atrybutów stanu:
lub
Końcowa reguła WEJŚCIA nr 7 jest regułą, która blokuje cały ruch, który NIE uzyskał dostępu w regułach WEJŚCIA 1-7. Dość powszechna konwencja: wszystko, co niedozwolone, jest odrzucane. Teoretycznie tę zasadę można pominąć, ustawiając domyślną POLITYKĘ na ODRZUĆ.
Zawsze badaj cały łańcuch.
4. Poznaj swoje środowisko
4.1 Ustawienia zapory programowej nie będą miały wpływu na ustawienia zabezpieczeń utrzymywane gdzie indziej w sieci, tj. Pomimo otwarcia usługi sieciowej z
iptables
niezmodyfikowanymi listami kontroli dostępu na routerach lub innych zaporach w sieci może nadal blokować ruch ...4.2 Gdy żadna usługa nie nasłuchuje, nie będzie można nawiązać połączenia i otrzymać błąd odmowy połączenia , niezależnie od ustawień zapory. W związku z tym:
[sudo] netstat -plnut
lub których używaszss -tnlp
.[sudo] nc -l -p 123
lubopenssl s_server -accept 1234 [options]
jeśli potrzebujesz detektora TLS / SSL (sprawdźman s_server
opcje).telnet <IP of Server> 123
Lubecho "Hello" | nc <IP of Server> 123
podczas testowania zabezpieczonej usługi TLS / SSLopenssl s_client -connect <IP of Server>:1234
, zanim spróbujesz to zrobić ze zdalnego hosta.4.3 Poznaj protokoły używane przez twoje usługi. Nie możesz poprawnie włączyć / wyłączyć usług, których nie rozumiesz w wystarczającym stopniu. Na przykład:
/etc/services
niekoniecznie odpowiadają rzeczywistej usłudze używającej portu.4.4 Filtr pakietów jądra nie jest jedyną rzeczą, która może ograniczać łączność sieciową:
getenforce
potwierdzi, czy SELinux jest uruchomiony.ldd /path/to/service |grep libwrap
i/hosts.[allow|deny]
plików kontrolnych.5.
INPUT
lubFORWARD
łańcuchyPojęcie łańcuchów jest tu dokładniej wyjaśnione , ale w skrócie:
W tym
INPUT
łańcuchu otwierasz i / lub zamykasz porty sieciowe dla usług działających lokalnie na hoście, na którym wydajesz polecenia iptables.W
FORWARD
łańcuchu stosowane są reguły do filtrowania ruchu przesyłanego przez jądro do innych systemów, rzeczywistych systemów, ale także do kontenerów Docker i wirtualnych serwerów gości, gdy maszyna z systemem Linux działa jako most, router, hypervisor i / lub adres sieciowy tłumaczenie i przekierowanie portów.Powszechnym nieporozumieniem jest to, że ponieważ kontener dokera lub gość KVM działa lokalnie, obowiązujące reguły filtrowania powinny znajdować się w łańcuchu INPUT, ale zwykle tak nie jest.
6. Moduły jądra
Ponieważ filtr pakietów działa w jądrze Linuksa, można go również skompilować jako moduł dynamiczny, w rzeczywistości wiele modułów. Większość dystrybucji zawiera netfilter jako moduły, a wymagane moduły netfilter zostaną załadowane do jądra w razie potrzeby, ale w przypadku niektórych modułów administrator zapory będzie musiał ręcznie upewnić się, że zostaną załadowane. Dotyczy to przede wszystkim modułów śledzenia połączeń, na przykład takich,
nf_conntrack_ftp
które można załadowaćinsmod
.Moduły aktualnie załadowane do działającego jądra można wyświetlić za pomocą
lsmod
.Metoda zapewnienia stałego ładowania modułów podczas ponownego uruchamiania zależy od dystrybucji systemu Linux.
źródło
watch --difference -n 1 iptables -L FORWARD -v -n
. Umożliwianie narzędziu okresowego uruchamiania polecenia i podświetlania zmian znacznie ułatwia.iptables-save
wynik (najlepiej z-c
) za każdym razem nad tym przerażającymiptables -L
(z różnymi argumentami) wynikiem.Typowe problemy z różnymi protokołami
DNS: DNS domyślnie korzysta z portu 53 UDP, ale wiadomości, które nie mieszczą się w jednym datagramie UDP, będą przesyłane za pomocą protokołu TCP (zwykle transfery stref itp.) Wymagające otwarcia portu 53 TCP również po uruchomieniu serwera nazw .
E-mail: wielu konsumentów blokuje ruch SMTP (lub przynajmniej domyślny port TCP 25), co uniemożliwia bezpośrednie odbieranie lub wysyłanie wiadomości e-mail, a ich klienci są zmuszeni do korzystania z przekaźnika SMTP usługodawcy internetowego dla wszystkich wychodzących wiadomości e-mail, a czasami także dla wiadomości przychodzących . Dotyczy §1.1.
FTP: FTP jest nieparzystym protokołem, ponieważ używane są dwa połączenia. Pierwszym z nich jest połączenie sterujące, domyślnie serwer FTP nasłuchuje na porcie TCP 21 w tym celu. Połączenie sterujące służy do uwierzytelniania i wydawania poleceń. Rzeczywiste transfery plików i takie rzeczy, jak dane wyjściowe listy katalogów, przechodzą przez drugie połączenie TCP, połączenie DATA. W aktywnym FTP połączenie danych zostanie zainicjowane z serwera FTP z portu TCP 20 i połączone z klientem FTP. Aktywny FTP nie działa zbyt dobrze z użytkownikami za firewallami i bramami NAT, więc w większości przestał być używany. Większość serwerów FTP obsługuje zamiast tego pasywny FTP. Dzięki Pasywnemu FTP serwer FTP otwiera odbiornik połączenia DATA na drugim porcie, z którym może się następnie połączyć klient FTP. Problemem zapory ogniowej jest to, że port DATA może być dowolnym dostępnym nieuprzywilejowanym portem między 1024-65536.
W bezstanowej zaporze ogniowej, która jest zazwyczaj rozwiązywana przez ograniczenie liczby pasywnych portów, które serwer FTP może przypisać, a następnie jawne otwarcie tych portów. to znaczy
W zaporze stanowej nie trzeba jawnie otwierać portu DATA, moduł pomocniczy netfilter rozpozna przydzielony port dynamiczny i dynamicznie otworzy ten port dla poprawnego klienta, zaznaczając połączenie DATA,
RELATED
po którym będzie zgodne z ogólną regułą :Wymaga to załadowania poprawnego modułu jądra , w przypadku FTP ręcznie, na przykład przez uruchomienie
insmod nf_conntrack_ftp
, co powoduje, że trwałe zależne od ponownego uruchomienia zależy od dystrybucji.Uwaga: moduł śledzenia połączenia FTP zawiedzie, gdy FTP jest używany z SSL, ponieważ połączenie sterujące zostanie zaszyfrowane, a nf_conntrack_ftp nie będzie już w stanie odczytać powtórzenia PASV.
NFS i podobne usługi RPC: Problem z usługami RPC polega na tym, że z założenia nie używają określonego stałego portu. Mogą losowo wybrać dowolny dostępny port, który zostanie następnie zarejestrowany w demonie Portmap RPC. Klient próbujący się połączyć wysyła zapytanie do demona Portmap, a następnie łączy się bezpośrednio z odpowiednim portem. To rozwiązało problem braku wolnych portów ...
Z punktu widzenia zapory należy otworzyć port TCP / UDP 111 oraz rzeczywisty port, z którego aktualnie korzysta usługa RPC. Problem otwierania takiego losowego portu w zaporze zwykle rozwiązuje się przez ograniczenie usługi RPC, takiej jak serwer NFS, do korzystania z predefiniowanego stałego portu.
źródło
„Wprowadzenie” do Iptables / Firewall
Zapora jest zasadniczo filtrem sieciowym opartym na zasadach. Zapory systemu Linux są zbudowane wokół Netfilter; struktura przetwarzania pakietów sieciowych jądra, która składa się z kilku modułów jądra wykonujących określone zadania:
Użytkownicy konfigurują środowisko Netfilter, aby dopasować je do swoich potrzeb zapory, używając iptables z wiersza poleceń. W iptables definiujemy reguły, które instruują jądro, co robić z pakietami IP, kiedy przychodzą do, przechodzą lub opuszczają naszą skrzynkę Linux. Każdy główny proces Netfilter jest reprezentowany przez TABELĘ (FILTER, NAT, MANGLE) w języku iptables. Mają kilka konkretnych punktów zaczepienia na mapie przepływu pakietów sieciowych, gdzie są one wywoływane przez jądro do wykonywania swoich obowiązków. Niektóre specjalnie zlokalizowane sekwencje wywołań TABELI są ogólnie nazywane wbudowanymi ŁAŃCUCHAMI odbierającymi nazwy PREROUTING, INPUT, FORWARD, OUTPUT i POSTROUTING. Łatwo jest pamiętać, jeśli TABELĘ kojarzymy z „typem procesu”, a ŁAŃCUCH z „lokalizacją” na mapie przepływu pakietów sieciowych, w której wywoływane są instancje tych procesów.
Ponieważ pakiet IP jest odbierany przez interfejs sieciowy lub tworzony przez proces lokalny, dopóki nie zostanie ostatecznie dostarczony lub odrzucony, silnik Netfilter będzie kolejno testował i stosował reguły zawarte na mapie przepływu pakietów sieciowych. W każdym bloku identyfikowanym przez parę TABELA @ ŁAŃCUCH użytkownik może dodać jedną lub więcej następujących po sobie reguł zawierających kryteria dopasowania pakietu IP i odpowiadający im kierunek działania. Istnieją akcje (tj. AKCEPTUJ, DROP itp.), Które mogą być wykonywane przez więcej niż jedną TABELĘ oraz inne akcje (np. SNAT, DNAT itp.), Które są specyficzne dla TABELI.
tzn. gdy pakiet IP przybywa z interfejsu sieciowego, jest najpierw przetwarzany przez łańcuch PREROUTING, który wywołuje reguły zdefiniowane przez użytkownika tabeli MANGLE, jeśli takie istnieją. Jeśli nie ma reguł pasujących do bieżącego pakietu, zastosowanie ma odpowiedni domyślny sposób działania MANGLE @ PREROUTING lub „policy”. W tym momencie, jeśli pakiet nie został upuszczony, proces będzie kontynuował teraz wywoływanie reguł tabeli NAT w łańcuchu PREROUTING (patrz mapa) i tak dalej. Aby ułatwić układ reguł, użytkownicy mogą również tworzyć własne łańcuchy niestandardowe i „wskakiwać” na nie z różnych punktów mapy, jak chcą.
Podczas gdy wbudowane łańcuchy mogą mieć zdefiniowane przez użytkownika polityki pakietów ACCEPT lub DROP, łańcuchy zdefiniowane przez użytkownika mają zawsze niezmienną domyślną politykę POWRÓT do wywołującego, aby kontynuować proces.
Komendy Iptables
Główne polecenia iptables wypełniają mapę przepływu pakietów sieciowych wymaganymi regułami przetwarzania.
Ogólną regułę iptables można zapisać jako:
# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>
Można to odczytać następująco:
Komendy pomocnicze iptables uzupełniają scenariusz, ustawiając domyślne warunki, reguły listy, reguły spłukiwania itp.
Iptables ładuje nasze polecenia do silnika Netfilter w czasie wykonywania, Netfilter natychmiastowo wymusza załadowane reguły i ustawienia, ale nie są trwałe. Po ponownym uruchomieniu wszystkie wcześniej załadowane reguły i ustawienia Netfilter zostaną utracone. Z tego powodu istnieją narzędzia iptables, które pozwalają zapisać aktualnie aktywny zestaw reguł do pliku i załadować go później.
Podsumowanie Iptables
Netfilter to niezwykle elastyczny i potężny framework, ale trzeba za to zapłacić; Iptables jest złożony. Z punktu widzenia użytkownika niektóre terminy, takie jak TABELA, ŁAŃCUCH, TARGET, nie bardzo dobrze pasują do koncepcji, którą reprezentują i na początku nie mają większego sensu. Temat jest długi, polecenia wydają się mieć nieskończoną listę parametrów. Co gorsza, nie ma jednej książki, która naprawdę opanowałaby Iptables. Przeważnie dzielą się na dwie kategorie: „książkę kucharską” lub „książkę strony podręcznika”. Myślę, że to wprowadzenie przedstawia migawkę krajobrazu Netfilter / Iptables oraz niezbędną dawkę wstępnie strawionego podręcznika. Jeśli jesteś nowy w iptables, po przeczytaniu tych paragrafów kilka razy będziesz gotowy do przeczytania przykładów iptables. Przy odrobinie praktyki wkrótce okaże się, że piszesz własne zasady.
Zapory ogniowe
Zapora została zaprojektowana głównie w celu dynamicznego zezwalania na ruch sieciowy lub blokowania go w oparciu o zestaw reguł. W tym momencie łatwo zrozumieć, dlaczego platforma Linux Netfilter / Iptables jest idealna do budowy zapory ogniowej. Patrząc na mapę przepływu pakietów sieciowych, widzimy dwa szczególnie interesujące miejsca w tabeli FILTER w łańcuchach INPUT i FORWARD; Możemy zdecydować na podstawie adresu źródłowego IP, protokołu IP (UDP / TCP), portu docelowego (80, 21, 443 itd.) Itd., Jeśli AKCEPTUJEMY, ODRZUĆ, lub po prostu USUŃ konkretny pakiet IP. To właśnie robi zapora sieciowa w 80% przypadków, kiedy np. Chroni serwer WWW przed nieautoryzowanymi żądaniami sieci. Pozostałe 20% czasu to manipulowanie pakietami sieciowymi (NAT, MANGLE).
Scenariusze zapór ogniowych
Istnieją setki różnych układów zapory ogniowej odpowiadających różnym potrzebom, ale 3 z nich można uznać za najbardziej typowe scenariusze zapory ogniowej.
Napisałem to dla: http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html
źródło