aabc Posted September 23, 2015 (edited) Приглашаю для тестирования модуля для ядра Linux для полисинга трафика через iptables, без использования qdisc. Страница проекта https://github.com/aabc/ipt-ratelimit Сделано для ядер >= 3.х и последних релизов основных дистров, текущая верия проверена на Debian 8 и Centos 7. Работает по аналогии с hashlimit с proc файлами управления по аналогии с recent. Ставится правило: iptables ... -m ratelimit --ratelimit-set name --ratelimit-mode src -j DROP Затем, появляется файл /proc/net/ipt_ratelimit/name куда можно добавлять список IP адресов и rate burst ext-burst. Всё что будет превышать битрейт+бурст будет дропаться. Например, добавление правила: # echo +10.0.0.1 1000000 187500 > /proc/net/ipt_ratelimit/name Удаление правила: # echo -10.0.0.1 > /proc/net/ipt_ratelimit/name Удаление всех правил: # echo / > /proc/net/ipt_ratelimit/name Просмотр статистики: cat /proc/net/ipt_ratelimit/name README по ссылке. Пожалуйста, учитите, что модуль свежий (сентябрь 2015) и ещё не тестирован в продакшене. О багах можно сообщать на гитхабе в Issues. Edited December 30, 2015 by aabc Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
telecom Posted September 23, 2015 Здорово! Есть пара вопросов: 1. Скорость трафика полисится в сторону ip, трафик от ip, или трафик в обе стороны? 2. В чем профит vs qdisc? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
enots Posted September 23, 2015 btw, позволяет делать массово nat + policing на одной машине без извращений типа imq и ifb. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
telecom Posted September 23, 2015 А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ??? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
aabc Posted September 23, 2015 (edited) 1. Скорость трафика полисится в сторону ip, трафик от ip, или трафик в обе стороны? Зависит от параметра --ratelimit-mode, если он src, то будет матчится исходящий IP адрес, если dst, то адрес назначения. 2. В чем профит vs qdisc? Выше enot ответил. В общем - простота использования. И отвязка от интерфейсов. А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ??? Правила iptables можно комбинировать как обычно, а там есть -i и -o. Edited September 23, 2015 by aabc Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Igor Diakonov Posted September 23, 2015 Могу добавить что при трафике 3/1 Гбит in/out работа модуля на загрузку CPU практически не влияет. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
dazgluk Posted September 23, 2015 Первые тесты на трафике снятом сплиттерами. Конфиг. 1xE5649 X520-DA2 На сервере запущен только этот модуль, без conntrack, без NAT Конфиг IPTABLES -A FORWARD -i br0 -m ratelimit --ratelimit-set test_out --ratelimit-mode src -j DROP -A FORWARD -i br1 -m ratelimit --ratelimit-set test_in --ratelimit-mode dst -j DROP wc -l /proc/net/ipt_ratelimit/test_in 31798 /proc/net/ipt_ratelimit/test_in wc -l /proc/net/ipt_ratelimit/test_out 31798 /proc/net/ipt_ratelimit/test_out Результаты в приложении. Как видно, модуль практически не создает нагрузку на синтетическом трафике, не смотря на то, что часть трафика таки дропается. По предварительным оценкам - модуль просто шикарный, сейчас напишем обвязку и будем тестировать на реальном трафике вместе с NAT и Netflow AABC, спасибо! Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
telecom Posted September 23, 2015 А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ??? Правила iptables можно комбинировать как обычно, а там есть -i и -o. Но моя просьба состояла в том, что бы имя интерфейса можно было передавать в /proc/net/ipt_ratelimit/name, т.е. оперативно управлять этим. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sexst Posted September 23, 2015 Например, добавление правила: # echo +10.0.0.1 1000000 187500 > /proc/net/ipt_ratelimit/name Удаление правила: # echo -10.0.0.1 > /proc/net/ipt_ratelimit/name Вам категорически не хватает возможности прикрепить к одному ведру несколько ip адресов. Иначе не получится красиво нарезать полосу для абонента с несколькими ip. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Igor Diakonov Posted September 23, 2015 Вам категорически не хватает возможности прикрепить к одному ведру несколько ip адресов. Иначе не получится красиво нарезать полосу для абонента с несколькими ip. Это всё потому, что вы README не читали :) # echo +10.0.0.1,10.0.0.2 10000000 > /proc/net/ipt_ratelimit/name0 - add multiple IPs, rate will be calculated for them together (not separately). For example if you want limit client with multiple IPs. Но моя просьба состояла в том, что бы имя интерфейса можно было передавать в /proc/net/ipt_ratelimit/name, т.е. оперативно управлять этим. Я так пониаю - это для VPN серверов? Думаю такой вариант вполне норм будет: -A FORWARD -i ppp+ -m ratelimit --ratelimit-set limit_out --ratelimit-mode src -j DROP -A FORWARD -o ppp+ -m ratelimit --ratelimit-set limit_in --ratelimit-mode dst -j DROP в ip-up что-то типа echo +$ip $speed > /proc/net/ipt_ratelimit/limit_out echo +$ip $speed > /proc/net/ipt_ratelimit/limit_in ip-down: echo -$ip $speed > /proc/net/ipt_ratelimit/limit_out echo -$ip $speed > /proc/net/ipt_ratelimit/limit_in Зачем интерфейсы? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
telecom Posted September 23, 2015 ... Зачем интерфейсы? Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Igor Diakonov Posted September 23, 2015 Хм. Кажется, тут надо отдельный модуль сделать, упрощённый до состояния -A FORWARD -i IF -m ratelimit_simple --ratelimit_rate=xxx -j DROP :) Ну и поддержка подсетей, я думаю, появится в обозримом будущем. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
martini Posted September 24, 2015 я так понимаю сделав два правила iptables --ratelimit-set name --ratelimit-mode src -j DROP iptables --ratelimit-set name --ratelimit-mode dst -j DROP можно полисить трафик в оба направления для абона (тачка без ната) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
aabc Posted September 24, 2015 (edited) я так понимаю сделав два правила iptables --ratelimit-set name --ratelimit-mode src -j DROP iptables --ratelimit-set name --ratelimit-mode dst -j DROP можно полисить трафик в оба направления для абона (тачка без ната) Можно. В данном случае трафик будет суммироваться. Но, вряд ли такое практически кому-то нужно. Если нужны независимые лимиты, то нужно поставить --ratelimit-set с разными именами. ps. Возможно, стоит запретить использование set-а с одинаковым именем, чтоб не возникало такого недопонимания. Edited September 24, 2015 by aabc Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
martini Posted September 24, 2015 отлично, идею понял, спасибо. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
aabc Posted September 24, 2015 Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все) Интерфейсы приделать теоретически возможно, но стоит ли усложнять концепцию. Просто подсети не подойдут? (Они планируются.) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
telecom Posted September 24, 2015 Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все) Интерфейсы приделать теоретически возможно, но стоит ли усложнять концепцию. Просто подсети не подойдут? (Они планируются.) Думаю, что стоит! Это будет более гибко. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
taf_321 Posted September 24, 2015 Очень интересное решение. Но без подсетей пока грустно, и еще нужна поддержка IPv6. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Igor Diakonov Posted September 24, 2015 Я бы добавил - одновременное ограничение v4 + v6 до какого-то общего значения, правда, не уверен что это возможно в рамках iptables... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
aabc Posted September 25, 2015 Я бы добавил - одновременное ограничение v4 + v6 до какого-то общего значения, правда, не уверен что это возможно в рамках iptables... Как раз для таких случаев одинаковые имена сетов можно оставить, чтоб загонять в один сет не пересекающийся трафик, ipv4 и ipv6. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Susanin Posted September 25, 2015 Два разных абонента с разной скоростью требуют созданию двух сетов ? При ограничении скорости по обоим направлениям - то уже 4 сета ? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
aabc Posted September 25, 2015 Два разных абонента с разной скоростью требуют созданию двух сетов ? Смысл сета в том, что в нем может конфигурироваться множество правил (для тысяч клиентов). Так что тут потребуется 1 сет, но в него должны быть добавлены два правила. При ограничении скорости по обоим направлениям - то уже 4 сета ? В этом случае два сета, по два правила в каждом. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Susanin Posted September 25, 2015 (edited) Пожалуйста, покажите на пальцах пример (наверное пятница действует) для : Абонент А (10.10.0.1, 10.10.0.5) - ограничение в 10 Mbit/s (скорость суммарно на абонента) Абонент Б (10.10.0.4) - ограничение в 25 Mbit/s В обоих случаях указана максимальная скорость на абонента в любом направлении. Т.е. Для абонента Б максимум - 25 исходящего и 25 входящего одновременно. Так ? -A FORWARD -i eth_IN -m ratelimit --ratelimit-set test_out --ratelimit-mode src -j DROP -A FORWARD -i eth_OUT -m ratelimit --ratelimit-set test_in --ratelimit-mode dst -j DROP echo +10.10.0.1,10.10.0.5 10000000 > /proc/net/ipt_ratelimit/test_out echo +10.10.0.4 25000000 > /proc/net/ipt_ratelimit/test_out echo +10.10.0.1,10.10.0.5 10000000 > /proc/net/ipt_ratelimit/test_in echo +10.10.0.4 25000000 > /proc/net/ipt_ratelimit/test_in Edited September 25, 2015 by Susanin Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
enots Posted September 25, 2015 Так ? Да. При этом -i можно не указывать. Т.е. абонентских интерфейсов может быть много и внешних каналов тоже. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted September 26, 2015 Не стреляет... [root@sol ipt-ratelimit-master]# make all make -C /lib/modules/4.1.6-201.fc22.x86_64/build/ M=/root/ipt-ratelimit-master modules CONFIG_DEBUG_INFO=y make[1]: вход в каталог «/usr/src/kernels/4.1.6-201.fc22.x86_64» CC [M] /root/ipt-ratelimit-master/xt_ratelimit.o In file included from /root/ipt-ratelimit-master/xt_ratelimit.c:43:0: /root/ipt-ratelimit-master/compat.h:2:60: ошибка: переопределение «seq_has_overflowed» In file included from /root/ipt-ratelimit-master/xt_ratelimit.c:30:0: include/linux/seq_file.h:55:60: замечание: здесь было предыдущее определение «seq_has_overflowed» scripts/Makefile.build:264: ошибка выполнения рецепта для цели «/root/ipt-ratelimit-master/xt_ratelimit.o» make[2]: *** [/root/ipt-ratelimit-master/xt_ratelimit.o] Ошибка 1 Makefile:1388: ошибка выполнения рецепта для цели «_module_/root/ipt-ratelimit-master» make[1]: *** [_module_/root/ipt-ratelimit-master] Ошибка 2 make[1]: выход из каталога «/usr/src/kernels/4.1.6-201.fc22.x86_64» Makefile:11: ошибка выполнения рецепта для цели «xt_ratelimit.ko» make: *** [xt_ratelimit.ko] Ошибка 2 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...