LINUX.ORG.RU
ФорумAdmin

Деление канала интернета пополам через tc class, qdisc, filter


0

0

Есть подключения ppp0, vlan1 на роутере ASUS WL-500g Premium ver.1, LAN IP = 192.168.1.1, через которое шурует входящий и исходящий трафик. Далее, трафик через NAT (Network Address Translation) раскидывается на 192.168.1.2 и 192.168.1.3. Городская локальная сеть 10.0.0.0/8, домашняя локальная сеть 192.168.1.0/24.
Задача: делить пополам между 192.168.1.2 и 192.168.1.3 входящий и исходящий трафик ppp0 и vlan1.

На роутере:
{
$ uname -a
Linux 2.4.37.6 #9 2009-10-30 20:22:17 MSK mips GNU/Linux

$ ifconfig
br0 Link encap:Ethernet
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:30832903 errors:0 dropped:0 overruns:0 frame:0
TX packets:33561890 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2121901097 (1.9 GiB) TX bytes:1923506029 (1.7 GiB)

eth0 Link encap:Ethernet
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:65877064 errors:4133 dropped:0 overruns:133 frame:133
TX packets:64436656 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:898759444 (857.1 MiB) TX bytes:414717055 (395.5 MiB)
Interrupt:4 Base address:0x1000

eth1 Link encap:Ethernet
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:152915
TX packets:0 errors:232 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:12 Base address:0x2000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MULTICAST MTU:16436 Metric:1
RX packets:190082 errors:0 dropped:0 overruns:0 frame:0
TX packets:190082 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:26985441 (25.7 MiB) TX bytes:26985441 (25.7 MiB)

ppp0 Link encap:Point-to-Point Protocol
inet addr:94.138.13.114 P-t-P:172.16.0.6 Mask:255.255.255.255
UP POINTOPOINT RUNNING MULTICAST MTU:1400 Metric:1
RX packets:329914 errors:0 dropped:0 overruns:0 frame:0
TX packets:382028 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:193920950 (184.9 MiB) TX bytes:197216556 (188.0 MiB)

vlan0 Link encap:Ethernet
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:30832907 errors:0 dropped:0 overruns:0 frame:0
TX packets:33561890 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2245233103 (2.0 GiB) TX bytes:2057753589 (1.9 GiB)

vlan1 Link encap:Ethernet
inet addr:10.2.137.143 Bcast:10.2.143.255 Mask:255.255.248.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:35044165 errors:0 dropped:0 overruns:0 frame:0
TX packets:30874782 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1762714155 (1.6 GiB) TX bytes:2651943370 (2.4 GiB)
}

Почитал документацию к tc. Понял так: трафик устройств ppp0 и vlan1 идёт через устройство br0. Поэтому деление канала в скрипте ниже привязывается к устройству br0.

У корня означающего весь трафик 5 потомков:

(1) входящий WAN со скоростью 256kbit
(2) исходящий WAN со скоростью 256kbit
(3) входящий LAN со скоростью 102400kbit
(4) исходящий LAN со скоростью 102400kbit
(5) входящий и исходящий трафик непринадлежащий первым 4-м пунктам

У каждого узла из первых 4-х пунктов, по 2 потомка. Первый для 192.168.1.2, второй для 192.168.1.3, чтобы делить между 192.168.1.2 и 192.168.1.3 по отдельности входящий WAN, исходящий WAN, входящий LAN, исходящий LAN.

На сколько понял, через устройство br0 идут пакеты входящие и исходящие. Условия фильтрации пакетов:

для входящих LAN к 192.168.1.2: prio 15 u32 match ip src 10.0.0.0/8 u32 match ip dst 192.168.1.2
для входящих LAN к 192.168.1.3: prio 15 u32 match ip src 10.0.0.0/8 u32 match ip dst 192.168.1.3
для исходящих LAN от 192.168.1.2: prio 15 u32 match ip src 192.168.1.2 u32 match ip dst 10.0.0.0/8
для исходящих LAN от 192.168.1.3: prio 15 u32 match ip src 192.168.1.3 u32 match ip dst 10.0.0.0/8

для входящих WAN к 192.168.1.2: prio 20 u32 match ip dst 192.168.1.2
для входящих WAN к 192.168.1.3: prio 20 u32 match ip dst 192.168.1.3
для исходящих WAN от 192.168.1.2: prio 20 u32 match ip src 192.168.1.2
для исходящих WAN от 192.168.1.3: prio 20 u32 match ip src 192.168.1.3

Скрипт:

{
#/bin/sh

WAN_CEIL_DOWNLOAD=256
WAN_RATE_DOWNLOAD=128

WAN_CEIL_UPLOAD=256
WAN_RATE_UPLOAD=128

LAN_CEIL_DOWNLOAD=102400
LAN_RATE_DOWNLOAD=51200

LAN_CEIL_UPLOAD=102400
LAN_RATE_UPLOAD=51200

DEV=br0


# корень дерева 1:0, пакеты не удовлетворяющие всем условиям фильтров идут в очередь класса 1:9
tc qdisc add dev $DEV root handle 1:0 htb default 9


# класс 1:1 входящий WAN, потомок корня дерева 1:0
tc class add dev $DEV parent 1:0 classid 1:1 htb rate ${WAN_CEIL_DOWNLOAD}kbit

# класс 1:2 исходящий WAN, потомок корня дерева 1:0
tc class add dev $DEV parent 1:0 classid 1:2 htb rate ${WAN_CEIL_UPLOAD}kbit

# класс 2:1 входящий LAN, потомок корня дерева 1:0
tc class add dev $DEV parent 1:0 classid 2:1 htb rate ${LAN_CEIL_DOWNLOAD}kbit

# класс 2:2 исходящий LAN, потомок корня дерева 1:0
tc class add dev $DEV parent 1:0 classid 2:2 htb rate ${LAN_CEIL_UPLOAD}kbit


# входящий

# класс 10:2 для 192.168.1.2, WAN, потомок 1:1
tc class add dev $DEV parent 1:1 classid 10:2 htb rate ${WAN_RATE_DOWNLOAD}kbit ceil ${WAN_CEIL_DOWNLOAD}kbit

# класс 10:3 для 192.168.1.3, WAN, потомок 1:1
tc class add dev $DEV parent 1:1 classid 10:3 htb rate ${WAN_RATE_DOWNLOAD}kbit ceil ${WAN_CEIL_DOWNLOAD}kbit

# класс 20:2 для 192.168.1.2, LAN, потомок 2:1
tc class add dev $DEV parent 2:1 classid 20:2 htb rate ${LAN_RATE_DOWNLOAD}kbit ceil ${LAN_CEIL_DOWNLOAD}kbit

# класс 20:3 для 192.168.1.3, LAN, потомок 2:1
tc class add dev $DEV parent 2:1 classid 20:3 htb rate ${LAN_RATE_DOWNLOAD}kbit ceil ${LAN_CEIL_DOWNLOAD}kbit


# очередь 50:2 для класса 10:2, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 10:2 handle 50:2 sfq perturb 10

# очередь 50:3 для класса 10:3, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 10:3 handle 50:3 sfq perturb 10

# очередь 60:2 для класса 20:2, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 20:2 handle 60:2 sfq perturb 10

# очередь 60:3 для класса 20:3, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 20:3 handle 60:3 sfq perturb 10


# направление пакетов из корня 1:0 в очередь класса 20:2
tc filter add dev $DEV parent 1:0 protocol ip prio 15 u32 match ip src 10.0.0.0/8 u32 match ip dst 192.168.1.2 flowid 20:2

# направление пакетов из корня 1:0 в очередь класса 20:3
tc filter add dev $DEV parent 1:0 protocol ip prio 15 u32 match ip src 10.0.0.0/8 u32 match ip dst 192.168.1.3 flowid 20:3

# направление пакетов из корня 1:0 в очередь класса 10:2
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip dst 192.168.1.2 flowid 10:2

# направление пакетов из корня 1:0 в очередь класса 10:3
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip dst 192.168.1.3 flowid 10:3


# исходящий

# класс 30:2 для 192.168.1.2, WAN, потомок 1:2
tc class add dev $DEV parent 1:2 classid 30:2 htb rate ${WAN_RATE_UPLOAD}kbit ceil ${WAN_CEIL_UPLOAD}kbit

# класс 30:3 для 192.168.1.3, WAN, потомок 1:2
tc class add dev $DEV parent 1:2 classid 30:3 htb rate ${WAN_RATE_UPLOAD}kbit ceil ${WAN_CEIL_UPLOAD}kbit

# класс 40:2 для 192.168.1.2, LAN, потомок 2:2
tc class add dev $DEV parent 2:2 classid 40:2 htb rate ${LAN_RATE_UPLOAD}kbit ceil ${LAN_CEIL_UPLOAD}kbit

# класс 40:3 для 192.168.1.3, LAN, потомок 2:2
tc class add dev $DEV parent 2:2 classid 40:3 htb rate ${LAN_RATE_UPLOAD}kbit ceil ${LAN_CEIL_UPLOAD}kbit


# очередь 70:2 для класса 30:2, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 30:2 handle 70:2 sfq perturb 10

# очередь 70:3 для класса 30:3, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 30:3 handle 70:3 sfq perturb 10

# очередь 80:2 для класса 40:2, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 40:2 handle 80:2 sfq perturb 10

# очередь 80:3 для класса 40:3, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 40:3 handle 80:3 sfq perturb 10


# направление пакетов из корня 1:0 в очередь класса 40:2
tc filter add dev $DEV parent 1:0 protocol ip prio 15 u32 match ip src 192.168.1.2 u32 match ip dst 10.0.0.0/8 flowid 40:2

# направление пакетов из корня 1:0 в очередь класса 40:3
tc filter add dev $DEV parent 1:0 protocol ip prio 15 u32 match ip src 192.168.1.3 u32 match ip dst 10.0.0.0/8 flowid 40:3

# направление пакетов из корня 1:0 в очередь класса 30:2
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip src 192.168.1.2 flowid 30:2

# направление пакетов из корня 1:0 в очередь класса 30:3
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip src 192.168.1.3 flowid 30:3


# неклассифицированный

# неклассифицированные пакеты в условии "default 9" корня дерева направлены в очередь класса 1:9
tc class add dev $DEV parent 1:0 classid 1:9 htb

# очередь 19:0 для класса 1:9, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:9 handle 19:0 sfq perturb 10
}

Хотелось бы узнать мнения специалистов, правильно ли я составил скрипт деления канала пополам и понял теорию, применив на практике? Какие ошибки/недочёты заметили? Что бы Вы посоветовали? Заранее большое спасибо!

Wladimir
() автор топика
Ответ на: комментарий от Wladimir

Тот же скрипт, но с исправленными ошибками.

{
#/bin/sh

WAN_CEIL_DOWNLOAD=256
WAN_RATE_DOWNLOAD=128

WAN_CEIL_UPLOAD=256
WAN_RATE_UPLOAD=128

LAN_CEIL_DOWNLOAD=102400
LAN_RATE_DOWNLOAD=51200

LAN_CEIL_UPLOAD=102400
LAN_RATE_UPLOAD=51200

DEV=br0


# очистка
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null


# корень дерева 1:0, пакеты не удовлетворяющие всем условиям фильтров идут в очередь класса 1:9
tc qdisc add dev $DEV root handle 1:0 htb default 9


# класс 1:1 входящий WAN, потомок корня дерева 1:0
tc class add dev $DEV parent 1:0 classid 1:1 htb rate ${WAN_CEIL_DOWNLOAD}kbit

# класс 1:2 исходящий WAN, потомок корня дерева 1:0
tc class add dev $DEV parent 1:0 classid 1:2 htb rate ${WAN_CEIL_UPLOAD}kbit

# класс 1:3 входящий LAN, потомок корня дерева 1:0
tc class add dev $DEV parent 1:0 classid 1:3 htb rate ${LAN_CEIL_DOWNLOAD}kbit

# класс 1:4 исходящий LAN, потомок корня дерева 1:0
tc class add dev $DEV parent 1:0 classid 1:4 htb rate ${LAN_CEIL_UPLOAD}kbit


# входящий

# класс 1:11 для 192.168.1.2, WAN, потомок 1:1
tc class add dev $DEV parent 1:1 classid 1:11 htb rate ${WAN_RATE_DOWNLOAD}kbit ceil ${WAN_CEIL_DOWNLOAD}kbit

# класс 1:21 для 192.168.1.3, WAN, потомок 1:1
tc class add dev $DEV parent 1:1 classid 1:21 htb rate ${WAN_RATE_DOWNLOAD}kbit ceil ${WAN_CEIL_DOWNLOAD}kbit

# класс 1:31 для 192.168.1.2, LAN, потомок 1:3
tc class add dev $DEV parent 1:3 classid 1:31 htb rate ${LAN_RATE_DOWNLOAD}kbit ceil ${LAN_CEIL_DOWNLOAD}kbit

# класс 1:41 для 192.168.1.3, LAN, потомок 1:3
tc class add dev $DEV parent 1:3 classid 1:41 htb rate ${LAN_RATE_DOWNLOAD}kbit ceil ${LAN_CEIL_DOWNLOAD}kbit


# очередь 11:0 для класса 1:11, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:11 handle 11:0 sfq perturb 10

# очередь 21:0 для класса 1:21, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:21 handle 21:0 sfq perturb 10

# очередь 31:0 для класса 1:31, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:31 handle 31:0 sfq perturb 10

# очередь 41:0 для класса 1:41, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:41 handle 41:0 sfq perturb 10


# направление пакетов из корня 1:0 в очередь класса 1:31
tc filter add dev $DEV parent 1:0 protocol ip prio 15 u32 match ip src 10.0.0.0/8 match ip dst 192.168.1.2 flowid 1:31

# направление пакетов из корня 1:0 в очередь класса 1:41
tc filter add dev $DEV parent 1:0 protocol ip prio 15 u32 match ip src 10.0.0.0/8 match ip dst 192.168.1.3 flowid 1:41

# направление пакетов из корня 1:0 в очередь класса 1:11
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip dst 192.168.1.2 flowid 1:11

# направление пакетов из корня 1:0 в очередь класса 1:21
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip dst 192.168.1.3 flowid 1:21


# исходящий

# класс 1:12 для 192.168.1.2, WAN, потомок 1:2
tc class add dev $DEV parent 1:2 classid 1:12 htb rate ${WAN_RATE_UPLOAD}kbit ceil ${WAN_CEIL_UPLOAD}kbit

# класс 1:22 для 192.168.1.3, WAN, потомок 1:2
tc class add dev $DEV parent 1:2 classid 1:22 htb rate ${WAN_RATE_UPLOAD}kbit ceil ${WAN_CEIL_UPLOAD}kbit

# класс 1:32 для 192.168.1.2, LAN, потомок 1:4
tc class add dev $DEV parent 1:4 classid 1:32 htb rate ${LAN_RATE_UPLOAD}kbit ceil ${LAN_CEIL_UPLOAD}kbit

# класс 1:42 для 192.168.1.3, LAN, потомок 1:4
tc class add dev $DEV parent 1:4 classid 1:42 htb rate ${LAN_RATE_UPLOAD}kbit ceil ${LAN_CEIL_UPLOAD}kbit


# очередь 12:0 для класса 1:12, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:12 handle 12:0 sfq perturb 10

# очередь 22:0 для класса 1:22, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:22 handle 22:0 sfq perturb 10

# очередь 32:0 для класса 1:32, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:32 handle 32:0 sfq perturb 10

# очередь 42:0 для класса 1:42, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:42 handle 42:0 sfq perturb 10


# направление пакетов из корня 1:0 в очередь класса 1:32
tc filter add dev $DEV parent 1:0 protocol ip prio 15 u32 match ip src 192.168.1.2 match ip dst 10.0.0.0/8 flowid 1:32

# направление пакетов из корня 1:0 в очередь класса 1:42
tc filter add dev $DEV parent 1:0 protocol ip prio 15 u32 match ip src 192.168.1.3 match ip dst 10.0.0.0/8 flowid 1:42

# направление пакетов из корня 1:0 в очередь класса 1:12
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip src 192.168.1.2 flowid 1:12

# направление пакетов из корня 1:0 в очередь класса 1:22
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip src 192.168.1.3 flowid 1:22


# неклассифицированный

# неклассифицированные пакеты в условии "default 9" корня дерева направлены в очередь класса 1:9
tc class add dev $DEV parent 1:0 classid 1:9 htb rate 1000mbit

# очередь 19:0 для класса 1:9, алгоритм sfq с изменением алгоритма хеширования каждые 10 секунд
tc qdisc add dev $DEV parent 1:9 handle 19:0 sfq perturb 10
}

Оказалось, что идентификаторы 2:* не срабатывают. Убрал дубль u32, например, вместо "u32 match ip src 10.0.0.0/8 u32 match ip dst 192.168.1.2" теперь "u32 match ip src 10.0.0.0/8 match ip dst 192.168.1.2". Добавил "rate 1000mbit" для неклассифицированного трафика. Теперь скрипт на роутере выполняется без ошибок. Другой вопрос, действительно ли он делит канал пополам, как задумано? Буду тестить. У кого какие мысли, пишите. Спасибо.

Wladimir
() автор топика
Ответ на: комментарий от Wladimir

Согласно статистике, почему-то tc не обрабатывает исходящие пакеты, а только входящие:

{
$ tc -s class show dev br0

class htb 1:11 parent 1:1 leaf 11: prio 0 rate 128Kbit ceil 256Kbit burst 1762b cburst 1926b
Sent 7150 bytes 33 pkts (dropped 0, overlimits 0)
rate 27bps
lended: 33 borrowed: 0 giants: 0
tokens: 103630 ctokens: 56938

class htb 1:22 parent 1:2 leaf 22: prio 0 rate 128Kbit ceil 256Kbit burst 1762b cburst 1926b
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 110125 ctokens: 60185

class htb 1:1 root rate 256Kbit ceil 256Kbit burst 1926b cburst 1926b
Sent 2188597 bytes 1604 pkts (dropped 0, overlimits 0)
rate 28753bps 20pps
lended: 762 borrowed: 0 giants: 0
tokens: -36099 ctokens: -36099

class htb 1:32 parent 1:4 leaf 32: prio 0 rate 50Mbit ceil 100Mbit burst 67128b cburst 132657b
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 10484 ctokens: 10359

class htb 1:2 root rate 256Kbit ceil 256Kbit burst 1926b cburst 1926b
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 60185 ctokens: 60185

class htb 1:31 parent 1:3 leaf 31: prio 0 rate 50Mbit ceil 100Mbit burst 67128b cburst 132657b
Sent 2203158 bytes 38268 pkts (dropped 0, overlimits 0)
rate 27627bps 478pps
lended: 38268 borrowed: 0 giants: 0
tokens: 10477 ctokens: 10356

class htb 1:3 root rate 100Mbit ceil 100Mbit burst 132657b cburst 132657b
Sent 2203158 bytes 38268 pkts (dropped 0, overlimits 0)
rate 27864bps 483pps
lended: 0 borrowed: 0 giants: 0
tokens: 10356 ctokens: 10356

class htb 1:21 parent 1:1 leaf 21: prio 0 rate 128Kbit ceil 256Kbit burst 1762b cburst 1926b
Sent 2184275 bytes 1573 pkts (dropped 0, overlimits 0)
rate 28891bps 20pps backlog 2p
lended: 809 borrowed: 762 giants: 0
tokens: -32842 ctokens: -38779

class htb 1:12 parent 1:2 leaf 12: prio 0 rate 128Kbit ceil 256Kbit burst 1762b cburst 1926b
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 110125 ctokens: 60185

class htb 1:4 root rate 100Mbit ceil 100Mbit burst 132657b cburst 132657b
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 10359 ctokens: 10359

class htb 1:41 parent 1:3 leaf 41: prio 0 rate 50Mbit ceil 100Mbit burst 67128b cburst 132657b
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 10484 ctokens: 10359

class htb 1:42 parent 1:4 leaf 42: prio 0 rate 50Mbit ceil 100Mbit burst 67128b cburst 132657b
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 10484 ctokens: 10359

class htb 1:9 root leaf 19: prio 0 rate 1000Mbit ceil 1000Mbit burst 132657b cburst 132657b
Sent 126 bytes 3 pkts (dropped 0, overlimits 0)
rate 2bps
lended: 3 borrowed: 0 giants: 0
tokens: 10356 ctokens: 10356
}

Через классы входящего трафика 1:1 для WAN и 1:3 для LAN проходят пакеты. А через классы исходящего трафика 1:2 для WAN и 1:4 для LAN не проходят.
Почему tc не обрабатывает исходящие пакеты?

Wladimir
() автор топика

Много-много букаф.

Единственное, чего я здесь не увидел — так это деления исходящего канала.

nnz ★★★★
()
Ответ на: комментарий от nnz

Потому что исходящие пакеты через filter в tc не отлавливаются. А только входящие. Поэтому деление получилось для входящего трафика.

А как делить исходящий? Чтобы кто-то подсказал и была создана тема. Жаль, что людей знающих не оказалось.

Wladimir
() автор топика
Ответ на: комментарий от Wladimir

Имхо, вопрос выбора исходящего канала находится в компетенции отнюдь не шейпера (tc), а манглера (iptables) и полиси-роутинга (ip). Т.е. iptables выбирает канал, ip rule + ip route заворачивает в него пакет, после чего уже на конкретном устройстве tc шейпит трафик.

В свое время я написал в википедии пример стохастического деления исходящего трафика (для каждого нового соединения канал выбирается случайно). Смотреть начиная со слов «следующий пример планируется к переносу в еще не написанный раздел статьи». Там же есть описание, как сделать выбор в режиме round-robin (каналы перебираются по очереди).

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

Пример из man iptables:

# Добавляем счетчики на оба исходящих канала
iptables -t mangle -A POSTROUTING -o eth0 -j RATEEST --rateest-name eth0 --rateest-interval 250ms --rateest-ewma 0.5s
iptables -t mangle -A POSTROUTING -o ppp0 -j RATEEST --rateest-name ppp0 --rateest-interval 250ms --rateest-ewma 0.5s

# Маркируем новые соединения на основании загруженности канала
# Если (2.5МБит - загрузка_eth0) > (2МБит - загрузка_ppp0), выставить маркировку 1
iptables -t mangle -A select_prov -m conntrack --ctstate NEW -m rateest --rateest-delta --rateest1 eth0 --rateest-bps1 2.5mbit --rateest-gt --rateest2 ppp0 --rateest-bps2 2mbit -j CONNMARK --set-mark 1

# Если (2МБит - загрузка_ppp0) > (2.5МБит - загрузка_eth0), выставить маркировку 2
iptables -t mangle -A select_prov -m conntrack --ctstate NEW -m rateest --rateest-delta --rateest1 ppp0 --rateest-bps1 2mbit --rateest-gt --rateest2 eth0 --rateest-bps2 2.5mbit -j CONNMARK --set-mark 2 

nnz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.