Ograniczanie prędkości za pomocą UFW: ustawianie limitów

22

Strona podręcznika UFW wspomina, że ​​może dla mnie ustawić ograniczenie szybkości iptables:

ufw obsługuje ograniczanie szybkości połączenia, co jest przydatne do ochrony przed atakami typu brute-force login. ufw odmawia połączenia, jeśli adres IP próbował zainicjować 6 lub więcej połączeń w ciągu ostatnich 30 sekund. Szczegółowe informacje można znaleźć na stronie http://www.debian-administration.org/articles/187 . Typowe zastosowanie to:

     ufw limit ssh/tcp

Niestety jest to cała dokumentacja, którą udało mi się znaleźć. Chciałbym pozostać przy UFW i nie używać bardziej skomplikowanych poleceń iptables (aby zachować „nieskomplikowanie”).

Jak powinienem użyć ufw, aby ograniczyć cały ruch przychodzący (a więc nie wychodzący) na porcie 80 do 20 połączeń na 30 sekund? Jak wyłączyć ograniczenie prędkości dla portów od 30000 do 30005? Czy ograniczenie prędkości jest domyślnie włączone dla wszystkich portów?

Tomek
źródło

Odpowiedzi:

21

UFW ma być „nieskomplikowany”, co w tym przypadku oznacza, że ​​nie masz kontroli nad szczegółami tempa, do którego połączenia są ograniczone. Jeśli chcesz zagłębić się w źródło UFW w Pythonie, możesz dowiedzieć się, jak go ulepszyć. Odpowiednia informacja to (w moim systemie Ubuntu 10.04) w/usr/share/pyshared/ufw/backend_iptables.py

Dlatego odkładając na bok kwestię czasu, oto kilka odpowiedzi na twoje szybkie pytania na końcu.

  1. Zakładając, że 10.10.10.0/24 jest siecią lokalną, dotyczy to domyślnej reguły ograniczającej dla portu przychodzącego 80 / tcp:

    ufw limit proto tcp from any port 80 to 10.10.10.0/24
    
  2. oraz 3. Ograniczenie prędkości nie jest domyślnie włączone. Aby dodać go do każdego portu (docelowego) oprócz żądanego zakresu, użyj tej reguły. Pamiętaj, że reguły (nawet z zakresami) są jednostkami atomowymi i nie można ich podzielić. Nie można na przykład dodać reguły dla dowolnego portu, a następnie delete(nieistniejącej) reguły dla określonego zakresu, aby ją usunąć. limitnie jest również do przyjęcia argumentem ufw default.

    ufw limit from any to any port 0:29999,30006:65535
    
bonsaiviking
źródło
Czy to oznacza, że ​​stawki nigdy nie można ustawić?
Tom
2
Nie bez zhakowania źródła, przynajmniej nie dla UFW 0.30pre1-0ubuntu2, który jest aktualny dla Ubuntu 10.04. Z wyglądu rzeczy w obecnym źródle , to się nie zmieniło. Możesz jednak umieścić reguły iptables w /etc/ufw/after.rules (lub /etc/ufw/before.rules), i one również zostaną użyte. Aby uzyskać więcej informacji, zobacz man ufw-framework .
bonsaiviking
@ bonsaiviking Czy to możliwe iptable, jeśli tak, to iptable jest backendem ufw.
Nullpointer
6

Jak wspomniano w poprzednim poście, możesz dostosować user.rules. Potrzebuję mojego limitu szybkości połączenia smtp do 12 połączeń w 6 sekund. Najpierw dodałem regułę, jak pokazano poniżej. Uwaga: dodaje to regułę limitu domyślnie pozwalającą na 6 w 30 sekund

ufw limit smtp

i edytowałem /lib/ufw/user.rules (przechowuję niestandardową kopię tego pliku z wieloma innymi poprawkami), jak pokazano poniżej ...

### tuple ### limit tcp 25 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --set
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --update --seconds 6 --hitcount 12 -j ufw-user-limit
-A ufw-user-input -p tcp --dport 25 -j ufw-user-limit-accept
Arul Selvan
źródło
Znalazłem user.rules w / etc / ufw
Otto Kanellis
5

limit prędkości można zmienić w pliku reguł ufw, który można znaleźć /lib/ufw/user.rules. domyślnie nie ma limitów włączonych dla wszystkich portów. każdy port należy dodać ręcznie lub edytując plik user.rules.

Cikuraku
źródło
1

Warto wskazać możliwe niezamierzone konsekwencje korzystania z funkcji LIMIT ufw.

Załóżmy, że jako pierwszą regułę ufw wprowadzono ogólny limit portu 22 / tcp:

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     LIMIT IN    Anywhere                  
...

przy założeniu, że wszelkie połączenia działające poniżej limitu można nadal filtrować, postępując zgodnie z regułami ufw i wreszcie domyślną polityką „odmawiaj (przychodzące)”.

Przynajmniej dla ufw 0,35 to założenie byłoby błędne. W rzeczywistości logika LIMIT IN natychmiast przyjmuje wszelkie dane wejściowe, które nie zostały odrzucone przez kryterium limitu.

W psuedocode logika LIMIT to

if CONDITION then DENY else ACCEPT

podczas gdy inne reguły ufw wydają się mieć logikę:

if CONDITION then (DENY|ACCEPT) else continue to next rule.

Osobiście odkryłem, że jest to nieoczekiwane zachowanie dla ufw LIMIT, które odkryłem tylko niespodziewanie znajdując wiele prób logowania do portu 22 w pliku dziennika systemu, które nigdy nie powinny się zdarzyć z powodu przefiltrowania przez inne reguły ufw.

Szczegóły potwierdzenia zachowania

Odpowiednie wiersze kodu iptables wstawionego przez ufw są następujące:

-A ufw-user-input -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 --name DEFAULT --mask 255.255.255.255 --rsource -j ufw-user-limit
-A ufw-user-input -p tcp -m tcp --dport 22 -j ufw-user-limit-accept
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable
-A ufw-user-limit-accept -j ACCEPT

Powyższą listę można utworzyć za pomocą

iptables -S | grep ufw-user-limit

Pierwsze dwie linie są następujące po sobie, ufw-user-inputco można potwierdzić za pomocą

iptables -S | grep ufw-user-input
Craig Hicks
źródło