Скажу сразу - жёсткого разделения канала на полосы для различного  типа пакетов  (протоколы, порты, длина пакетов) мне не нужно было, просто хотелось, чтобы траффик, например, от dns или систем обмена мгновенными сообщениями был немного более интерактивным, нежли например загрузка файлов, где интерактивность не такая приоритетная задача. В результате моих поисков в интернете и перекапывания своих старых архивов мне удалось кое-чего состряпать. Итак, вот что вышло:  три очереди - одна под обмен сообщениями и служебный траффик (dns, icmp, ftp command, ssh, telnet, ntp), другая очередь - это траффик чуть менее интерактивный, а точнее icq, xmpp, irc, ещё одна очередь - это прочий траффик, вот как это выглядит в linux:

#!/bin/sh

for i in eth0 wlan0 ; do
    tc qdisc del dev $i root
    ip link set dev $i txqueue 660

    # prio packets by TOS
    tc qdisc add dev $i root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0

    tc qdisc add dev $i parent 1:1 handle 10: sfq perturb 100
    tc qdisc add dev $i parent 1:2 handle 20: sfq perturb 100
    tc qdisc add dev $i parent 1:3 handle 30: sfq perturb 100
    # after this most traffic goes to 3-rd queue
    # all high prio traffic must go to 1-st queue(ssh, dns, ping…)
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 53 0xffff flowid 1:1
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 53 0xffff flowid 1:1
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 23 0xffff flowid 1:1
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 23 0xffff flowid 1:1
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:1
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:1
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 21 0xffff flowid 1:1
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 21 0xffff flowid 1:1
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 123 0xffff flowid 1:1
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 123 0xffff flowid 1:1
    # icmp
    tc filter add dev $i parent 1: protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:1

# SYN
tc filter add dev $i parent 1: protocol ip prio 1 u32 \
                             match ip protocol 6 0xff \
                              match u8 0x05 0x0f at 0 \
                         match u16 0x0000 0xffc0 at 2 \
                             match u8 0x13 0xff at 33 \
                                           flowid 1:1
# ACK
tc filter add dev $i parent 1: protocol ip prio 1 u32 \
                           match ip protocol 0x6 0xff \
                              match u8 0x05 0x0f at 0 \
                             match u8 0x10 0xff at 33 \
                         match u16 0x0000 0xffc0 at 2 \
                                           flowid 1:1
# SYN-ACK
tc filter add dev $i parent 1: protocol ip prio 1 u32 \
                           match ip protocol 0x6 0xff \
                              match u8 0x05 0x0f at 0 \
                             match u8 0x12 0x12 at 33 \
                         match u16 0x0000 0xffc0 at 2 \
                                           flowid 1:1
# FIN
tc filter add dev $i parent 1: protocol ip prio 1 u32 \
                           match ip protocol 0x6 0xff \
                              match u8 0x05 0x0f at 0 \
                             match u8 0x01 0x01 at 33 \
                         match u16 0x0000 0xffc0 at 2 \
                                           flowid 1:1
# RST
tc filter add dev $i parent 1: protocol ip prio 1 u32 \
                           match ip protocol 0x6 0xff \
                              match u8 0x05 0x0f at 0 \
                             match u8 0x04 0x04 at 33 \
                         match u16 0x0000 0xffc0 at 2 \
                                           flowid 1:1
# DNS
tc filter add dev $i parent 1: protocol ip prio 1 u32 \
                          match ip protocol 0x11 0xff \
                             match ip dport 53 0xffff \
                                           flowid 1:1
#    im
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 5222 0xffff flowid 1:2
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 5222 0xffff flowid 1:2
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 5190 0xffff flowid 1:2
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 5190 0xffff flowid 1:2
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 6667 0xffff flowid 1:2
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 6667 0xffff flowid 1:2
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 6668 0xffff flowid 1:2
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 6668 0xffff flowid 1:2
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip sport 6669 0xffff flowid 1:2
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match ip dport 6669 0xffff flowid 1:2
# packet length 0-31 bytes
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match u16 0x0000 0xffe0 at 2 flowid 1:1
# length 64 - 127 bytes
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match u16 0x0000 0xffc0 at 2 flowid 1:1
# length 128 - 255 bytes
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match u16 0x0000 0xff00 at 2 flowid 1:2
# length 256 - 511 bytes
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match u16 0x0000 0xfe00 at 2 flowid 1:2
# length 512 - 1023 bytes
    tc filter add dev $i protocol ip parent 1: prio 1 u32 match u16 0x0000 0xfc00 at 2 flowid 1:2
    # all other minimise delay will go to 2 queue
    tc filter add dev $i parent 1:0 protocol ip prio 1 u32 match ip tos 0x10 0xff  flowid 1:2
    done
exit 0

Next Post