01.10.2010 10:37
OlegON
 
В общем, попалась задача - ограничить юзеров бегло по траффику, но не ограничивать по скорости. Грубо говоря, скачать больше N метров в час не давать. Прокся на порту 1005. Решил не связываться непосредственно с прокси, а сделать все через iptables:
Код:
echo Limit traffic of public proxy
$IPTABLES -A OUTPUT -p tcp --sport 1005 -m limit --limit 10000/hour --limit-burst 5000 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport 1005 -j REJECT
В нете достаточно много пояснений на тему параметров для limit, попробую и я свое видение объяснить. Конкретно по этому примеру, чего добивался. Каждый пакет в среднем около 2Кб. Заводим ведро на 5000 пакетов, --limit-burst 5000, т.е. пользователи прокси все хором могут черпануть (5000*1500) около 7,5Мб на максимальной скорости. После чего правило работать перестанет и будет работать второе, которое все пакеты с этого порта просто отвергает (DROP не стал использовать, для того, чтобы не генерился мусорный траффик на перезапрос пакетов). Естественно, есть и механизм откатывания, т.е. освобождения "ведра" от налитого пользователями --limit 10000/hour говорит о том, что для пользователей освобождается 10000 пакетов в час (не разом, а скорость освобождения такая, постепенно по капельке выливается).
Соответственно, можно посмотреть, как это работает:
Цитата:
sudo watch iptables -L OUTPUT -v
9622 16M ACCEPT tcp -- any any anywhere anywhere tcp spt:1005 limit: avg 10000/hour burst 5000
1537 22M REJECT tcp -- any any anywhere anywhere tcp spt:1005 reject-with icmp-port-unreachable
Видно, что пакеты на самом деле были чуть больше, чем теоретические 2К (первая колонка - количество пакетов), но прикидки все были приблизительные и все работает так, как мне было необходимо. Пока юзера не начинают качать что-то серьезное, они лимита не замечают, поскольку наливают в ведро приблизительно с той же скоростью, с какой оттуда выливается. Как только кто-то перебарщивает с каким-нибудь youtube, лагать начинает у всех. Сидят они в одной комнате и разбираются быстро :)
Надеюсь, что смог пояснить, как все это устроено :) Долго искал пример в инете с этими ведрами и в итоге делал по собственному разумению.
Часовой пояс GMT +3, время: 04:13.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.