Согласно страница руководства iptables-extensions hashlimit может ограничивать пропускную способность:
"потоки, превышающие 512 Кбайт / с" =>
--hashlimit-mode srcip,dstip,srcport,dstport --hashlimit-above 512kb/s
Однако, когда я пытаюсь указать такое правило, 1) оно не ограничивает мою пропускную способность, как я ожидал, 2) когда я сбрасываю правила с помощью iptables-save, я получаю те же записи, независимо от того, что я поставил после числа (кб / с, бит / с, / с, что-то глупое или вообще ничего):
# iptables -t filter -A it2net -s 10.5.2.43/32 -m hashlimit --hashlimit-upto 8kb/s --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.44/32 -m hashlimit --hashlimit-upto 8b/s --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.45/32 -m hashlimit --hashlimit-upto 8 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.46/32 -m hashlimit --hashlimit-upto 8000 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.47/32 -m hashlimit --hashlimit-upto 8000b --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.48/32 -m hashlimit --hashlimit-upto 8000xb --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.49/32 -m hashlimit --hashlimit-upto 8000kb --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
И соответствующие части дампа:
-A it2net -s 10.5.2.43/32 -m hashlimit --hashlimit-upto 8/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.44/32 -m hashlimit --hashlimit-upto 8/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.45/32 -m hashlimit --hashlimit-upto 8/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.46/32 -m hashlimit --hashlimit-upto 10000/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.47/32 -m hashlimit --hashlimit-upto 10000/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.48/32 -m hashlimit --hashlimit-upto 10000/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.49/32 -m hashlimit --hashlimit-upto 10000/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
(давайте не будем беспокоиться о том, почему 8000 округляется до 10000 ... или мы должны?)
Есть идеи, что мне не хватает? Мне нужно было бы ограничить использование полосы пропускания около 100 постоянно меняющихся пользователей по отдельности, чтобы у каждого был очень низкий лимит, разрешающий базовые службы (особенно глупые мобильные приложения, которые не могут использовать прокси-аутентификацию), но требовать входа в систему для всего остального .
Процитировать OP, поскольку ответ находится в комментарии
Решение: Я отстал на 3 минорные версии. Ограничение хеширования на основе байтов введено в iptables 1.4.15 (в Ubuntu 13.04 - 1.4.12) - dakhota
Ваши правила ACCEPT
пакеты до определенной скорости, но есть ли что-нибудь после этого DROP
трафик, когда он не соответствует правилам? Либо политика цепочки по умолчанию (-P
) или явное правило ...
Что вы могли бы сделать, так это изменить свои правила на DROP
трафик с --hashlimit-above
; пример:
# iptables -t filter -A it2net -s 10.5.2.43/32 -m hashlimit --hashlimit-above 8kb/s --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.44/32 -m hashlimit --hashlimit-above 8b/s --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.45/32 -m hashlimit --hashlimit-above 8 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.46/32 -m hashlimit --hashlimit-above 8000 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.47/32 -m hashlimit --hashlimit-above 8000b --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.48/32 -m hashlimit --hashlimit-above 8000xb --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.49/32 -m hashlimit --hashlimit-above 8000kb --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
Другие варианты: политика цепочки по умолчанию (она блокирует все трафик, который не соответствует этим правилам), или явные правила, соответствующие тому же трафику, который вы принимаете, и отбрасывание его, когда он не соответствует ACCEPT
правила hashlimit.
Что касается того, как hashlimit искажает ваши правила, это выглядит довольно странно. Будет ли это делать то же самое, если вы используете разные имена таблиц? Я думаю, что либо у вас есть более старая версия, которая ее не поддерживает, либо она каким-то образом принимает / s как / sec и предполагает, что все остальное для таблицы - посекундно.