Próbuje sobie w końcu zrobić qos na swoim głównym routerze, z tym, że nie idzie mi coś. :]
Generalnie router ma dwa interfejsy, jeden LAN i drugi WAN, pakiety wędrują z jednego do drugiego i to co jest odbierane z LAN jest wysyłane przez WAN i odwrotnie. Pakiety mogą być w prosty sposób oznaczone przy pomocy iptables tylko na wyjściu interfejsu, a nie na wejściu, zatem mając do dyspozycji dwa interfejsy, z których każdy ma kolejkę wyjściową i wejściową, można u każdego z nich kontrolować to co z interfejsu wychodzi i w przypadku WAN to co wychodzi to jest upload, a w przypadku LAN, to co wychodzi to jest download -- chodzi o pobieranie/wysyłanie z internetu.
Chciałem zatem utworzyć dwa qdisc , po jednym dla eth0 i br-lan. Generalnie wszystkie regułki do TC są takie same w obu przypadkach jedynie się zmienia interfejs i numer główny kolejki. Upload działa bez problemu, zatem TC dobrze ogarnia interfejs WAN. Problem jest w przypadku LAN.
Poniżej jest blok dla interfejsu br-lan:
tc qdisc add dev $IF_LAN parent root handle 2:0 htb default 100 r2q 100
tc class add dev $IF_LAN parent 2:0 classid 2:1 htb rate 1000000kbit ceil 1000000kbit quantum 60000
tc class add dev $IF_LAN parent 2:1 classid 2:10 htb rate 15000kbit ceil 15000kbit
tc class add dev $IF_LAN parent 2:10 classid 2:100 htb rate 5000kbit ceil 15000kbit prio 1
tc class add dev $IF_LAN parent 2:10 classid 2:200 htb rate 6000kbit ceil 15000kbit prio 2
tc class add dev $IF_LAN parent 2:10 classid 2:300 htb rate 2000kbit ceil 15000kbit prio 3
tc class add dev $IF_LAN parent 2:10 classid 2:400 htb rate 2000kbit ceil 15000kbit prio 4
tc class add dev $IF_LAN parent 2:1 classid 2:20 htb rate 850000kbit ceil 1000000kbit quantum 60000
W skrócie, port jest 1gbit ale net może działać max z 15mbit przepustowością, zatem potrzebne są dwie kolejki podrzędne -- jedna na net, druga na lan, tak by nie ograniczyć transferu na lanie do 15mbitów. Wszystko co nie będzie miało -s 192.168.1.0/24 -d 192.168.1.0/24 będzie wędrować do kolejki 2:10 , czyli cały ruch internetowy. Pozostałe pakiety będą lecieć do 2:20. Kolejka od internetu nie może pożyczać sobie przydziału z kolejki od lanu ale lan może pożyczać od netu. Jeśli chodzi o sam net jeszcze, to są 4 podrzędne kolejki rozdzielające odpowiednie pakiety -- http i inne takie pójdą na jedną kolejkę, protokół icmp, pójdzie na drugą kolejkę, na 3 jeszcze nie wiem, a ostania z nich jest na te pakiety, które się do powyższych nie załapią, czyli np. torrent. Zależy mi generalnie na nadaniu torrentowi najmniejszego priorytetu tak by nie tłumił reszty ruchu.
Póki co jeszcze nie dodałem odpowiednich regułek, także cały transfer się zachowuje tak jakby było max 15/1 mbit dostępnego pasma , albo przynajmniej tak się powinien zachowywać.
Pakiety są oznaczane standardowo w iptables przy pomocy takiego bloku:
iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A POSTROUTING -o $IF_LAN -j qos_lan
iptables -t mangle -A POSTROUTING -o $IF_WAN -j qos_wan
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark
iptables -t mangle -A qos_lan -p tcp -m multiport --sports 80,443 -j MARK --set-mark 2
iptables -t mangle -A qos_lan -p tcp -m multiport --sports 80,443 -j RETURN
iptables -t mangle -A qos_lan -p icmp -j MARK --set-mark 1
iptables -t mangle -A qos_lan -p icmp -j RETURN
iptables -t mangle -A qos_wan -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2
iptables -t mangle -A qos_wan -p tcp -m multiport --dports 80,443 -j RETURN
iptables -t mangle -A qos_wan -p icmp -j MARK --set-mark 1
iptables -t mangle -A qos_wan -p icmp -j RETURN
Problem jest taki, że po mimo faktu ustawienia 15mbitów na kolejce, transfer jest co najmniej dziwny:
root@the-mountain:~# iperf -i 5 -t 30 -c 192.168.1.150
------------------------------------------------------------
Client connecting to 192.168.1.150, TCP port 5001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.1 port 52794 connected with 192.168.1.150 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 5.0 sec 640 KBytes 1.05 Mbits/sec
[ 3] 5.0-10.0 sec 512 KBytes 839 Kbits/sec
[ 3] 10.0-15.0 sec 640 KBytes 1.05 Mbits/sec
[ 3] 15.0-20.0 sec 512 KBytes 839 Kbits/sec
[ 3] 20.0-25.0 sec 512 KBytes 839 Kbits/sec
[ 3] 25.0-30.0 sec 512 KBytes 839 Kbits/sec
[ 3] 0.0-31.8 sec 3.38 MBytes 889 Kbits/sec
Powyższy test jest wykonany z routera do klienta w sieci, czyli testowany jest interfejs br-lan. Miało być 15mbitów, jest niecały 1mbit.
Jeśli bym zwiększył z 15mbitów na 30mbitów kolejkę, wtedy log wygląda inaczej:
root@the-mountain:~# iperf -i 5 -t 30 -c 192.168.1.150
------------------------------------------------------------
Client connecting to 192.168.1.150, TCP port 5001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.1 port 52795 connected with 192.168.1.150 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 5.0 sec 8.38 MBytes 14.1 Mbits/sec
[ 3] 5.0-10.0 sec 7.00 MBytes 11.7 Mbits/sec
[ 3] 10.0-15.0 sec 8.75 MBytes 14.7 Mbits/sec
[ 3] 15.0-20.0 sec 10.9 MBytes 18.2 Mbits/sec
[ 3] 20.0-25.0 sec 9.50 MBytes 15.9 Mbits/sec
[ 3] 25.0-30.0 sec 4.13 MBytes 6.92 Mbits/sec
[ 3] 0.0-30.1 sec 48.8 MBytes 13.6 Mbits/sec
30mbitów to też to nie jest ale jest przynajmniej prawie połowa, choć strasznie rozrzuca. 
Próbowałem ustawić tylko jedną kolejkę i nawet nie markować pakietów, tak by szły one do domyślnej kolejki, efekt był taki sam. Coś ogranicza dość poważnie transfer. Jest jakieś wytłumaczenie tego zjawiska? Czemu qos działa dobrze z interfejsem WAN, a z LAN coś się chrzani?