Mamy serwer Ubuntu 12.04 z httpd na porcie 80 i chcemy ograniczyć:
- maksymalna liczba połączeń na adres IP do httpd do 10
- maksymalna liczba nowych połączeń na sekundę do httpd do 150
Jak możemy to zrobić za pomocą iptables?
Mamy serwer Ubuntu 12.04 z httpd na porcie 80 i chcemy ograniczyć:
Jak możemy to zrobić za pomocą iptables?
Odpowiedzi:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
Spowoduje to odrzucenie połączeń powyżej 15 z jednego źródłowego adresu IP.
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT
W tym 160 nowych połączeń (tak naprawdę pakietów) jest dozwolonych przed zastosowaniem limitu 150 NOWYCH połączeń (pakietów) na sekundę.
-m conntrack --ctstate
zamiast -m state --state
. conntrack jest nowy i ulepszony w porównaniu do stanu.
NEW
połączeń - nie rób tego - skutecznie zamienia Twój INPUT
łańcuch w domyślny accept
!!!
Chcesz, aby następujące reguły w iptables odpowiadały na oba wymagania w twoim pytaniu:
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 80 -m state \
--state RELATED,ESTABLISHED -j ACCEPT
# Adjust "--connlimit-above NN" to limit the maximum connections per IP
# that you need.
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 --connlimit-mask 32 -j DROP
# Adjust "--connlimit-above NNN" to the maximum total connections you
# want your web server to support
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 150 -j DROP
Ponieważ używamy -I (zgodnie z żądaniem PO), musimy to zrobić w odwrotnej kolejności, więc „przeczytaj” je od dołu do góry.
Sugeruję również rozważenie - zmiana NN -connlimit-mask z 32 na 24. Ograniczy to pełną sieć klasy C (maks. 256 adresów IP w tym samym zakresie) do 10 połączeń. Możesz także użyć dowolnego innego numeru bezklasowego, takiego jak 22 lub 30, w zależności od tego, w jaki sposób możesz skorzystać z usługi.
Również w zależności od tego, jak chcesz, aby klient się zachowywać, to może chcieć użyć „-j REJECT --reject-with tcp-reset” zamiast „-j DROP” w dwie reguły powyżej, lub nawet tylko w 150 Przyłącza max reguła.
Jeśli odrzucisz połączenie, przeglądarka lub oprogramowanie korzystające z portu 80 natychmiast pokaże stan „niedostępny”, ale opcja DROP spowoduje, że klient poczeka i spróbuje jeszcze kilka razy, zanim zgłosi witrynę jako niedostępną. Zwykle opieram się na DROP, ponieważ zachowuje się bardziej jak złe połączenie niż serwer offline.
Ponadto, jeśli limit połączenia spadnie z powrotem poniżej 150 (lub 10), gdy jest nadal ponawiany, w końcu przejdzie do twojego serwera.
Opcja ODRZUĆ spowoduje jednak o ułamek mniejszy ruch w witrynie, ponieważ DROP spowoduje wysłanie dodatkowych pakietów podczas ponownej próby. Prawdopodobnie nie wszystko, co istotne.
Z drugiej strony, jeśli ruch na porcie 80 jest częścią klastra, REJECT poinformuje kontroler klastra, że jest wyłączony i przestanie wysyłać do niego ruch na czas oczekiwania.
Reguła POWIĄZANA, USTANOWIONA jest przy założeniu, że domyślną regułą jest blokowanie całego ruchu (iptables -t filtr -P WEJŚCIE DROP). To akceptuje tylko kolejne pakiety należące do akceptowanych połączeń.
Również --syn mówi, aby zwracał uwagę na (lub liczył) pakiety, które ustanawiają połączenie TCP.
Musisz użyć connlimit
modułów, które pozwalają ograniczyć liczbę równoległych połączeń TCP do serwera na adres IP klienta (lub blok adresu).
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 -j DROP