Jump to content
Калькуляторы

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

Чисто в теории, имхо, рулеж на базе меток - более верный и гибкий вариант.

 

Я уже писал выше про подобный вариант. Сейчас рулю у себя по метке skb->priority, но можно и fwmark как доп.вариант.

Share this post


Link to post
Share on other sites

А интересно, модуль можно с nDPI скрестить и приобрести зимовать траф по классам по абененту?

 

А как TBF (фильтр без очереди) может так делать? ("Так" - разные классы трафика в пределах одной полосы к одному абоненту.)

 

Единственное, в голову приходит идея с различными значениями burst для разных классов трафика. Где для более приоритетного трафика burst выше. Тогда в случае забивания канала он будет проходит в первую очередь.

Share this post


Link to post
Share on other sites

Я уже писал выше про подобный вариант. Сейчас рулю у себя по метке skb->priority, но можно и fwmark как доп.вариант.

 

Тоже считаю необходимым разбор по метками или приоритету, как дополнительную полезную плюшку, не портящую основной идеи модуля - "простой полисинг".

 

Единственное, в голову приходит идея с различными значениями burst для разных классов трафика. Где для более приоритетного трафика burst выше. Тогда в случае забивания канала он будет проходит в первую очередь.

 

Некий метод вытеснения выходит. У кого больше, то выше прыгнет, и быстрее пройдет. Так выходит?

Edited by bomberman

Share this post


Link to post
Share on other sites

Единственное, в голову приходит идея с различными значениями burst для разных классов трафика. Где для более приоритетного трафика burst выше. Тогда в случае забивания канала он будет проходит в первую очередь.

 

Некий метод вытеснения выходит. У кого больше, то выше прыгнет, и быстрее пройдет. Так выходит?

 

В полисинге ничего быстрее не ходит так как нет буфера, это просто фильтр.

 

В TBF размер ведёрка определяется значением burst, ведёрко постоянно опустошается со скоростью rate, если в ведёрке есть место для нового пакета - то он проходит фильтр (и его размер добавляется в ведёрко), если нет, то пакет отбрасывается. Соответственно, если для каких-то пакетов burst выше, то они будут проходить, когда пакеты с меньшим burst уже отбрасываются. Rate при этом будет в среднем одинаковый, кроме времени пока действует burst.

 

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

Share this post


Link to post
Share on other sites

Плохо в этой схеме то, что мне не известно, чтоб кто-то такое практически использовал

 

Тоже не встречал. Но попробовать думаю стоит. Хотя бы из интереса.

самое главное, не понятно какие значения ставить, чтоб получить то, что обычно хотят получить QOS.

 

Ну раз QOS, то наверное будет логично, для начала попробовать задать общую полосу, и потом вес для какждого типа. Но сумма всех весов в пределах общего канала выделенного для IP или (если несколько IP)подписчика.

Т.е. я пока это вижу как параметры напрмер:

IP,<speed - общая скорость для подписчика> <num_q - количество классов> <clss_id=1:speed(или вес в процентах от общей скорости)>...<clss_id=N:speed(или вес в процентах от общей скорости)>

 

Это первое что пришло на ум. А там быть может что ещё интереснее посоветуется.

Ну и + идентификация трафика/клиента не по IP или сегменту, а ещё и по внутренней метке, или по значению в поле QOS. Но в последнем случае общей скоростью как вариант - скорость самого интерфейса.

Share this post


Link to post
Share on other sites

В качестве идей.

PPS нужен, что-то в виде

echo +10.0.0.1 1000000 187500 pps> /proc/net/ipt_ratelimit/name

вместо pps подставлять цифру нужну, например 10000

 

если дальше пойдти, можно рассмотреть еще указание портов, чтобы отдельные правила в iptables не добавлять, на каждый порт или порты свой лимит для указанного IP.

Все это пригодится для фильтрования ддос-атак.

Share this post


Link to post
Share on other sites

скажите, почему может быть такое:

$ cat /proc/net/ipt_ratelimit/upload

...

cat: /proc/net/ipt_ratelimit/upload: Operation not permitted

$

Share this post


Link to post
Share on other sites

Так пишет же - нет прав.

сделайте

sudo cat /proc/net/ipt_ratelimit/upload

Share this post


Link to post
Share on other sites

Так пишет же - нет прав.

сделайте

sudo cat /proc/net/ipt_ratelimit/upload

=)

нет, дело не в этом. права там не нужны. я просто скипнул вывод cat'а до сообщения об ошибке.

boco@ipn2:~$ cat /proc/net/ipt_ratelimit/download |wc -l

1845

boco@ipn2:~$ cat /proc/net/ipt_ratelimit/upload |wc -l

cat: /proc/net/ipt_ratelimit/upload: Operation not permitted

1839

 

upd. все-таки придется proc_buf[] увеличить, "echo +192.168.253.0/24 10000000" разворачивается в 4001 байт =)

 

вопрос пока снимаю.

Share this post


Link to post
Share on other sites

Подскажите реально этим модулем нарезать скорости на разные зоны (локалка, мир, etc)?

Share this post


Link to post
Share on other sites

К сожалению в списках ratelimit нельзя указывать целые подсети, только конкретные IP адреса. Так что врят ли получится.

Share this post


Link to post
Share on other sites

А есть ли смысл мне с 1G трафика уходить с TC?

 

тарифы 10-100мбит

Share this post


Link to post
Share on other sites

Подскажите реально этим модулем нарезать скорости на разные зоны (локалка, мир, etc)?

 

Скорее можно, чем нет.

 

iptables -N LOCAL

iptables -N WORLD

iptables -A FORWARD -d xx.xx.xx.xx -j LOCAL

iptables -A FORWARD -d yy.yy.yy.yy -j LOCAL

iptables -A FORWARD -d zz.zz.zz.zz -j WORLD

iptables -A LOCAL -m ratelimit --ratelimit-set local-out --ratelimit-mode src -j DROP

iptables -A LOCAL -m ratelimit --ratelimit-set local-in --ratelimit-mode dst -j DROP

iptables -A WORLD -m ratelimit --ratelimit-set world-out --ratelimit-mode src -j DROP

iptables -A WORLD -m ratelimit --ratelimit-set world-in --ratelimit-mode dst -j DROP

iptables -A FORWARD -m ratelimit --ratelimit-set etc-out --ratelimit-mode src -j DROP

iptables -A FORWARD -m ratelimit --ratelimit-set etc-in --ratelimit-mode dst -j DROP

 

echo +10.0.0.1 10000000 > /proc/net/ipt_ratelimit/local-in

echo +10.0.0.1 10000000 > /proc/net/ipt_ratelimit/local-out

echo +10.0.0.1 1000000 > /proc/net/ipt_ratelimit/world-in

echo +10.0.0.1 1000000 > /proc/net/ipt_ratelimit/world-out

echo +10.0.0.1 512000 > /proc/net/ipt_ratelimit/etc-in

echo +10.0.0.1 512000 > /proc/net/ipt_ratelimit/etc-out

Share this post


Link to post
Share on other sites

Скорее можно, чем нет.

 

iptables -N LOCAL

iptables -N WORLD

iptables -A FORWARD -d xx.xx.xx.xx -j LOCAL

iptables -A FORWARD -d yy.yy.yy.yy -j LOCAL

iptables -A FORWARD -d zz.zz.zz.zz -j WORLD

iptables -A LOCAL -m ratelimit --ratelimit-set local-out --ratelimit-mode src -j DROP

iptables -A LOCAL -m ratelimit --ratelimit-set local-in --ratelimit-mode dst -j DROP

iptables -A WORLD -m ratelimit --ratelimit-set world-out --ratelimit-mode src -j DROP

iptables -A WORLD -m ratelimit --ratelimit-set world-in --ratelimit-mode dst -j DROP

iptables -A FORWARD -m ratelimit --ratelimit-set etc-out --ratelimit-mode src -j DROP

iptables -A FORWARD -m ratelimit --ratelimit-set etc-in --ratelimit-mode dst -j DROP

 

echo +10.0.0.1 10000000 > /proc/net/ipt_ratelimit/local-in

echo +10.0.0.1 10000000 > /proc/net/ipt_ratelimit/local-out

echo +10.0.0.1 1000000 > /proc/net/ipt_ratelimit/world-in

echo +10.0.0.1 1000000 > /proc/net/ipt_ratelimit/world-out

echo +10.0.0.1 512000 > /proc/net/ipt_ratelimit/etc-in

echo +10.0.0.1 512000 > /proc/net/ipt_ratelimit/etc-out

Я думал в этом направлении, но проблема в том, что на разных тарифах есть разные скорости на локалку и etc

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Скорее можно, чем нет.

 

iptables -N LOCAL

iptables -N WORLD

iptables -A FORWARD -d xx.xx.xx.xx -j LOCAL

iptables -A FORWARD -d yy.yy.yy.yy -j LOCAL

iptables -A FORWARD -d zz.zz.zz.zz -j WORLD

iptables -A LOCAL -m ratelimit --ratelimit-set local-out --ratelimit-mode src -j DROP

iptables -A LOCAL -m ratelimit --ratelimit-set local-in --ratelimit-mode dst -j DROP

iptables -A WORLD -m ratelimit --ratelimit-set world-out --ratelimit-mode src -j DROP

iptables -A WORLD -m ratelimit --ratelimit-set world-in --ratelimit-mode dst -j DROP

iptables -A FORWARD -m ratelimit --ratelimit-set etc-out --ratelimit-mode src -j DROP

iptables -A FORWARD -m ratelimit --ratelimit-set etc-in --ratelimit-mode dst -j DROP

 

echo +10.0.0.1 10000000 > /proc/net/ipt_ratelimit/local-in

echo +10.0.0.1 10000000 > /proc/net/ipt_ratelimit/local-out

echo +10.0.0.1 1000000 > /proc/net/ipt_ratelimit/world-in

echo +10.0.0.1 1000000 > /proc/net/ipt_ratelimit/world-out

echo +10.0.0.1 512000 > /proc/net/ipt_ratelimit/etc-in

echo +10.0.0.1 512000 > /proc/net/ipt_ratelimit/etc-out

Я думал в этом направлении, но проблема в том, что на разных тарифах есть разные скорости на локалку и etc

И в чём проблема? В моём примере 10 мбит на локалку, 1 мбит на мир и 512к на ETC

Share this post


Link to post
Share on other sites

Проблема в том, что у абонента А скорость на локалку будет 10 мбит, а у абонента Б будет на локалку 20 мбит.

Т.е. на одну и ту же зону разные скорости.

Share this post


Link to post
Share on other sites

#!/bin/sh

set_speed() {

 ABONENT=$1
 LOCAL=$2
 WORLD=$3
 ETC=$4

 echo +${ABONENT} $LOCAL > /proc/net/ipt_ratelimit/local-in
 echo +${ABONENT} $LOCAL > /proc/net/ipt_ratelimit/local-out
 echo +${ABONENT} $WORLD > /proc/net/ipt_ratelimit/world-in
 echo +${ABONENT} $WORLD > /proc/net/ipt_ratelimit/world-out
 echo +${ABONENT} $ETC > /proc/net/ipt_ratelimit/etc-in
 echo +${ABONENT} $ETC > /proc/net/ipt_ratelimit/etc-out
}

set_speed('10.0.0.1', 10000000, 1000000, 512000)
set_speed('10.0.0.2', 20000000, 2000000, 1000000)

 

За фигурные скобки в ${ABONENT} не уверен, что они нужны.

Share this post


Link to post
Share on other sites

sol

Интересно. Спасибо за участие. Попробую потестить.

Share this post


Link to post
Share on other sites
Попробую потестить.

 

Чего тестить-то? Дело верное! Сразу в продакшн.

Share this post


Link to post
Share on other sites

Проблема в том, что у абонента А скорость на локалку будет 10 мбит, а у абонента Б будет на локалку 20 мбит.

и что? в чем проблема указать для одного ип 10 мбит, а для второго - 20?

Share this post


Link to post
Share on other sites

NiTr0

и что? в чем проблема указать для одного ип 10 мбит, а для второго - 20?

Да прошу прощения. Сразу не понял как модуль работает. Сейчас разобрался, но почему то вот это правило

iptables -A FORWARD -m ratelimit --ratelimit-set etc-out --ratelimit-mode src -j DROP
iptables -A FORWARD -m ratelimit --ratelimit-set etc-in --ratelimit-mode dst -j DROP

 

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

Share this post


Link to post
Share on other sites
режет мне скорость на все, а те зоны что указал ранее и куда скорость должны быть выше игнорируются.

1. Перепишите по-русски.

2. iptables -n -v -L в студию.

Share this post


Link to post
Share on other sites

NiTr0

и что? в чем проблема указать для одного ип 10 мбит, а для второго - 20?

Да прошу прощения. Сразу не понял как модуль работает. Сейчас разобрался, но почему то вот это правило

iptables -A FORWARD -m ratelimit --ratelimit-set etc-out --ratelimit-mode src -j DROP
iptables -A FORWARD -m ratelimit --ratelimit-set etc-in --ratelimit-mode dst -j DROP

 

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

 

Вам надо вынести эти правила из FORWARD в отдельную цепочку, как показано выше в примере с LOCAL и WORLD. Иначе не понятно, как вы зоны делите.

 

Ну и некрасиво все правила запихивать в FORWARD. Все же фаервол не линейный, как во фре, а "процедурный".

Share this post


Link to post
Share on other sites

Просто приведу пример, как сделать можно.

 

iptables -N ratelim
iptables -N ratelocal
iptables -N rateworld
iptables -N rateetc
iptables -A FORWARD -j ratelim
iptables -A ratelim -d xx.xx.xx.xx -j ratelocal
iptables -A ratelim -d xx.xx.xx.xx -j RETURN
iptables -A ratelim -d yy.yy.yy.yy -j ratelocal
iptables -A ratelim -d yy.yy.yy.yy -j RETURN
iptables -A ratelim -d zz.zz.zz.zz -j rateworld
iptables -A ratelim -d zz.zz.zz.zz -j RETURN
iptables -A ratelim -j rateetc
iptables -A ratelocal -m ratelimit --ratelimit-set local-out --ratelimit-mode src -j DROP
iptables -A ratelocal -m ratelimit --ratelimit-set local-in --ratelimit-mode dst -j DROP
iptables -A rateworld -m ratelimit --ratelimit-set world-out --ratelimit-mode src -j DROP
iptables -A rateworld -m ratelimit --ratelimit-set world-in --ratelimit-mode dst -j DROP
iptables -A rateetc-m ratelimit --ratelimit-set etc-out --ratelimit-mode src -j DROP
iptables -A rateetc -m ratelimit --ratelimit-set etc-in --ratelimit-mode dst -j DROP

 

А еще лучше сделать селектор чрез ipset, если там больше, нежели 1 адрес.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now