Jak skonfigurować zaporę sieciową Iptables, aby umożliwić zdalny dostęp do usług w systemie Linux — część 8
Przedstawiamy program certyfikacji Linux Foundation
Pamiętasz z Części 1 – Informacje o Iptables z tej serii LFCE (Certyfikowany inżynier Linux Foundation), w której podaliśmy podstawowy opis tego, czym jest zapora sieciowa: mechanizm zarządzania pakietów przychodzących i wychodzących z sieci. Przez „zarządzanie” mamy na myśli:
- Aby zezwolić lub uniemożliwić niektórym pakietom wejście lub opuszczenie naszej sieci.
- Aby przekazać inne pakiety z jednego punktu sieci do drugiego.
w oparciu o z góry ustalone kryteria.
W tym artykule omówimy, jak zaimplementować podstawowe filtrowanie pakietów i jak skonfigurować zaporę ogniową za pomocą iptables, nakładki na netfilter, który jest natywnym modułem jądra używanym do tworzenia zapór ogniowych.
Należy pamiętać, że zapora sieciowa to obszerny temat i ten artykuł nie ma być kompleksowym przewodnikiem pozwalającym zrozumieć wszystko, co trzeba o niej wiedzieć, ale raczej punktem wyjścia do głębszego przestudiowania tego tematu. Jednakże powrócimy do tego tematu w Części 10 tej serii, kiedy przeanalizujemy kilka konkretnych przypadków użycia zapory ogniowej w systemie Linux.
Firewall można traktować jako międzynarodowe lotnisko, na które samoloty pasażerskie przylatują i odlatują niemal 24 godziny na dobę, 7 dni w tygodniu. W zależności od szeregu warunków, takich jak ważność paszportu danej osoby lub jej kraj pochodzenia (by wymienić tylko kilka przykładów), może ona zostać zezwolona na wjazd lub wyjazd z określonego kraju lub nie.
Jednocześnie funkcjonariusze lotniska mogą poinstruować ludzi, aby w razie potrzeby przenieśli się z jednego miejsca na lotnisku do drugiego, na przykład w przypadku konieczności przejścia przez Służbę Celną.
W dalszej części tego samouczka analogia z lotniskiem może okazać się przydatna. Kontynuując, pamiętaj tylko o następujących relacjach:
- Osoby=Pakiety
- Zapora sieciowa=lotnisko
- Kraj nr 1=Sieć nr 1
- Kraj nr 2=Sieć nr 2
- Przepisy lotniskowe egzekwowane przez funkcjonariuszy=zasady zapory sieciowej
Iptables – podstawy
Na niskim poziomie to samo jądro „decyduje”, co zrobić z pakietami w oparciu o reguły pogrupowane w łańcuchy lub zdania. Łańcuchy te definiują, jakie działania należy podjąć, gdy paczka spełnia określone przez nie kryteria.
Pierwszą akcją iptables będzie podjęcie decyzji, co zrobić z pakietem:
- Zaakceptować to (przepuścić do naszej sieci)?
- Odrzucić (zablokować dostęp do naszej sieci)?
- Przekazać go (do innego łańcucha)?
Na wypadek gdybyś zastanawiał się, dlaczego to narzędzie nazywa się iptables, dzieje się tak dlatego, że łańcuchy te są zorganizowane w tabele, przy czym tabela filtrów jest najbardziej znana i ta, która jest używany do implementacji filtrowania pakietów z trzema domyślnymi łańcuchami:
1. Łańcuch INPUT obsługuje pakiety przychodzące do sieci, które są przeznaczone dla programów lokalnych.
2. Łańcuch OUTPUT służy do analizy pakietów pochodzących z sieci lokalnej, które mają zostać wysłane na zewnątrz.
3. Łańcuch FORWARD przetwarza pakiety, które powinny zostać przesłane do innego miejsca docelowego (jak w przypadku routera).
Dla każdego z tych łańcuchów istnieje domyślna polityka, która określa, co należy zrobić domyślnie, gdy pakiety nie odpowiadają żadnej z reguł w łańcuchu. Możesz wyświetlić reguły utworzone dla każdego łańcucha i politykę domyślną, uruchamiając następującą komendę:
iptables -L
Dostępne zasady są następujące:
- AKCEPTUJ → przepuszcza pakiet. Każdy pakiet, który nie pasuje do żadnej reguły w łańcuchu, jest dozwolony w sieci.
- DROP → cicho odrzuca pakiet. Każdy pakiet, który nie pasuje do żadnej reguły w łańcuchu, nie może przedostać się do sieci.
- ODRZUT → odrzuca pakiet i zwraca komunikat informacyjny. Ta w szczególności nie działa jako polityka domyślna. Zamiast tego ma uzupełniać reguły filtrowania pakietów.
Podejmując decyzję, którą politykę wdrożysz, musisz rozważyć zalety i wady każdego podejścia, jak wyjaśniono powyżej – pamiętaj, że nie ma jednego rozwiązania -wszystkie rozwiązania.
Dodawanie reguł
Aby dodać regułę do zapory, wywołaj polecenie iptables w następujący sposób:
iptables -A chain_name criteria -j target
Gdzie,
- -A oznacza Dołącz (dołącz bieżącą regułę na końcu łańcucha).
- nazwa_łańcucha to WEJŚCIE, WYJŚCIE lub W PRZÓD.
- cel to akcja lub zasada, którą należy zastosować w tym przypadku (ZAAKCEPTUJ, ODRZUĆ lub UPUŚĆ).
- kryteria to zestaw warunków, według których pakiety mają być sprawdzane. Składa się z co najmniej jednej (najprawdopodobniej większej liczby) z następujących flag. Opcje w nawiasach, oddzielone pionową kreską, są sobie równoważne. Reszta to opcjonalne przełączniki:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.
Nasze środowisko testowe
Sklejmy to wszystko w 3 klasyczne przykłady, wykorzystując dla pierwszych dwóch następujące środowisko testowe:
Firewall: Debian Wheezy 7.5
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17
I to dla ostatniego przykładu
NFSv4 server and firewall: Debian Wheezy 7.5
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
PRZYKŁAD 1: Analiza różnicy pomiędzy polityką DROP i REJECT
Najpierw zdefiniujemy politykę DROP dla pingów wejściowych do naszej zapory sieciowej. Oznacza to, że pakiety icmp będą odrzucane po cichu.
ping -c 3 192.168.0.15
iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP
Zanim przejdziemy do części REJECT, opróżnimy wszystkie reguły z łańcucha INPUT, aby mieć pewność, że nasze pakiety zostaną przetestowane według nowej reguły:
iptables -F INPUT
iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
ping -c 3 192.168.0.15
PRZYKŁAD 2: Wyłączenie/ponowne włączenie logowania ssh z wersji dev2 na dev1
Będziemy zajmować się łańcuchem OUTPUT podczas obsługi ruchu wychodzącego:
iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT
PRZYKŁAD 3: Zezwalanie/blokowanie klientom NFS (od 192.168.0.0/24) na montowanie udziałów NFS4
Uruchom następujące polecenia na serwerze/zaporze NFSv4, aby zamknąć porty 2049 i 111 dla wszelkiego rodzaju ruchu:
iptables -F
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT
Teraz otwórzmy te porty i zobaczmy, co się stanie.
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT
Jak widać, po otwarciu ruchu udało nam się zamontować udział NFSv4.
Wstawianie, dołączanie i usuwanie reguł
W poprzednich przykładach pokazaliśmy, jak dołączać reguły do łańcuchów INPUT i OUTPUT. Jeśli zamiast tego chcielibyśmy wstawić je we wcześniej określonej pozycji, powinniśmy zamiast tego użyć przełącznika -I (wielkie i).
Należy pamiętać, że reguły będą oceniane jedna po drugiej i że ocena zatrzyma się (lub przeskoczy), gdy zostanie dopasowana zasada DROP lub ACCEPT. Z tego powodu może się okazać, że będziesz musiał w razie potrzeby przenieść reguły w górę lub w dół na liście łańcuchów.
Aby to zademonstrować, użyjemy trywialnego przykładu:
Umieśćmy następującą regułę,
iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
na pozycji 2) w łańcuchu INPUT (przenosząc w ten sposób poprzedni #2 jako #3)
Korzystając z powyższej konfiguracji, ruch będzie sprawdzany, czy jest kierowany do portu 80, a następnie sprawdzany jest port 2049.
Alternatywnie możesz usunąć regułę i zmienić cel pozostałych reguł na REJECT (używając przełącznika -R):
iptables -D INPUT 1
iptables -nL -v --line-numbers
iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -R INPUT 1 -p tcp --dport 80 -j REJECT
Na koniec musisz pamiętać, że aby reguły zapory sieciowej były trwałe, musisz zapisać je w pliku, a następnie przywrócić je automatycznie po uruchomieniu (używając preferowanej metody, którą wybierzesz lub tej, która jest dostępny do Twojej dystrybucji).
Zapisywanie reguł zapory sieciowej:
iptables-save > /etc/iptables/rules.v4 [On Ubuntu]
iptables-save > /etc/sysconfig/iptables [On CentOS / OpenSUSE]
Przywracanie reguł:
iptables-restore < /etc/iptables/rules.v4 [On Ubuntu]
iptables-restore < /etc/sysconfig/iptables [On CentOS / OpenSUSE]
Tutaj możemy zobaczyć podobną procedurę (ręczne zapisywanie i przywracanie reguł zapory sieciowej) przy użyciu fikcyjnego pliku o nazwie iptables.dump zamiast domyślnego, jak pokazano powyżej.
iptables-save > iptables.dump
Aby te zmiany były trwałe w różnych butach:
Ubuntu: zainstaluj pakiet iptables-persistent, który załaduje reguły zapisane w pliku /etc/iptables/rules.v4.
apt-get install iptables-persistent
CentOS: Dodaj następujące 2 linie do pliku /etc/sysconfig/iptables-config.
IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"
OpenSUSE: lista dozwolonych portów, protokołów, adresów i tak dalej (oddzielonych przecinkami) w pliku /etc/sysconfig/SuSEfirewall2.
Więcej informacji można znaleźć w samym pliku, który jest mocno komentowany.
Wniosek
Przykłady podane w tym artykule, chociaż nie obejmują wszystkich ciekawostek iptables, mają na celu zilustrowanie, jak włączać i wyłączać ruch przychodzący i wychodzący.
Ci z Was, którzy są fanami firewalli, powinni pamiętać, że powrócimy do tego tematu z bardziej szczegółowymi zastosowaniami w Części 10 tej serii LFCE.
Jeśli masz jakieś pytania lub uwagi, daj nam znać.