Шейпер трафика в Линукс

Автор Black Kulya, 07 Березень 2008, 11:33:17

Попередня тема - Наступна тема

Black Kulya

Такая вот задача: нужно ограничивать пользователям Интерне-трафик автоматически в зависимости от загруженности канала. Причем должна быть возможность устанавливать разные правила для разных ip, так как присутствуют V.I.P. пользователи. Надеюсь бывалые линуксоиды мне что-то подскажут. Заранее благодарен

snegoviK

#1
Этот ответ касается и FalseMan, который задавал похожий вопрос на конфе ДПК. Вам не нужны никакие специальные программы для создания продвинутого рутера используя Linux. В отличии от Windows, в Linux всё уже есть. Ответ прост - iptables. Гайдов на эту тему полно, вот несколько ссылок после 5 минут гуглинга:

HOW TO BUILD MY LINUX ROUTER
http://www.linuxjournal.com/article/5826
http://www.networknewz.com/networknewz-10-20030806BuildingALinuxRouter.html
http://www.gentoo.org/doc/en/home-router-howto.xml
http://gentoo-wiki.com/HOWTO_Gentoo_Router_for_2_ISP,_load_balancing,_switch_traffic_if_link_is_down/up (With load-balancing between 2 ISPs)
http://www.gentoo.ro/doc/en/ipv6.xml (IPv6)

TRAFFIC SHAPING ON LINUX
http://www.knowplace.org/pages/howtos/traffic_shaping_with_linux.php
http://lartc.org/ (см. pdf, там очень хороший гайд, правда он напорядок сложнее чем простые step-by-step гайды)
http://blog.kovyrin.net/2006/04/06/5min-guide-to-linux-shaping-htb/
http://www.securityfocus.com/infocus/1285

Принцип работы довольно простой:
1) У вас есть компьютер с Linux в котором установлены 2 сетевых карты - 1 для подключения к Интернету (например, к ADSL модему), 2-я для подключения к LAN. Если у вас больше чем 2 машины в сети (вкл. ваш Linux рутер), вам также понадобится свич, для подключения компьютеров к рутеру.
2) Все остальные машины в сети устанавливают адрес Linux, как адрес шлюза. Например, если IP Linux машины 192.168.0.1, то адрес соотв.
3) После этого вы настраиваете Linux файрвол, рутинг таблицы и т.д. по вашему желанию. Вы даже можете установить DHCP сервер если вам не хочется возиться со статичными IP (всё зависит от того, насколько вы комфортно себя чувствуете работая в Linux). [как составлять скрипт - смотрите ссылки выше]
4) Когда скрипт готов, для удобства, можно сделать так, чтобы он автоматически загружался при включении системы (папка rc.d или как там).

Вот и всё. Если есть еще вопросы - обращайтесь. Если я что-то неправильно написал, гуру попозже на форум зайдут, исправят. :)

Black Kulya

Я ведь сказал, мне надо правила для ограничения трафика автоматически и для каждого пользователя по отдельности, т.е. с привязкой к ip. Поэтому, насколько я понял, iptables не катит. Все эти руководства я раза по три через себя пропустил, хотя может что-то неправильно понял--тогды напрвте меня на путь истинный.

snegoviK

#3
Что-то не верится, что вы "пропустили по 3 раза". Вот смотрите, вслепую кликнул линк:

Цитата: http://blog.kovyrin.net/2006/04/06/5min-guide-to-linux-shaping-htb/# class for my incoming traffic
RATE=256Kbit
CEIL=512Kbit
LEAF=sfq
RULE=192.168.0.2 # this is my ip
PRIO=20

вот вам и правило (одно из) для опр. IP.

Что именно значит автоматически? Кто загружает канал? И чей трафик ограничивается?

Я по-моему вас понял. Скажем в 6 вечера обычно все заходят в инет и вы хотите ограничить скорость каждого, чтобы никто не наглел. :) Это сложнее. Я точно не могу вам ответить на ваш вопрос, но впринципе, у вас может быть две конфигурации для трафика - одна англим, другая с ограничениями. Вы можете написать скрипт, который будет проверять загруженность канала каждый час (?) и соответсвенно загружать те или другие правила. Или можно сделать проще - после пяти-шести вечера (или когда у вас там час-пик) вступают в действие ограничения и через какое-то время (например, поздно ночью или рано утром) снова вступает в действие анлим.

Как это сделать (что именно писать) и можно ли достичь той же цели не используя доп. скриптов (то есть, просто используя iptables и т.д.)? Тут я уже не смогу вам помочь, но на этом форуме есть более опытные пользователи, ждём ответов от них. :)

Black Kulya

Прошу прощения, я неясно поставленную передо мной задачу. Функцию ограничения трафика для определенного ip не проблема. Причем гораздо легче это сделать уитлиткой rshaper. А вот чтобы это делалось в зависимости от текущей загруженности канала--это проблема. Самое обидное что для винды таких вещей просто валом.

snegoviK

#5
Я выше написал, что можно написать скрипт, который будет запускаться каждый час (например).

1) В скрипте вы проверяете загруженность канала на данный момент UP/DOWN. (используя iptables и складывая показатели определённых чейнов).

2) В зависимости от показателей вы выставляете новые правила.  Какие это правила? Зависит от ваших потребностей. Например, скажем ваш upload 256 Kbit/s. После проверки загруженности канала, вы посчитали, что загруженность составляет 90%. В этом случае вы можете ограничить upload каждого клиента до X Кbit/s. Или загруженность составляет ниже 50%, в этом случае правила Unlimited.

Руководство по написанию шелл скриптов вы можете найти в Интернете. Их полно. Для вашей задачи ничего сложного не нужно, несколько grep-ов для того чтобы получить нужную информацию из той или иной команды, парочка If-Else If-Else и сами команды, которые будут изменять правила.