На моем сервере для простоты установлено три правила:
iptables -t mangle -N RATE-LIMIT
iptables -t mangle -A RATE-LIMIT -m hashlimit --hashlimit-mode srcip --hashlimit-upto 100/sec --hashlimit-burst 20 --hashlimit-name conn_rate_limit -j RETURN
iptables -t mangle -A RATE-LIMIT -j DROP
iptables -t mangle -A INPUT -p tcp --dport 25565 ! -i lo -j RATE-LIMIT
У меня это работает так, как и должно быть, но меня смутил следующий подробный вывод:
Chain INPUT (policy ACCEPT 11M packets, 921M bytes)
pkts bytes target prot opt in out source destination
5699K 264M RATE-LIMIT tcp -- !lo * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25565
...
Chain RATE-LIMIT (1 references)
pkts bytes target prot opt in out source destination
3060K 158M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 limit: up to 100/sec burst 20 mode srcip
84990 3882K DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Первое правило соответствует каждому пакету, который ниже 100 pps от определенного исходного IP, если он ниже, он должен RETURN
вернуться INPUT
и продолжить там. Второе правило просто отбрасывает каждый пакет, который превышает этот лимит, и должно по сути действовать как политика по умолчанию для этой цепочки.
В INPUT
цепочке около 5.700k пакетов, которые перешли в мою RATE-LIMIT
цепочку. Но если я сложу оба правила в моей RATE-LIMIT
цепочке вместе, я получу число намного меньше. По моему мнению, они должны составить 5.700k.
Почему эти два числа не равны?