Linux - приоритет сетевого трафика по IP

3701
goocreations

Я использую Ubuntu 12.10 и ищу способ формирования сетевого трафика на основе IP-адреса. У меня есть локальная сеть, скажем, с 192.168.1.2 - 192.168.1.254. Сервер находится на 192.168.1.1. Все IP-адреса должны иметь максимально возможную скорость сети (все порты, но Samba является фактическим виновником). В тот момент, когда подключается определенный диапазон IP или IP-адресов (например, 192.168.1.100), этому IP-адресу должна быть предоставлена ​​полная скорость, а скорость всех остальных IP-адресов должна быть снижена до минимума. Как только трафик IP-адресов завершен, скорость остальных подключенных IP-адресов должна быть восстановлена.

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

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

Может кто-нибудь помочь мне с помощью сценария или, может быть, программа, которая уже существует?

2

1 ответ на вопрос

2
JvO

tcэто путь. Хитрость в том, чтобы расставить приоритеты трафика, не ограничивая его.

http://www.lartc.org/howto/lartc.qdisc.classful.html, раздел 9.5.3 «Диско PRIO»; по умолчанию он создает 3 очереди, но вы можете проигнорировать третью. Самый простой подход был бы:

Создать очереди дисциплин (qdisc)

tc qdisc add dev eth0 root handle 1: prio  tc qdisc add dev eth0 parent 1:1 handle 10: sfq tc qdisc add dev eth0 parent 1:2 handle 20: sfq tc qdisc add dev eth0 parent 1:3 handle 30: sfq 

Все они имеют одинаковый алгоритм очереди; затем назначьте свои серверы (IP 192.168.1.0-127 в этом случае) для обработки 10:, а остальные 20::

tc filter add dev eth0 protocol ip parent 1:1 prio 1 u32 match ip dst 192.168.1.0/25 flowid 10: tc filter add dev eth0 protocol ip parent 1:2 prio 2 flowid 20: 

(Отказ от ответственности: с тех пор, как я коснулся этого материала, прошло много времени, возможно, вам придется поэкспериментировать со значениями после parentи flowid)

Использование диапазонов с степенями 2 намного проще, чем десятичные пределы. / 25 после IP-адреса игнорирует последние 7 бит IP-адреса, следовательно, диапазон от 0 до 127. Используйте / 26, чтобы ограничить диапазон до 0,63, если это необходимо.

На той же странице обсуждается Hierarchical Token Bucket, который является более тонким способом распределения пропускной способности. Хитрость заключается в том, чтобы создать 2 класса с перекосом полосы пропускания, скажем 1:10 (100 Мбит против 1000 Мбит). Это оставит некоторую пропускную способность для других ваших клиентов.

Кто-нибудь пробовал это? Я получаю следующую ошибку при запуске `add dev eth0 protocol ip parent 1: 1 prio 1 u32 match ip dst 10.0.0.1/32 flowid 10:`: `RTNETLINK answers: неверный аргумент. У нас ошибка при разговоре с ядром` PicoutputCls 6 лет назад 0
Проверьте имя интерфейса, на котором вы хотите добавить правила; Раньше это было 'eth0' для первой сетевой карты, но в последнее время имена различались. JvO 6 лет назад 1
Спасибо @JvO. В моем случае интерфейс по-прежнему `eth0`. PicoutputCls 6 лет назад 0