aabc Опубликовано 23 сентября, 2015 (изменено) · Жалоба Приглашаю для тестирования модуля для ядра 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. Изменено 30 декабря, 2015 пользователем aabc Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
telecom Опубликовано 23 сентября, 2015 · Жалоба Здорово! Есть пара вопросов: 1. Скорость трафика полисится в сторону ip, трафик от ip, или трафик в обе стороны? 2. В чем профит vs qdisc? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
enots Опубликовано 23 сентября, 2015 · Жалоба btw, позволяет делать массово nat + policing на одной машине без извращений типа imq и ifb. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
telecom Опубликовано 23 сентября, 2015 · Жалоба А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ??? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
aabc Опубликовано 23 сентября, 2015 (изменено) · Жалоба 1. Скорость трафика полисится в сторону ip, трафик от ip, или трафик в обе стороны? Зависит от параметра --ratelimit-mode, если он src, то будет матчится исходящий IP адрес, если dst, то адрес назначения. 2. В чем профит vs qdisc? Выше enot ответил. В общем - простота использования. И отвязка от интерфейсов. А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ??? Правила iptables можно комбинировать как обычно, а там есть -i и -o. Изменено 23 сентября, 2015 пользователем aabc Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Igor Diakonov Опубликовано 23 сентября, 2015 · Жалоба Могу добавить что при трафике 3/1 Гбит in/out работа модуля на загрузку CPU практически не влияет. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dazgluk Опубликовано 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, спасибо! Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
telecom Опубликовано 23 сентября, 2015 · Жалоба А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ??? Правила iptables можно комбинировать как обычно, а там есть -i и -o. Но моя просьба состояла в том, что бы имя интерфейса можно было передавать в /proc/net/ipt_ratelimit/name, т.е. оперативно управлять этим. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
sexst Опубликовано 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. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Igor Diakonov Опубликовано 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 Зачем интерфейсы? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
telecom Опубликовано 23 сентября, 2015 · Жалоба ... Зачем интерфейсы? Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Igor Diakonov Опубликовано 23 сентября, 2015 · Жалоба Хм. Кажется, тут надо отдельный модуль сделать, упрощённый до состояния -A FORWARD -i IF -m ratelimit_simple --ratelimit_rate=xxx -j DROP :) Ну и поддержка подсетей, я думаю, появится в обозримом будущем. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
martini Опубликовано 24 сентября, 2015 · Жалоба я так понимаю сделав два правила iptables --ratelimit-set name --ratelimit-mode src -j DROP iptables --ratelimit-set name --ratelimit-mode dst -j DROP можно полисить трафик в оба направления для абона (тачка без ната) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
aabc Опубликовано 24 сентября, 2015 (изменено) · Жалоба я так понимаю сделав два правила iptables --ratelimit-set name --ratelimit-mode src -j DROP iptables --ratelimit-set name --ratelimit-mode dst -j DROP можно полисить трафик в оба направления для абона (тачка без ната) Можно. В данном случае трафик будет суммироваться. Но, вряд ли такое практически кому-то нужно. Если нужны независимые лимиты, то нужно поставить --ratelimit-set с разными именами. ps. Возможно, стоит запретить использование set-а с одинаковым именем, чтоб не возникало такого недопонимания. Изменено 24 сентября, 2015 пользователем aabc Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
martini Опубликовано 24 сентября, 2015 · Жалоба отлично, идею понял, спасибо. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
aabc Опубликовано 24 сентября, 2015 · Жалоба Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все) Интерфейсы приделать теоретически возможно, но стоит ли усложнять концепцию. Просто подсети не подойдут? (Они планируются.) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
telecom Опубликовано 24 сентября, 2015 · Жалоба Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все) Интерфейсы приделать теоретически возможно, но стоит ли усложнять концепцию. Просто подсети не подойдут? (Они планируются.) Думаю, что стоит! Это будет более гибко. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
taf_321 Опубликовано 24 сентября, 2015 · Жалоба Очень интересное решение. Но без подсетей пока грустно, и еще нужна поддержка IPv6. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Igor Diakonov Опубликовано 24 сентября, 2015 · Жалоба Я бы добавил - одновременное ограничение v4 + v6 до какого-то общего значения, правда, не уверен что это возможно в рамках iptables... Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
aabc Опубликовано 25 сентября, 2015 · Жалоба Я бы добавил - одновременное ограничение v4 + v6 до какого-то общего значения, правда, не уверен что это возможно в рамках iptables... Как раз для таких случаев одинаковые имена сетов можно оставить, чтоб загонять в один сет не пересекающийся трафик, ipv4 и ipv6. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Susanin Опубликовано 25 сентября, 2015 · Жалоба Два разных абонента с разной скоростью требуют созданию двух сетов ? При ограничении скорости по обоим направлениям - то уже 4 сета ? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
aabc Опубликовано 25 сентября, 2015 · Жалоба Два разных абонента с разной скоростью требуют созданию двух сетов ? Смысл сета в том, что в нем может конфигурироваться множество правил (для тысяч клиентов). Так что тут потребуется 1 сет, но в него должны быть добавлены два правила. При ограничении скорости по обоим направлениям - то уже 4 сета ? В этом случае два сета, по два правила в каждом. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Susanin Опубликовано 25 сентября, 2015 (изменено) · Жалоба Пожалуйста, покажите на пальцах пример (наверное пятница действует) для : Абонент А (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 Изменено 25 сентября, 2015 пользователем Susanin Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
enots Опубликовано 25 сентября, 2015 · Жалоба Так ? Да. При этом -i можно не указывать. Т.е. абонентских интерфейсов может быть много и внешних каналов тоже. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
sol Опубликовано 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 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...