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

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

Ну 2к абонентов это примерно 2gbps, а вот кто 10gbps прогонял и какая загрузка cpu.

 

Есть большие подозрения что ipt-ratelimit будет много производительней.

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


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

On 2/17/2022 at 7:40 PM, nickD said:

а вот кто 10gbps

ip_ratelimit не работает над 4gbps.

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

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


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

11 часов назад, h3ll1 сказал:

ip_ratelimit не работает над 4gbps.

вы имеете в виду выставить ограничение на одного пользователя в 4gbps? У меня через ratelimit проходит 16gbps и прописано около 10к пользователей с тарифами до 300 mbps все прекрасно работает. И у меня есть большие подозрения что nftables такое не потянет ибо писался не для brass в отличии от ratelimit.

 

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


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

В 20.02.2022 в 18:00, nickD сказал:

вы имеете в виду выставить ограничение на одного пользователя в 4gbps? У меня через ratelimit проходит 16gbps и прописано около 10к пользователей с тарифами до 300 mbps все прекрасно работает. И у меня есть большие подозрения что nftables такое не потянет ибо писался не для brass в отличии от ratelimit.

16 гигабит пока вряд ли сможем организовать, но сейчас в процессе внедрения на месте, где прогоняется 4-6 гигабит. Один нюанс уже вылез - добавлять через add chain и add rule тысячи правил и чейнов не самая удачная идея. Всё ОЧЕНЬ неторопливо. Потому надо рисовать сразу цельный файл рулесета с чейнами и содержимым vmap. Тогда компиляция и вливание байткода в ядро происходят за десятые доли секунды.

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


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

В 20.02.2022 в 18:00, nickD сказал:

вы имеете в виду выставить ограничение на одного пользователя в 4gbps? У меня через ratelimit проходит 16gbps и прописано около 10к пользователей с тарифами до 300 mbps все прекрасно работает. И у меня есть большие подозрения что nftables такое не потянет ибо писался не для brass в отличии от ratelimit.

Что можно сказать после некоторого времени использования. Таки при нагрузке на 4-5 гигабитах при ~20 тыс чейнов и ~40 тыс элементов в vmap разницы с модульным ratelimit не замечено. Но только в рамках полисинга. При этом решение на nftables оказалось в целом на порядок менее требовальным к ресурсам процессора, чем связка iptables + ipset + ipt_ratelimit.

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


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

можете поделится конфигами?

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


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

Там всё достаточно просто:

 

table inet mangle {
    map poly_u_4 {
        type ipv4_addr : verdict
        flags interval
        counter
    }

    map poly_d_4 {
        type ipv4_addr : verdict
        flags interval
        counter
    }

    map poly_u_6 {
        type ipv6_addr : verdict
        flags interval
        counter
    }

    map poly_d_6 {
        type ipv6_addr : verdict
        flags interval
        counter
    }

    chain POSTROUTING {
        type filter hook postrouting priority mangle; policy accept;
        ip saddr vmap @poly_u_4
        ip6 saddr vmap @poly_u_6
        ip daddr vmap @poly_d_4
        ip6 daddr vmap @poly_d_6
    }
}

таблицы набиваем элементами вида:

 

table inet mangle {
	map poly_d_4 {
    	type ipv4_addr : verdict
    	flags interval
    	counter
    	elements = {
			100.64.0.1/32 : goto policer_dl_51776,
		}
	}
}

Сама нарезка в соотвествующем чейне

table inet mangle {
	chain policer_dl_51776 {
    	limit rate over 12500 kbytes/second burst 2500 kbytes counter drop
	}
}

И как упомянул, массово заливать в ядро тысячи правил и элементов через nft add будет грусть-печаль, поэтому приходится для компиляции подготавливать полноценный структурированный конфиг, а не набор команд на исполнение.

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


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

On 3/1/2022 at 9:24 PM, taf_321 said:

полноценный структурированный конфиг

Так точно - для самого 

table inet mangle

а не для всего конфига.

 

Также думаю, что если убрать counter (он же только дла дебага) будет еще лучше.

Еще если там НАТ, ВПН итд, надо развести download -> postrouting hook и upload -> prerouting hook.

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

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


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

В 02.03.2022 в 21:43, h3ll1 сказал:

Также думаю, что если убрать counter (он же только дла дебага) будет еще лучше.

Да, надо убрать на боевом применении. Только убирать counter из чейна на мой взгляд не стоит. Все-таки регулярно бывает ситуация, когда надо знать - потери пакетов от того что они просто теряются, или это работа полисера.

 

В 02.03.2022 в 21:43, h3ll1 сказал:

Еще если там НАТ, ВПН итд, надо развести download -> postrouting hook и upload -> prerouting hook.

Да. Запихал все в postrouting по старой привычке, когда настоящий шейпер работает исключительно для исходящего трафика.

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


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

 

@taf_321 @h3ll1 

Может заведёте отдельную темку и не будете офтопить здесь.

Изменено пользователем Стич

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


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

On 3/3/2022 at 10:29 AM, Стич said:

офтоп

Вижу что потеряли и стеряли все. ( github ).

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

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


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

Доброго времени суток, пришлось обновить ядро с 5.10.0 до 5.16.13, так как столкнулся с проблемой ipt_NETFLOW,

выполнил перезагрузку, но модуль xt_ratelimit не заработал

 

 modinfo xt_ratelimit:

filename:       /lib/modules/5.16.13/extra/xt_ratelimit.ko
alias:          ip6t_ratelimit
alias:          ipt_ratelimit
version:        0.3.2
license:        GPL
description:    iptables ratelimit policer mt module
author:         <abc@openwall.com>
srcversion:     44676FAD926FD7D68D1EF1A
depends:        x_tables
retpoline:      Y
name:           xt_ratelimit
vermagic:       5.10.0-11-amd64 SMP mod_unload modversions
parm:           hashsize:default size of hash table used to look up IPs (uint)

dmesg:

[   50.940314] xt_ratelimit: disagrees about version of symbol module_layout
modprobe xt_ratelimit
modprobe: ERROR: could not insert 'xt_ratelimit': Exec format error

 

Подскажите пожалуйста как фиксануть, заранее благодарен за ответы.

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


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

модуль надо пересобирать после смены ядра

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


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

On 3/10/2022 at 11:49 AM, passer said:

модуль надо пересобирать после смены ядра

Повторяю установку заново, проблему не решает...

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


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

Если модуль собран правильно, то вот такого быть не должно:
filename:       /lib/modules/5.16.13/extra/xt_ratelimit.ko
vermagic:       5.10.0-11-amd64 SMP mod_unload modversions

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


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

On 3/11/2022 at 8:43 AM, passer said:

Если модуль собран правильно, то вот такого быть не должно:
filename:       /lib/modules/5.16.13/extra/xt_ratelimit.ko
vermagic:       5.10.0-11-amd64 SMP mod_unload modversions

Я это понимаю, поэтому и спрашиваю как это исправить, выполняю все действия по установке:

apt install module-assistant
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
module-assistant is already the newest version (0.11.10).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded

 

 m-a prepare
Getting source for kernel version: 5.16.13
Kernel headers available in /lib/modules/5.16.13/build
apt-get install build-essential
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
build-essential is already the newest version (12.9).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Done!
 

 make all install
make: Nothing to be done for 'all'.
make -C /lib/modules/5.16.13/build/ M=/root/install/ipt-ratelimit modules_install INSTALL_MOD_PATH=
make[1]: Entering directory '/usr/src/linux-headers-5.16.13'
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
  INSTALL /lib/modules/5.16.13/extra/xt_ratelimit.ko
  DEPMOD  /lib/modules/5.16.13
Warning: modules_install: missing 'System.map' file. Skipping depmod.
make[1]: Leaving directory '/usr/src/linux-headers-5.16.13'
install -D libxt_ratelimit.so /usr/lib/x86_64-linux-gnu/xtables/libxt_ratelimit.so

 

depmod

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


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

перенеси куда-нить файлик /lib/modules/5.16.13/extra/xt_ratelimit.ko и попробуй ещё раз

 make uninstall && make clean && make all install && depmod -a

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


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

On 3/12/2022 at 11:31 PM, pppoetest said:

перенеси куда-нить файлик /lib/modules/5.16.13/extra/xt_ratelimit.ko и попробуй ещё раз

 make uninstall && make clean && make all install && depmod -a

Огромное спасибо, это решило проблему!

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


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

если добавляешь несколько ip в одну строку: echo "+10.0.0.1,10.0.0.2,10.0.0.3 100500 > /proc/net/ipt_ratelimit/..."

Может ли вывод cat /proc/net/ipt_ratelimit/... выдавать ip не в том порядке, в котором они были указаны при добавлении? Коллеги говорят что встречались с похожим, возможно было пару лет назад в предыдущих версиях?

По исходникам сходу пока не смог разобраться :(

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


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

Интересно, а что будет, если сделать так:

Цитата

echo @+192.168.1.0/24 20000000 > /proc/net/ipt_ratelimit/test

echo @+192.168.1.55/32 10000000 > /proc/net/ipt_ratelimit/test

примет ли полисер эту конфигу?

Если да, то как будет нарезаться скорость?

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

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


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

Для тех кто ставит на kernel 6.1 с iptables v1.8.9 нужно патчить libxt_ratelimit.c.

libxt_ratelimit.patch

patch < libxt_ratelimit.patch

https://github.com/aabc/ipt-ratelimit/issues/26
https://github.com/archlinux/aur/blob/a24ea0edbcdbb2ebe7256d5d3476a251457368ed/27.patch

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

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


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

Всем, привет!

 

Тестирую модуль, нарезает скорость прекрасно!

Решил сделать обвязку к билингу и нашел интересную багу (или фичу):

 

Цитата

root@n8:/tmp# echo +1.1.1.1,2.2.2.2,3.3.3.3 100000000 > /proc/net/ipt_ratelimit/rx0
root@n8:/tmp# cat /proc/net/ipt_ratelimit/rx0 |grep 1.1.1.1
1.1.1.1,2.2.2.2,3.3.3.3 cir 100000000 cbs 18750000 ebs 37500000; tc 0 te 0 last never; conf 0/0 0 bps, rej 0/0
root@n8:/tmp# echo -4.4.4.4,5.5.5.5,3.3.3.3 > /proc/net/ipt_ratelimit/rx0
root@n8:/tmp# cat /proc/net/ipt_ratelimit/rx0 |grep 1.1.1.1
root@n8:/tmp# 

Вопрос к разработчику, это нормально, когда добавляем и удаляем разные наборы ip?
 

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

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


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

1 час назад, r_cannibal сказал:

Всем, привет!

 

Тестирую модуль, нарезает скорость прекрасно!

Решил сделать обвязку к билингу и нашел интересную багу (или фичу):

 

Вопрос к разработчику, это нормально, когда добавляем и удаляем разные наборы ip?
 

Запомните, в linux ВСЁ И ВСЕГДА - НОРМАЛЬНО, а если для Вас что-то ненормально есть GPL и исходники.

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


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

собираю модуль на генту с ядром 6.1.28 и iptables 1.8.9

получаю

Скрытый текст

make -C /lib/modules/6.1.28-gentoo/build/ M=/usr/src/ipt-ratelimit modules
  CC [M]  /usr/src/ipt-ratelimit/xt_ratelimit.o
/usr/src/ipt-ratelimit/xt_ratelimit.c: В функции «parse_rule»:
/usr/src/ipt-ratelimit/xt_ratelimit.c:530:37: ошибка: этот оператор может провалиться [-Werror=implicit-fallthrough=]
  530 |                                 val = val / 8 + (val / 8 / 2);
      |                                 ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
/usr/src/ipt-ratelimit/xt_ratelimit.c:532:25: замечание: здесь
  532 |                         case 1:
      |                         ^~~~
/usr/src/ipt-ratelimit/xt_ratelimit.c:534:37: ошибка: этот оператор может провалиться [-Werror=implicit-fallthrough=]
  534 |                                 val *= 2;
      |                                 ~~~~^~~~
/usr/src/ipt-ratelimit/xt_ratelimit.c:536:25: замечание: здесь
  536 |                         case 2:
      |                         ^~~~
cc1: все предупреждения считаются ошибками
make[2]: *** [scripts/Makefile.build:250: /usr/src/ipt-ratelimit/xt_ratelimit.o] Ошибка 1
make[1]: *** [Makefile:2012: /usr/src/ipt-ratelimit] Ошибка 2
make: *** [Makefile:12: xt_ratelimit.ko] Ошибка 2

 

нашел выше патч (там одна строчка меняется (и патчил и ручками менял , без толку , получаю ):

Скрытый текст

make -C /lib/modules/6.1.28-gentoo/build/ M=/usr/src/ipt-ratelimit modules
  CC [M]  /usr/src/ipt-ratelimit/xt_ratelimit.o
/usr/src/ipt-ratelimit/xt_ratelimit.c: В функции «parse_rule»:
/usr/src/ipt-ratelimit/xt_ratelimit.c:530:37: ошибка: этот оператор может провалиться [-Werror=implicit-fallthrough=]
  530 |                                 val = val / 8 + (val / 8 / 2);
      |                                 ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
/usr/src/ipt-ratelimit/xt_ratelimit.c:532:25: замечание: здесь
  532 |                         case 1:
      |                         ^~~~
/usr/src/ipt-ratelimit/xt_ratelimit.c:534:37: ошибка: этот оператор может провалиться [-Werror=implicit-fallthrough=]
  534 |                                 val *= 2;
      |                                 ~~~~^~~~
/usr/src/ipt-ratelimit/xt_ratelimit.c:536:25: замечание: здесь
  536 |                         case 2:
      |                         ^~~~
cc1: все предупреждения считаются ошибками
make[2]: *** [scripts/Makefile.build:250: /usr/src/ipt-ratelimit/xt_ratelimit.o] Ошибка 1
make[1]: *** [Makefile:2012: /usr/src/ipt-ratelimit] Ошибка 2
make: *** [Makefile:12: xt_ratelimit.ko] Ошибка 2

 

если игнорю ошибки , то сошка собирается , а вот кошка ни как ... не хочется ядро откатывать ...

 

без этого блока собирается 

Скрытый текст

//<----><------>switch (i) {
//<----><------><------>case 0:
//<----><------><------><------>ent->car.cir = val / (HZ * BITS_PER_BYTE);
//<----><------><------><------>/* autoconfigure optimal parameters */
//<----><------><------><------>val = val / 8 + (val / 8 / 2);
//<----><------><------><------>/* FALLTHROUGH */
//<----><------><------>case 1:
//<----><------><------><------>ent->car.cbs = val;
//<----><------><------><------>val *= 2;
//<----><------><------><------>/* FALLTHROUGH */
//<----><------><------>case 2:
//<----><------><------><------>ent->car.ebs = val;
//<----><------>}

 

но скорости без них даже не добавляются :) (точнее одни нули)

 

да простят меня гуру С++ , но я вышел из положения так (заменил свитч простым иф)

Скрытый текст

if (i == 0){
                                ent->car.cir = val / (HZ * BITS_PER_BYTE);
                                /* autoconfigure optimal parameters */
                                val = val / 8 + (val / 8 / 2);
                                /* FALLTHROUGH */
}
else if (i == 1){
                                ent->car.cbs = val;
                                val *= 2;
                                /* FALLTHROUGH */
}
else if (i == 2){
                                ent->car.ebs = val;
}
 

 

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

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


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

@dee 

Не могу сказать, что хотел, сделать исходный автор с помощью case - надо смотреть логику, но ваш вариант с if  не эквивалентен, т.к. конструкции case являются точками входа, а не условиями, что-бы они стали эквивалентны вашему коду, в конце каждого блока case в исходниках должен был быть break; . Если исходный вариант верен, то ваш if должен выглядеть так:

 

Скрытый текст

if (i == 0){
                                ent->car.cir = val / (HZ * BITS_PER_BYTE);
                                /* autoconfigure optimal parameters */
                                val = val / 8 + (val / 8 / 2);
                                /* FALLTHROUGH */
}
if (( i == 1) || (i == 0) ){
                                ent->car.cbs = val;
                                val *= 2;
                                /* FALLTHROUGH */
}
 if ((i == 2)||( i == 1) || (i == 0)){
                                ent->car.ebs = val;
}

 

а компилятор честно предупредил, что будет оптимизировать присвоения, это важно, если вы например работаете в многопоточном приложении, где кто-то может одновременно с вами читать значения.

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


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

Join the conversation

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.