У меня TP-Link WR1043-ND с OpenWrt 12.09 (r36088, Linux 3.3.8). Существует мост под названием br-lan, соединяющий eth0.1 (маркированная VLAN для 4 портов LAN) и wlan0 (Wi-Fi). Также есть порт WAN на eth0.2. На данный момент я хочу попробовать пример в LARTC для классификации пакетов SSH внутри моста, чтобы они получали приоритет над другим трафиком. Мой компьютер подключен напрямую к маршрутизатору через br-lan для измерения, и между ними и ни в одном из портов маршрутизатора нет ничего другого.
Это моя настройка qdisc, прежде чем что-либо делать:
qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc mq 0: dev wlan0 root
Нет правил iptables, все сброшено и политика по умолчанию ACCEPT.
Вот соответствующий абзац LARTC, раздел 9.5.3.2:
Мы создадим это дерево:
1: root qdisc / | \ / | \ / | \ 1:1 1:2 1:3 classes | | | 10: 20: 30: qdiscs qdiscs sfq tbf sfq
band 0 1 2 Массовый трафик пойдет на 30 :, интерактивный трафик на 20: или 10 :.
Командные строки:
# tc qdisc add dev eth0 root handle 1: prio<br> This *instantly* creates classes 1:1, 1:2, 1:3 # tc qdisc add dev eth0 parent 1:1 handle 10: sfq<br> # tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000 # tc qdisc add dev eth0 parent 1:3 handle 30: sfq
Теперь посмотрим, что мы создали:
# tc -s qdisc ls dev eth0 qdisc sfq 30: Quantity 1514b Отправлено 0 байтов 0 пакетов (отброшено 0, превышено 0)
qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
qdisc sfq 10: quantum 1514b
Sent 132 bytes 2 pkts (dropped 0, overlimits 0)
qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 174 bytes 3 pkts (dropped 0, overlimits 0)
Это моя настройка qdisc после выполнения приведенных выше команд, полученная при запуске tc qdisc show:
qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc prio 1: dev br-lan root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc sfq 10: dev br-lan parent 1:1 limit 127p quantum 1514b depth 127 divisor 1024
qdisc tbf 20: dev br-lan parent 1:2 rate 20000bit burst 1600b lat 560.0ms
qdisc sfq 30: dev br-lan parent 1:3 limit 127p quantum 1514b depth 127 divisor 1024
qdisc mq 0: dev wlan0 root
Пример вывода tc -s qdisc ls dev br-lan:
qdisc prio 1: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 52544 bytes 528 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc sfq 10: parent 1:1 limit 127p quantum 1514b depth 127 divisor 1024
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc tbf 20: parent 1:2 rate 20000bit burst 1600b lat 560.0ms
Sent 23492 bytes 206 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc sfq 30: parent 1:3 limit 127p quantum 1514b depth 127 divisor 1024
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
Мои пакеты ssh неправильно классифицируются, и все отправляются на 20 :. То же самое с пакетами scp и всем остальным по сути.
Если я правильно понимаю, PRIO смотрит на поле TOS, чтобы узнать, в какой полосе установить пакет, и, согласно priomap, пакеты с TOS 0x10 (SSH) должны отправляться в полосу 0 (10 :), а они с TOS 0x08 (SCP) должен попасть в полосу 2 (30 :). Я подтвердил, что для пакетов правильно установлены TOS, посмотрев в wirehark на моем компьютере, а также что TOS попадает на маршрутизатор, просматривая вывод tcpdump внутри маршрутизатора. Но все равно все заканчивается в 20 :.
Есть идеи, почему?
Заранее спасибо.
Ознакомьтесь с руководством по эксплуатации prio
планировщик (man tc-prio
), чтобы увидеть, как биты TOS соотносятся с первичной картой. TOS 0x08 и TOS 0x10 соответствуют priomap entrien # 5 и # 9 соответственно, которые в вашем примере отображаются как на полосу 1, соответствующую qdisc 20:
Вы должны изменить priomap, чтобы пакеты TOS-LowDelay отправлялись на полосу 0