Jump to content

Recommended Posts

Posted (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 by aabc
  • Replies 380
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Posted

Здорово!

Есть пара вопросов:

1. Скорость трафика полисится в сторону ip, трафик от ip, или трафик в обе стороны?

2. В чем профит vs qdisc?

Posted (edited)

1. Скорость трафика полисится в сторону ip, трафик от ip, или трафик в обе стороны?

 

Зависит от параметра --ratelimit-mode, если он src, то будет матчится исходящий IP адрес, если dst, то адрес назначения.

 

2. В чем профит vs qdisc?

Выше enot ответил. В общем - простота использования. И отвязка от интерфейсов.

 

А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ???

 

Правила iptables можно комбинировать как обычно, а там есть -i и -o.

Edited by aabc
Posted

Первые тесты на трафике снятом сплиттерами.

Конфиг.

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, спасибо!

CPU.png

CPU2.png

pps_in.png

pps_in2.png

traf_in.png

traf_in2.png

pps_out.png

pps_out2.png

traf_out.png

traf_out2.png

Posted

А можно запилить версию, что бы не только по ip резать, но и по имени интерфейса, например, eth0, ppp25, vlan333 ???

 

Правила iptables можно комбинировать как обычно, а там есть -i и -o.

Но моя просьба состояла в том, что бы имя интерфейса можно было передавать в /proc/net/ipt_ratelimit/name,

т.е. оперативно управлять этим.

Posted

Например, добавление правила: # echo +10.0.0.1 1000000 187500 > /proc/net/ipt_ratelimit/name

Удаление правила: # echo -10.0.0.1 > /proc/net/ipt_ratelimit/name

Вам категорически не хватает возможности прикрепить к одному ведру несколько ip адресов. Иначе не получится красиво нарезать полосу для абонента с несколькими ip.

Posted

Вам категорически не хватает возможности прикрепить к одному ведру несколько 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

 

Зачем интерфейсы?

Posted

...

Зачем интерфейсы?

Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все)

Posted

Хм.

Кажется, тут надо отдельный модуль сделать, упрощённый до состояния -A FORWARD -i IF -m ratelimit_simple --ratelimit_rate=xxx -j DROP :)

Ну и поддержка подсетей, я думаю, появится в обозримом будущем.

Posted

я так понимаю сделав два правила

iptables --ratelimit-set name --ratelimit-mode src -j DROP

iptables --ratelimit-set name --ratelimit-mode dst -j DROP

 

можно полисить трафик в оба направления для абона (тачка без ната)

Posted (edited)

я так понимаю сделав два правила

iptables --ratelimit-set name --ratelimit-mode src -j DROP

iptables --ratelimit-set name --ratelimit-mode dst -j DROP

 

можно полисить трафик в оба направления для абона (тачка без ната)

Можно. В данном случае трафик будет суммироваться. Но, вряд ли такое практически кому-то нужно. Если нужны независимые лимиты, то нужно поставить --ratelimit-set с разными именами. ps. Возможно, стоит запретить использование set-а с одинаковым именем, чтоб не возникало такого недопонимания.

Edited by aabc
Posted

Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все)

 

Интерфейсы приделать теоретически возможно, но стоит ли усложнять концепцию. Просто подсети не подойдут? (Они планируются.)

Posted

Я клиентам иногда подсеть (4, реже 8 ip адресов) маршрутизирую на ip (выдаваемый через ppp). Придется через запятую все адреса перечислять, что не очень удобно. А так, указал имя интерфейса и все)

 

Интерфейсы приделать теоретически возможно, но стоит ли усложнять концепцию. Просто подсети не подойдут? (Они планируются.)

Думаю, что стоит!

Это будет более гибко.

Posted

Я бы добавил - одновременное ограничение v4 + v6 до какого-то общего значения, правда, не уверен что это возможно в рамках iptables...

Posted

Я бы добавил - одновременное ограничение v4 + v6 до какого-то общего значения, правда, не уверен что это возможно в рамках iptables...

Как раз для таких случаев одинаковые имена сетов можно оставить, чтоб загонять в один сет не пересекающийся трафик, ipv4 и ipv6.

Posted

Два разных абонента с разной скоростью требуют созданию двух сетов ?

При ограничении скорости по обоим направлениям - то уже 4 сета ?

Posted

Два разных абонента с разной скоростью требуют созданию двух сетов ?

Смысл сета в том, что в нем может конфигурироваться множество правил (для тысяч клиентов). Так что тут потребуется 1 сет, но в него должны быть добавлены два правила.

 

При ограничении скорости по обоим направлениям - то уже 4 сета ?

 

В этом случае два сета, по два правила в каждом.

Posted (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 by Susanin
Posted

Не стреляет...

[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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.