Iptables to niezwykle elastyczne narzędzie zapory stworzone dla systemów operacyjnych Linux. Niezależnie od tego, czy jesteś początkującym maniakiem Linuksa, czy administratorem systemu, prawdopodobnie istnieje sposób, że iptables może być dla Ciebie świetny. Czytaj dalej, ponieważ pokazujemy, jak skonfigurować najbardziej wszechstronną zaporę systemu Linux.
zdjęcie zrobione przez ezioman.
O iptables
iptables to narzędzie zapory działające w wierszu poleceń, które wykorzystuje łańcuchy zasad do zezwalania lub blokowania ruchu. Kiedy połączenie próbuje ustanowić się w twoim systemie, iptables szuka reguły na swojej liście, aby ją dopasować. Jeśli go nie znajdzie, korzysta z akcji domyślnej.
iptables prawie zawsze jest preinstalowany w każdej dystrybucji Linuksa. Aby go zaktualizować/zainstalować, po prostu pobierz pakiet iptables:
sudo apt-get install iptables
Istnieją alternatywy GUI dla iptables, takie jak Podpalacz, ale iptables nie jest tak trudne, gdy masz kilka poleceń. Chcesz być bardzo ostrożny podczas konfigurowania reguł iptables, szczególnie jeśli korzystasz z SSH na serwerze, ponieważ jedno złe polecenie może trwale zablokować Cię, dopóki nie zostanie ręcznie naprawione na fizycznym komputerze. I nie zapomnij zablokuj swój serwer SSH jeśli otworzysz port.
Rodzaje łańcuchów
iptables używa trzech różnych łańcuchów: input, forward i output.
Wejście – Ten łańcuch służy do kontrolowania zachowania połączeń przychodzących. Na przykład, jeśli użytkownik spróbuje SSH do twojego komputera/serwera, iptables spróbuje dopasować adres IP i port do reguły w łańcuchu wejściowym.
Naprzód – Ten łańcuch jest używany do połączeń przychodzących, które w rzeczywistości nie są dostarczane lokalnie. Pomyśl o routerze — dane są do niego zawsze wysyłane, ale rzadko są przeznaczone dla samego routera; dane są po prostu przekazywane do celu. Jeśli nie robisz w swoim systemie jakiegoś routingu, NAT-u lub czegoś innego, co wymaga przekazywania, nie będziesz nawet używał tego łańcucha.
Jest jeden pewny sposób sprawdzenia, czy twój system używa/potrzebuje łańcucha przekazywania.
iptables -L -v
Powyższy zrzut ekranu przedstawia serwer, który działa od kilku tygodni i nie ma ograniczeń dotyczących połączeń przychodzących ani wychodzących. Jak widać, łańcuch wejściowy przetworzył 11 GB pakietów, a łańcuch wyjściowy przetworzył 17 GB. Z drugiej strony łańcuch przekazywania nie musi przetwarzać pojedynczego pakietu. Dzieje się tak, ponieważ serwer nie wykonuje żadnego przesyłania dalej ani nie jest używany jako urządzenie przekazujące.
Wynik – Ten łańcuch służy do połączeń wychodzących. Na przykład, jeśli spróbujesz pingować howtogeek.com, iptables sprawdzi swój łańcuch wyjściowy, aby zobaczyć, jakie reguły dotyczą ping i howtogeek.com przed podjęciem decyzji o zezwoleniu lub odrzuceniu próby połączenia.
Zastrzeżenie
Chociaż pingowanie zewnętrznego hosta wydaje się być czymś, co wymagałoby tylko przechodzenia przez łańcuch wyjściowy, należy pamiętać, że do zwrócenia danych zostanie również użyty łańcuch wejściowy. Używając iptables do blokowania systemu, pamiętaj, że wiele protokołów będzie wymagało dwukierunkowej komunikacji, więc zarówno łańcuchy wejściowe, jak i wyjściowe będą musiały być odpowiednio skonfigurowane. SSH jest powszechnym protokołem, na który ludzie zapominają zezwolić w obu łańcuchach.
Domyślne zachowanie łańcucha zasad
Zanim przejdziesz i skonfigurujesz określone reguły, będziesz chciał zdecydować, jakie ma być domyślne zachowanie trzech łańcuchów. Innymi słowy, co chcesz, aby iptables zrobił, jeśli połączenie nie pasuje do żadnych istniejących reguł?
Aby zobaczyć, jakie łańcuchy zasad są obecnie skonfigurowane pod kątem niedopasowanego ruchu, uruchom iptables -L
Komenda.
Jak widać, użyliśmy również polecenia grep, aby uzyskać czystsze wyjście. Na tym zrzucie ekranu nasze sieci są obecnie przystosowane do przyjmowania ruchu.
Częściej niż nie, będziesz chciał, aby Twój system domyślnie akceptował połączenia. O ile wcześniej nie zmieniłeś reguł łańcucha zasad, to ustawienie powinno już być skonfigurowane. Tak czy inaczej, oto polecenie, aby domyślnie akceptować połączenia:
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT
Zgodnie z domyślną regułą akceptacji, możesz użyć iptables do odrzucenia określonych adresów IP lub numerów portów, jednocześnie kontynuując akceptowanie wszystkich innych połączeń. Dojdziemy do tych poleceń za minutę.
Jeśli wolisz odrzucać wszystkie połączenia i ręcznie określać, które z nich chcesz zezwolić na połączenie, powinieneś zmienić domyślną politykę swoich łańcuchów na porzucanie. Byłoby to prawdopodobnie przydatne tylko w przypadku serwerów, które zawierają poufne informacje i łączą się z nimi tylko te same adresy IP.
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
Odpowiedzi dotyczące konkretnego połączenia
Po skonfigurowaniu domyślnych zasad łańcucha możesz zacząć dodawać reguły do iptables, aby wiedział, co zrobić, gdy napotka połączenie z lub do określonego adresu IP lub portu. W tym przewodniku omówimy trzy najbardziej podstawowe i najczęściej używane „odpowiedzi”.
Zaakceptować – Zezwól na połączenie.
Upuszczać – Porzuć połączenie, zachowuj się tak, jakby nigdy się nie wydarzyło. Jest to najlepsze, jeśli nie chcesz, aby źródło wiedziało, że twój system istnieje.
Odrzucać – Nie zezwalaj na połączenie, ale odeślij błąd. Jest to najlepsze, jeśli nie chcesz, aby konkretne źródło łączyło się z twoim systemem, ale chcesz, aby wiedziało, że zapora je blokuje.
Najlepszym sposobem na pokazanie różnicy między tymi trzema regułami jest pokazanie, jak to wygląda, gdy komputer PC próbuje pingować komputer z systemem Linux za pomocą iptables skonfigurowanego dla każdego z tych ustawień.
Zezwolenie na połączenie:
Zerwanie połączenia:
Odrzucenie połączenia:
Zezwalanie lub blokowanie określonych połączeń
Po skonfigurowaniu łańcuchów zasad możesz teraz skonfigurować iptables, aby zezwalać lub blokować określone adresy, zakresy adresów i porty. W tych przykładach ustawimy połączenia na DROP
, ale możesz je przełączyć na ACCEPT
lub REJECT
, w zależności od potrzeb i konfiguracji łańcuchów zasad.
Uwaga: w tych przykładach będziemy używać iptables -A
aby dołączyć reguły do istniejącego łańcucha. iptables zaczyna się na początku swojej listy i przechodzi przez każdą regułę, aż znajdzie taką, która pasuje. Jeśli chcesz wstawić regułę nad inną, możesz użyć iptables -I [chain] [number]
aby określić numer, który powinien znajdować się na liście.
Połączenia z jednego adresu IP
Ten przykład pokazuje, jak zablokować wszystkie połączenia z adresu IP 10.10.10.10.
iptables -A INPUT -s 10.10.10.10 -j DROP
Połączenia z zakresu adresów IP
Ten przykład pokazuje, jak zablokować wszystkie adresy IP w zakresie sieci 10.10.10.0/24. Do określenia zakresu adresów IP można użyć maski sieci lub standardowej notacji z ukośnikiem.
iptables -A INPUT -s 10.10.10.0/24 -j DROP
lub
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
Połączenia z określonym portem
Ten przykład pokazuje, jak blokować połączenia SSH od 10.10.10.10.
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Możesz zastąpić „ssh” dowolnym protokołem lub numerem portu. -p tcp
część kodu mówi iptables, jakiego rodzaju połączenia używa protokół. Jeśli blokujesz protokół, który używa UDP zamiast TCP, to -p udp
byłoby konieczne.
Ten przykład pokazuje, jak blokować połączenia SSH z dowolnego adresu IP.
iptables -A INPUT -p tcp --dport ssh -j DROP
Stany połączenia
Jak wspomnieliśmy wcześniej, wiele protokołów będzie wymagało dwukierunkowej komunikacji. Na przykład, jeśli chcesz zezwolić na połączenia SSH z systemem, łańcuchy wejściowe i wyjściowe będą wymagały dodania do nich reguły. Ale co, jeśli chcesz, aby do twojego systemu było dozwolone tylko SSH? Czy dodanie reguły do łańcucha wyjściowego nie umożliwi również wychodzących prób SSH?
W tym miejscu pojawiają się stany połączenia, które dają możliwość, której potrzebujesz, aby zezwolić na dwukierunkową komunikację, ale zezwalaj tylko na nawiązywanie połączeń w jedną stronę. Spójrz na ten przykład, gdzie połączenia SSH Z 10.10.10.10 są dozwolone, ale połączenia SSH DO 10.10.10.10 nie. Jednak system może odesłać informacje przez SSH, o ile sesja została już ustanowiona, co umożliwia komunikację SSH między tymi dwoma hostami.
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
Zapisywania zmian
Zmiany wprowadzone w regułach iptables zostaną usunięte przy następnym ponownym uruchomieniu usługi iptables, chyba że wykonasz polecenie, aby zapisać zmiany. To polecenie może się różnić w zależności od twojej dystrybucji:
Ubuntu:
sudo /sbin/iptables-save
Czerwony Kapelusz / CentOS:
/sbin/service iptables save
Lub
/etc/init.d/iptables save
Inne polecenia
Wymień aktualnie skonfigurowane reguły iptables:
iptables -L
Dodawanie -v
opcja daje informacje o pakietach i bajtach oraz dodawaniu -n
wymieni wszystko numerycznie. Innymi słowy – nazwy hostów, protokoły i sieci są wymienione jako liczby.
Aby wyczyścić wszystkie aktualnie skonfigurowane reguły, możesz wydać polecenie flush.
iptables -F