Стоит указать на возможные непредвиденные последствия использования функции LIMIT в UFW.
Предположим, что в качестве первого правила ufw было установлено общее ограничение для порта 22 / tcp:
To Action From
-- ------ ----
[ 1] 22/tcp LIMIT IN Anywhere
...
с предположением, что любые соединения, работающие в рамках лимита, все еще могут быть отфильтрованы, следуя правилам ufw и, наконец, политике по умолчанию «deny (входящий)».
По крайней мере, для ufw 0.35 это предположение было бы неверным. Фактически логика LIMIT IN немедленно принимает любой вход, не отклоненный по критерию предела.
В psuedocode логика LIMIT имеет вид
if CONDITION then DENY else ACCEPT
тогда как другие правила UFW, кажется, имеют логику:
if CONDITION then (DENY|ACCEPT) else continue to next rule
,
Лично я обнаружил, что это было неожиданное поведение для LIMIT ufw, которое я обнаружил только неожиданно, обнаружив много попыток входа на порт 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