Skocz do zawartości
Desavil

Limit połączeń na port z adresu IP

Polecane posty

Witam, muszę ograniczyć dla kilkuset portów limit połączeń na nie. Obecnie używam ipset oraz iptables, ale wydaje mi się że nie do końca działa to prawidłowo, być może coś źle to skonfigurowałem.

 

Co dokładnie chcę osiągnąć?

Mamy porty przykładowo: 5000, 5001, 5002, 5003, 5004 i jednego użytkownika, np. z adresem IP: A.

Chcę, aby na każdy z tych portów ilość połączeń użytkownika A była liczona oddzielnie. Przykładowo jeżeli umożliwię 5 połączeń to na każdym z tych portów z adresu IP A będzie mogło być po 5 połączeń (w sumie 25 połączeń z adresu IP: A). I tak dla każdego adresu IP osobno (nie sumuje się to), każdy nowy adres IP z którego są połączenia dla nich są one liczone oddzielnie dla każdego z portów.

 

Jeżeli ktoś będzie próbował nawiązać, np. 8 połączeń z danym portem to zablokuje mu nowe połączenia tylko na ten port z którym próbuje nawiązać te 8 połączeń, a nie na wszystkie porty serwera.

 

Obecnie to wygląda mniej więcej tak:

ipset create limit_polaczen bitmap:port range 5000-5005
ipset add limit_polaczen 5000
...
ipset add limit_polaczen 5005


iptables -I INPUT -m set --match-set limit_polaczen dst -p tcp --syn ! -i lo -m connlimit --connlimit-above 5 -j DROP

Wydaje mi się, że obecnie jeżeli ktoś przekroczy 5 połączeń to blokuje go na wszystkie porty, a nie wyłącznie na ten na którym przekracza tę ilość.

 

Dziękuję za pomoc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bo używasz ipsetu, który sumuje wszystko do całości.

#!/bin/bash
MAX="5"
PORTY="5000 5001 5002 5003 5004 5005"

for PORT in $PORTY; do
    iptables -A INPUT -p tcp --syn --dport $PORT -m connlimit --connlimit-above $MAX -j REJECT --reject-with tcp-reset
done

Pomysł do poprawienia we własnym zakresie przez czytelnika.

Edytowano przez Archi (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Tylko jest jeden "mały" problem. Muszę dodać to ograniczenie dla ponad 4000 portów.

Nie wydaje mi się, aby iptables podołał z tyloma regułami, stąd też użyłem ipset'a.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Tylko jest jeden "mały" problem. Muszę dodać to ograniczenie dla ponad 4000 portów.

Nie wydaje mi się, aby iptables podołał z tyloma regułami, stąd też użyłem ipset'a.

 

Nie zrobisz tego jedną regułą. Jedna reguła = traktowanie wszystkiego jako całość, możesz użyć -m multiport i --dports zamiast --dport, ale w tym wypadku prawdopodobnie również będzie sumował całość, a nie oddzielnie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Przed czym chcesz sie obronić?

Slowloris, sockstress i inne podobne ataki (uprzedzam, nie chodzi o żadne usługi www typu apache2/nginx itp.)

 

 

 

Nie zrobisz tego jedną regułą. Jedna reguła = traktowanie wszystkiego jako całość, możesz użyć -m multiport i --dports zamiast --dport, ale w tym wypadku prawdopodobnie również będzie sumował całość, a nie oddzielnie.

Tak, sumuje to jako całość, więc musiałoby być to oddzielnie. Ale jak to ma się do wydajności przy 4000 regułek iptables?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jeśli chcesz wydajności to sumuj całość - ipset, multiport, a nawet takie rozwiązania jak firewall CSF się sprawdzą.

 

Jak chcesz to zrobić po swojemu, musisz sam przetestować jak wydajne (lub też i nie) to będzie.

 

Przy regułkach iptables głównie bierze udział procesor, Jeśli nie masz innych regułek, lub jesteś zaprawiony z iptables to możesz sobie zrobić regułę na -j ACCEPT poprawnych pakietów, które nie są SYNami, a pod tą regułką wrzucić tamte. Efekt końcowy będzie taki, że pakiety nie-synowe pójdą już w pierwszej regule, a przez resztę reguł przejdą tylko syny.

 

Tyle, że nie mam pojęcia jak będzie z wydajnością takiego rozwiązania - na ogół się mówi, że powyżej 1k regułek iptables już spowalnia.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok, spróbuję tak jak piszesz. Mój firewall generalnie zaczyna się tak:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j DROP
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j DROP
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j DROP
iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST,ACK,FIN,PSH,URG -j DROP

iptables -A INPUT -p icmp -m limit --limit 2/second --limit-burst 2 -j ACCEPT

Czy jak na końcu tego dodam te ~4k regułek to będzie dobrze?

Rozumiem, że:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Jest traktowane podobnie jak != syn bo ESTABLISHED to już nawiązane połączenie.

 

 

PS. Dlaczego w swoim przykładzie (oczywiście wiem czym one się różnią, ale w przypadku ataku i tak będą kolejne połączenia, a co za tym idzie będę dodatkowo zapychał sobie łącze wysyłając odpowiedź z komunikatem - bynajmniej tak mi się wydaje):

-j REJECT --reject-with tcp-reset

Użyłeś REJECT, zamiast DROP?

Edytowano przez Desavil (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Drobna sugestia - ja pierw bym wszystko logował w jednej tabelce później dropował w innej ;)

Możesz podać jakiś przykład? :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Spoofy

Ugh na szybko coś w stylu :

# Block bad stuff $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL ALL -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets" $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -j DROP # NULL packets $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets" $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP #XMAS $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan" $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -j DROP # FIN packet scans $IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

Zamiast do input dać do "badpackets" i na końcu dropnąć ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jak juz ten ruch jest na maszynie to i tak jest pozamiatane i atak się udał. Ftrowac trzeba wcześniej:-(

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jak juz ten ruch jest na maszynie to i tak jest pozamiatane i atak się udał. Ftrowac trzeba wcześniej:-(

Do samego serwera może dojść, to mi akurat tutaj nie przeszkadza. Chodzi o to, aby do aplikacji się nie dostał, bo wtedy ją automatycznie "zabija".

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


×