Desavil 88 Zgłoś post Napisano Październik 7, 2014 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
Pan Kot 1535 Zgłoś post Napisano Październik 7, 2014 (edytowany) 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 Październik 7, 2014 przez Archi (zobacz historię edycji) Udostępnij ten post Link to postu Udostępnij na innych stronach
Desavil 88 Zgłoś post Napisano Październik 8, 2014 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
theONE 526 Zgłoś post Napisano Październik 8, 2014 Przed czym chcesz sie obronić? Udostępnij ten post Link to postu Udostępnij na innych stronach
Pan Kot 1535 Zgłoś post Napisano Październik 8, 2014 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
Desavil 88 Zgłoś post Napisano Październik 8, 2014 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
Pan Kot 1535 Zgłoś post Napisano Październik 8, 2014 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
Desavil 88 Zgłoś post Napisano Październik 8, 2014 (edytowany) 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 Październik 8, 2014 przez Desavil (zobacz historię edycji) Udostępnij ten post Link to postu Udostępnij na innych stronach
Gość Spoofy Zgłoś post Napisano Październik 8, 2014 Drobna sugestia - ja pierw bym wszystko logował w jednej tabelce później dropował w innej Apropos REJECT vs DROP > http://wampir.mroczna-zaloga.org/archives/1159-drop-vs-reject.html < tutaj masz ładnie opisane Pozdrawiam. Udostępnij ten post Link to postu Udostępnij na innych stronach
Desavil 88 Zgłoś post Napisano Październik 8, 2014 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 Zgłoś post Napisano Październik 8, 2014 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
theONE 526 Zgłoś post Napisano Październik 8, 2014 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
Desavil 88 Zgłoś post Napisano Październik 9, 2014 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