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 jako root
lub alternatywnie użyć, sudo
aby uruchomić komendę jako root. Spróbuję oznaczyć takie polecenia opcją [sudo]
.
Zawartość:
- Kolejność ma znaczenie lub różnica między
-I
i-A
- Wyświetl aktualną konfigurację zapory
- Interpretacja wyjścia
iptables -L -v -n
- Poznaj swoje środowisko
- Łańcuchy INPUT i FORWARD
- Moduły jądra
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:
[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
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 powoduje
...
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Lub odpowiednik w iptables-save:
...
iptables -A INPUT -j REJECT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
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.
[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 784K 65M fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 2789K 866M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 15 1384 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num pkts bytes target prot opt in out source destination
Chain fail2ban-SSH (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 117.239.37.150 0.0.0.0/0 reject-with icmp-port-unreachable
2 4 412 REJECT all -- * * 117.253.208.237 0.0.0.0/0 reject-with icmp-port-unreachable
Alternatywnie wyjście iptables-save
daje skrypt, który może zregenerować powyższą konfigurację zapory:
[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT
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
).
-A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-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:
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
lub
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
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:
- Upewnij się, że usługa nasłuchuje (na odpowiednim interfejsie sieciowym / adresie IP) i używa numerów portów, których oczekujesz
[sudo] netstat -plnut
lub których używasz ss -tnlp
.
- Jeśli twoje usługi jeszcze nie powinny działać, emuluj prostego detektora za pomocą na przykład netcat:
[sudo] nc -l -p 123
lub openssl s_server -accept 1234 [options]
jeśli potrzebujesz detektora TLS / SSL (sprawdź man s_server
opcje).
- Sprawdź, czy możesz połączyć się z samego serwera, tj.
telnet <IP of Server> 123
Lub echo "Hello" | nc <IP of Server> 123
podczas testowania zabezpieczonej usługi TLS / SSL openssl 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:
- czy używany jest TCP lub UDP, czy oba (jak w DNS)?
- czy usługa korzysta ze stałego domyślnego portu (na przykład coś takiego jak port TCP 80 dla serwera WWW)?
- alternatywnie, czy wybrany jest dynamiczny numer portu, który może się różnić (tj. usługi RPC, takie jak klasyczny NFS, który rejestruje się w Portmap)?
- niesławny FTP używa nawet dwóch portów , zarówno stałego, jak i dynamicznego, gdy jest skonfigurowany do używania trybu pasywnego ...
- opisy usług, portów i protokołów
/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ą:
- SELinux może również ograniczać usługi sieciowe.
getenforce
potwierdzi, czy SELinux jest uruchomiony.
- Mimo, że stają się nieco niejasne, owijarki TCP są nadal potężnym narzędziem do egzekwowania bezpieczeństwa sieci. Sprawdź za pomocą
ldd /path/to/service |grep libwrap
i /hosts.[allow|deny]
plików kontrolnych.
5. INPUT
lub FORWARD
łańcuchy
Poję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.