Перейти к содержимому
Калькуляторы

ipt-ratelimit трафик полисинг в iptables

Приглашаю для тестирования модуля для ядра 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.

Изменено пользователем aabc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здорово!

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

btw, позволяет делать массово nat + policing на одной машине без извращений типа imq и ifb.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

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

 

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

 

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

Изменено пользователем aabc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Могу добавить что при трафике 3/1 Гбит in/out работа модуля на загрузку CPU практически не влияет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Конфиг.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

...

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хм.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

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

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

Изменено пользователем aabc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Очень интересное решение. Но без подсетей пока грустно, и еще нужна поддержка IPv6.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста, покажите на пальцах пример (наверное пятница действует) для :

Абонент А (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

Изменено пользователем Susanin

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так ?

 

Да. При этом -i можно не указывать. Т.е. абонентских интерфейсов может быть много и внешних каналов тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

[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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас