aabc Posted September 23, 2015 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
telecom Posted September 23, 2015 Posted September 23, 2015 Здорово! Есть пара вопросов: 1. Скорость трафика полисится в сторону ip, трафик от ip, или трафик в обе стороны? 2. В чем профит vs qdisc? Вставить ник Quote
enots Posted September 23, 2015 Posted September 23, 2015 btw, позволяет делать массово nat + policing на одной машине без извращений типа imq и ifb. Вставить ник Quote
telecom Posted September 23, 2015 Posted September 23, 2015 А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ??? Вставить ник Quote
aabc Posted September 23, 2015 Author 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
Igor Diakonov Posted September 23, 2015 Posted September 23, 2015 Могу добавить что при трафике 3/1 Гбит in/out работа модуля на загрузку CPU практически не влияет. Вставить ник Quote
dazgluk Posted September 23, 2015 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
telecom Posted September 23, 2015 Posted September 23, 2015 А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ??? Правила iptables можно комбинировать как обычно, а там есть -i и -o. Но моя просьба состояла в том, что бы имя интерфейса можно было передавать в /proc/net/ipt_ratelimit/name, т.е. оперативно управлять этим. Вставить ник Quote
sexst Posted September 23, 2015 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
Igor Diakonov Posted September 23, 2015 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
telecom Posted September 23, 2015 Posted September 23, 2015 ... Зачем интерфейсы? Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все) Вставить ник Quote
Igor Diakonov Posted September 23, 2015 Posted September 23, 2015 Хм. Кажется, тут надо отдельный модуль сделать, упрощённый до состояния -A FORWARD -i IF -m ratelimit_simple --ratelimit_rate=xxx -j DROP :) Ну и поддержка подсетей, я думаю, появится в обозримом будущем. Вставить ник Quote
martini Posted September 24, 2015 Posted September 24, 2015 я так понимаю сделав два правила iptables --ratelimit-set name --ratelimit-mode src -j DROP iptables --ratelimit-set name --ratelimit-mode dst -j DROP можно полисить трафик в оба направления для абона (тачка без ната) Вставить ник Quote
aabc Posted September 24, 2015 Author 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
martini Posted September 24, 2015 Posted September 24, 2015 отлично, идею понял, спасибо. Вставить ник Quote
aabc Posted September 24, 2015 Author Posted September 24, 2015 Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все) Интерфейсы приделать теоретически возможно, но стоит ли усложнять концепцию. Просто подсети не подойдут? (Они планируются.) Вставить ник Quote
telecom Posted September 24, 2015 Posted September 24, 2015 Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все) Интерфейсы приделать теоретически возможно, но стоит ли усложнять концепцию. Просто подсети не подойдут? (Они планируются.) Думаю, что стоит! Это будет более гибко. Вставить ник Quote
taf_321 Posted September 24, 2015 Posted September 24, 2015 Очень интересное решение. Но без подсетей пока грустно, и еще нужна поддержка IPv6. Вставить ник Quote
Igor Diakonov Posted September 24, 2015 Posted September 24, 2015 Я бы добавил - одновременное ограничение v4 + v6 до какого-то общего значения, правда, не уверен что это возможно в рамках iptables... Вставить ник Quote
aabc Posted September 25, 2015 Author Posted September 25, 2015 Я бы добавил - одновременное ограничение v4 + v6 до какого-то общего значения, правда, не уверен что это возможно в рамках iptables... Как раз для таких случаев одинаковые имена сетов можно оставить, чтоб загонять в один сет не пересекающийся трафик, ipv4 и ipv6. Вставить ник Quote
Susanin Posted September 25, 2015 Posted September 25, 2015 Два разных абонента с разной скоростью требуют созданию двух сетов ? При ограничении скорости по обоим направлениям - то уже 4 сета ? Вставить ник Quote
aabc Posted September 25, 2015 Author Posted September 25, 2015 Два разных абонента с разной скоростью требуют созданию двух сетов ? Смысл сета в том, что в нем может конфигурироваться множество правил (для тысяч клиентов). Так что тут потребуется 1 сет, но в него должны быть добавлены два правила. При ограничении скорости по обоим направлениям - то уже 4 сета ? В этом случае два сета, по два правила в каждом. Вставить ник Quote
Susanin Posted September 25, 2015 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
enots Posted September 25, 2015 Posted September 25, 2015 Так ? Да. При этом -i можно не указывать. Т.е. абонентских интерфейсов может быть много и внешних каналов тоже. Вставить ник Quote
sol Posted September 26, 2015 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
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.