Назад | Перейти на главную страницу

Формирование трафика Linux с использованием TC

Мое подключение к Интернету выглядит так:

Интернет <-128kbps link-> Cisco Router (Public IP) <-LAN-> Linux Router / server (Public IP) <-LAN-> Обычные ПК (Public IP)

Маршрутизатор Cisco:

Маршрутизатор Linux

Штатные ПК (их 4):

Я включил регистрацию пакетов iptables на маршрутизаторе Linux и иногда обнаруживаю, что:

Теперь, как я могу настроить маршрутизатор Linux для формирования трафика таким образом, чтобы:

  1. Поддерживайте максимальную скорость передачи, когда трафик идет между этими обычными ПК и сервером Linux.
  2. Уменьшите трафик во внешний мир, чтобы избежать засорения «исходящей» линии, используя всю (или почти всю) доступную пропускную способность (128 кбит / с). На трассировке больше нет «> 16 КБ исходящих секунд».
  3. Гарантия 24 кбит / с для каждого обычного ПК и 24 кбит / с для сервера Linux в любое время. (8bkps осталось на накладные расходы при необходимости). IOW, 5 (псевдо) «полос», по 24 кбит / с каждая.
  4. В случае, если какой-либо ПК не использует всю полосу пропускания, справедливо разделите свободную полосу пропускания между остальными передающими ПК.
  5. Отдавайте приоритет определенным пакетам (поиск DNS, контрольные пакеты), отбирайте приоритет у других (торрент !!!), ВНУТРИ каждого диапазона и не затрагивая другие диапазоны.

Я уже пометил (используя параметр IP-таблиц --set-xmark) каждый исходящий пакет для каждого ПК:

  1. Маршрутизатор Linux для внешнего мира, высокая приоритетность
  2. Маршрутизатор Linux во внешний мир, нормальный prio
  3. Маршрутизатор Linux для внешнего мира, низкая цена
  4. Первый обычный ПК для внешнего мира, высокая цена

... И так далее.

Каждый входящий пакет также маркируется по этой схеме, начиная с 16.

Прошу прощения за этот длинный вопрос, но я отказался от настройки с помощью команды tc, слишком мало документации по формированию трафика, и я не знаю, что делать дальше.

Предполагая, что eth0 - это 100-мегабитное соединение Ethernet с маршрутизатором Cisco, оно должно быть примерно таким (не так ли?):

tc qdisc add dev eth0 root handle 1: htb default 2
# 100 mbps
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
# To LAN traffic
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 99000kbit ceil 100mbit
# IN traffic
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 120kbit
# OUT traffic
tc class add dev eth0 parent 1:1 classid 1:4 htb rate 120kbit

# IN “bands” (one for each PC)
tc class add dev eth0 parent 1:3 classid 1:10 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:3 classid 1:11 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:3 classid 1:12 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:3 classid 1:13 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:3 classid 1:14 htb rate 24kbit ceil 120kbit

# OUT “bands” (one for each PC)
tc class add dev eth0 parent 1:4 classid 1:15 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:4 classid 1:16 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:4 classid 1:17 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:4 classid 1:18 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:4 classid 1:19 htb rate 24kbit ceil 120kbit

Получил бы мне что-то вроде этого:

+-----------------------------------------------------------+
|                      100 mbits (1:1)                      |
+---------+------------------------+------------------------+
| 99mbits |   120 kbits In (1:3)   |  120 kbits Out(1:4)    |
+  (1:2)  +----+----+----+----+----+----+----+----+----+----+
+---------+ PC1| PC2| PC3| PC4| PC5| PC1| PC2| PC3| PC4| PC5|
          |1:10|1:11|1:12|1:13|1:14|1:15|1:16|1:17|1:18|1:19|
          +----+----+----+----+----+----+----+----+----+----+

И для каждой группы:

# PC1, IN
tc qdisc add dev eth0 parent 1:10 handle 20: prio
tc qdisc add dev eth0 parent 20:1 handle 22: sfq perturb 10
tc qdisc add dev eth0 parent 20:2 handle 23: sfq perturb 10
tc qdisc add dev eth0 parent 20:3 handle 24: sfq perturb 10

# PC1, OUT
tc qdisc add dev eth0 parent 1:15 handle 21: prio
tc qdisc add dev eth0 parent 21:1 handle 25: sfq perturb 10
tc qdisc add dev eth0 parent 21:2 handle 26: sfq perturb 10
tc qdisc add dev eth0 parent 21:3 handle 27: sfq perturb 10

+--------------------++--------------------+
|       PC1 IN       ||      PC1 OUT       |
+--------------------++--------------------+
|     PRIO (20:0)    ||     PRIO (21:0)    |
|      |      |      ||      |      |      |
| Prio | Prio | Prio || Prio | Prio | Prio |
|   1  |   2  |   3  ||   1  |   2  |   3  |
|(20:1)|(20:2)|(20:3)||(21:1)|(21:2)|(21:3)|
+------+------+------++------+------+------+
|  SFQ |  SFQ |  SFQ ||  SFQ |  SFQ |  SFQ |
|(22:0)|(23:0)|(24:0)||(25:0)|(26:0)|(27:0)|
+------+------+------++------+------+------+

И так далее.

Правила должны быть такими

# PC1, OUT
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw flowid 21:1
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 2 fw flowid 21:2
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 21:3

# PC1, IN
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 16 fw flowid 20:1
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 17 fw flowid 20:2
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 18 fw flowid 20:3

и так далее.

Есть предложения, комментарии и т. Д.? (У меня нет опыта в этой области)

взглянуть Вот - это довольно простое руководство по использованию механизма htb qos. По сути, вы помечаете пакеты в iptables, а затем назначаете их различным запросам в зависимости от марки.

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

Что касается размера пакета - я не могу представить большой пакет размером 20 КБ. даже jumbo-кадры в ethernet короче [9kB].

редактировать: Как объясняет Some Guy, LEN - это длина дефрагментированного IP-пакета, а не размер кадра на проводе.

Что это за Cisco? Как правило, формирование можно выполнять и на IOS, это может быть немного проще в настройке, чем Linux tc.