Limitowanie sieci w systemie Linux i ograniczanie liczby pakietów na przykładzie narzędzia iptables
Limitowanie ruchu sieciowego przy pomocy iptables jest kolejnym skutecznym sposobem na kontrolowanie przepustowości i zarządzanie ruchem w systemie Linux. W poprzednim artykule omawiałem i pokazywałem jak zrobić takie kolejkowanie i limitowanie na przykładzie kolejek HTB i narzędzia tc. W tym artykule zrobimy coś dodatkowego, ale na bazie iptables. Narzędzie to, działające jako zapora sieciowa, umożliwia […]

Limitowanie ruchu sieciowego przy pomocy iptables jest kolejnym skutecznym sposobem na kontrolowanie przepustowości i zarządzanie ruchem w systemie Linux. W poprzednim artykule omawiałem i pokazywałem jak zrobić takie kolejkowanie i limitowanie na przykładzie kolejek HTB i narzędzia tc. W tym artykule zrobimy coś dodatkowego, ale na bazie iptables. Narzędzie to, działające jako zapora sieciowa, umożliwia także tworzenie reguł ograniczających liczbę pakietów przesyłanych przez dany interfejs lub przypisanych do określonych portów. Dzięki wykorzystaniu modułu limit lub hashlimit możemy definiować konkretne limity prędkości, które pozwalają na kontrolowanie zarówno wychodzącego, jak i przychodzącego ruchu. Nie jest to jednak narzędzie stworzone do precyzyjnego kształtowania ruchu i nie nadaje się do takiego stricte limitowania dokładnego ruchu. Ma jednak wiele innych zalet o których nieco niżej. Na przykład, aby ograniczyć liczbę żądań do serwera nginx działającego na porcie http/HTTPS (port 80 lub 443), możemy ustawić regułę, która dopuszcza określoną liczbę pakietów na sekundę, co zapobiega przeciążeniu serwera w wyniku ataków typu DoS (Denial of Service). To co omawiam w tym artykule może służyć jako dodatkowa warstwa zabezpieczająca przed wpadnięciem ruchu na kolejki HTB, na przykład aby zapobiegać atakom DDoS.
Dla bardziej zaawansowanych scenariuszy, moduł hashlimit w iptables oferuje dodatkowe możliwości kontroli, pozwalając na limitowanie ruchu w zależności od adresu IP źródłowego lub docelowego. Dzięki temu można zastosować różne limity dla różnych grup użytkowników, co jest szczególnie przydatne w środowiskach, gdzie wymagane są polityki jakości usług (QoS). Na przykład w przypadku serwera SMTP (port 25), moduł hashlimit może zostać użyty do ograniczenia liczby połączeń inicjowanych przez jednego użytkownika, co pozwala zapobiec masowemu rozsyłaniu spamu lub nadmiernemu obciążeniu serwera. Reguły te działają dynamicznie, co oznacza, że limit jest resetowany po określonym czasie, dzięki czemu użytkownicy z mniejszym obciążeniem nie są blokowani na stałe.
Warto zaznaczyć, że iptables to narzędzie, które operuje na warstwie pakietów, co oznacza, że oferuje bardzo dużą precyzję w zarządzaniu ruchem sieciowym. Jednak konfiguracja takich reguł wymaga dobrej znajomości struktury sieci oraz wymagań aplikacji. Wprowadzenie limitów w nieprzemyślany sposób może prowadzić do nieoczekiwanych problemów, takich jak blokowanie ruchu krytycznych usług. Dlatego podczas implementacji należy dokładnie przetestować reguły, aby upewnić się, że spełniają one założenia i nie powodują zakłóceń w działaniu systemu. iptables, mimo że jest narzędziem uniwersalnym, świetnie sprawdza się w zarządzaniu ruchem w małych i średnich środowiskach, oferując solidne podstawy do budowy bardziej złożonych mechanizmów kontroli przepustowości.
Ograniczenie ruchu na portach 80 i 443
Instalujemy odpowiednie paczki
dnf install iptables-services -y
systemctl start iptables
systemctl enable iptables
iptables -A INPUT -p tcp –dport 80 -m hashlimit –hashlimit-name http –hashlimit-above 1mbit/s –hashlimit-mode srcip –hashlimit-burst 10 -j DROP
Legenda:
-A INPUT: Dodaje regułę do łańcucha INPUT, który obsługuje ruch przychodzący.
-p tcp: Dotyczy ruchu TCP.
–dport 80: Ograniczenie ruchu do portu 80.
-m hashlimit: Używa modułu hashlimit do kontroli przepustowości.
–hashlimit-name http: Ustawia nazwę limitu na „http”.
–hashlimit-above 1mbit/s: Limit przepustowości ustawiony na 1 Mb/s.
–hashlimit-mode srcip: Limit jest nakładany na podstawie adresu IP źródłowego.
–hashlimit-burst 10: Pozwala na krótkotrwałe przekroczenie limitu (do 10 pakietów) przed rozpoczęciem blokowania.
-j DROP: Odrzuca ruch, który przekracza limit.
To samo wykonujemy dla portu szyfrowanego 443
iptables -A INPUT -p tcp –dport 443 -m hashlimit –hashlimit-name https –hashlimit-above 1mbit/s –hashlimit-mode srcip –hashlimit-burst 10 -j DROP
To ustawienie zapobiega przeciążeniu serwera przez nadmierną liczbę zapytań na sekundę, np. w przypadku prostych ataków DDoS. Jeśli liczba połączeń przekroczy 10 na sekundę, dodatkowe żądania zostaną odrzucone.
Dlaczego limit nie jest precyzyjny?
Iptables sam w sobie nie jest narzędziem do precyzyjnego limitowania przepustowości sieci, ponieważ działa na poziomie filtrowania pakietów, a nie na poziomie kształtowania ruchu. W naszym przypadku, gdzie wymagana jest precyzyjna kontrola przepustowości (np. ograniczenie do 1 Mb/s), lepszym rozwiązaniem będzie użycie narzędzia tc (Traffic Control) z kolejką HTB (Hierarchical Token Bucket). Nasz przykład z wykorzystaniem iptables i modułu hashlimit służy przede wszystkim do kontroli ilości pakietów lub połączeń, a nie do precyzyjnego kształtowania przepustowości w bitach na sekundę, co jest zadaniem narzędzia tc. Iptables z modułem hashlimit może być używane jako narzędzie do filtrowania nadmiarowego ruchu jeszcze przed przesłaniem go do bardziej zaawansowanego mechanizmu, takiego jak tc. Połączenie tych dwóch narzędzi daje nam naprawdę niezłą ochronę przed różnymi wektorami ataków, przeciążeń i innych zagrożeń jednak jedno nie zostępuje drugiego i nie należy ich używać zamiennie, a najlepiej razem.