Назад | Перейти на главную страницу

Ограничение скорости с UFW: установка пределов

На странице руководства UFW упоминается, что он может установить для меня ограничение скорости iptables:

ufw поддерживает ограничение скорости соединения, что полезно для защиты от атак грубой силы при входе в систему. ufw будет отклонять соединения, если IP-адрес попытался инициировать 6 или более соединений за последние 30 секунд. Видеть http://www.debian-administration.org/articles/187 для подробностей. Типичное использование:

     ufw limit ssh/tcp

К сожалению, это вся документация, которую я смог найти. Я хотел бы придерживаться UFW и не использовать более сложные команды iptables (чтобы все было "несложно").

Как мне использовать ufw для ограничения всего входящего (а не исходящего) трафика на порту 80 до 20 подключений за 30 секунд? Как отключить ограничение скорости для портов с 30000 по 30005? Включено ли ограничение скорости по умолчанию для всех портов?

UFW спроектирован так, чтобы быть «несложным», что в данном случае означает, что у вас нет контроля над деталями скорости, которой ограничиваются соединения. Если вы хотите покопаться в исходном коде UFW на Python, вы можете узнать, как его настроить. Соответствующая информация (в моей системе Ubuntu 10.04) находится в /usr/share/pyshared/ufw/backend_iptables.py

Поэтому, если оставить в стороне вопрос о сроках, вот несколько ответов на ваши быстрые вопросы в конце.

  1. Предполагая, что 10.10.10.0/24 - ваша локальная сеть, это применяет правило ограничения по умолчанию к порту 80 / tcp incoming:

    ufw limit from any to 10.10.10.0/24 port http comment 'limit web'
    
  2. и 3. По умолчанию ограничение скорости не включено. Чтобы добавить его к каждому порту (назначения), кроме нужного диапазона, используйте это правило. Обратите внимание, что правила (даже с диапазонами) являются атомарными единицами и не могут быть разделены. Вы не можете, например, добавить правило для любого порта, тогда delete (несуществующее) правило для определенного диапазона, чтобы удалить его. limit не приемлемый аргумент ufw default, либо.

    ufw limit from any to any port 0:29999,30006:65535
    

Как упоминалось в предыдущем посте, вы можете настроить user.rules. Мне нужен мой предел скорости соединения smtp до 12 соединений за 6 секунд. Сначала я добавил правило, как показано ниже. Примечание: это добавляет правило ограничения, разрешающее 6 за 30 секунд по умолчанию.

ufw limit smtp

и я отредактировал /lib/ufw/user.rules (у меня есть собственная копия этого файла с множеством других настроек), как показано ниже ...

### 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

Ограничение скорости можно изменить в файле правил UFW, который можно найти /lib/ufw/user.rules.

По умолчанию для всех портов не установлены ограничения. вы должны добавить каждый порт вручную или отредактировав user.rules файл.

Стоит указать на возможные непредвиденные последствия использования функции LIMIT в ufw.

Предположим, кто-то установил общий лимит на порт 22 / tcp в качестве первого правила ufw:

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

с предположением, что любые соединения, работающие ниже лимита, все еще могут быть отфильтрованы, следуя правилам ufw и, наконец, политике по умолчанию «запретить (входящие)».

По крайней мере, для ufw 0.35 это предположение было бы неверным. Фактически, логика LIMIT IN немедленно принимает любой ввод, не отклоненный критерием ограничения.

В псевдокоде логика LIMIT

if CONDITION then DENY else ACCEPT

тогда как другие правила ufw, похоже, имеют логику:

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

Я лично обнаружил, что это неожиданное поведение для ufw LIMIT, которое я обнаружил, только неожиданно обнаружив множество попыток входа в порт 22 в файле системного журнала, чего никогда не должно было произойти из-за фильтрации по другим правилам ufw.

Детали подтверждения поведения

Соответствующие строки кода iptables, вставленные ufw, следующие:

-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

Приведенный выше список может быть создан с помощью

iptables -S | grep ufw-user-limit

Первые две строки идут подряд в ufw-user-input что может быть подтверждено

iptables -S | grep ufw-user-input