Przygotowałem coś takiego:
#!/bin/sh
insmod cls_fw > /dev/null
insmod sch_hfsc > /dev/null
insmod sch_sfq > /dev/null
insmod sch_red > /dev/null
insmod sch_htb > /dev/null
insmod cls_u32 > /dev/null
WAN=$(uci get network.wan.ifname)
echo "TC LAN"
tc qdisc del dev br-lan root
tc qdisc add dev br-lan root handle 1: htb
tc class add dev br-lan parent 1: classid 1:1 htb rate 512kbit
tc class add dev br-lan parent 1:1 classid 1:2 htb rate 200kbit ceil 512kbit prio 3
tc qdisc add dev br-lan parent 1:2 handle 2: sfq perturb 10
tc filter add dev br-lan parent 1: prio 3 protocol ip handle 2 fw flowid 1:2
iptables -t mangle -A POSTROUTING -s 172.16.104.0/24 -j MARK --set-mark 2
echo "TC WAN"
tc qdisc del dev eth0.2 root
tc qdisc add dev eth0.2 root handle 1: htb
tc class add dev eth0.2 parent 1: classid 1:1 htb rate 128kbit
tc class add dev eth0.2 parent 1:1 classid 1:2 htb rate 50kbit ceil 128kbit prio 3
tc qdisc add dev eth0.2 parent 1:2 handle 2: sfq perturb 10
tc filter add dev eth0.2 parent 1: prio 3 protocol ip handle 2 fw flowid 1:2
iptables -t mangle -A PREROUTING -d 172.16.104.0/24 -j MARK --set-mark 2
echo "END"
Faktycznie ogranicza download do 0,5Mbps, natomiast upload pozostaje nietknięty.
W czym może być problem?
2. Dlaczego dla oznaczania ruchu na cele ograniczenia downloadu obowiązuje regułka?:
iptables -t mangle -A POSTROUTING -s 172.16.104.0/24 -j MARK --set-mark 2
Ta regułka łapie pakiety, tuż przed wysłaniem do odbiorcy, pochodzące z mojej sieci lokalnej i znaczy je znacznikiem 0x2.
... a zawsze myślałem, że skoro to download to powinno być PREROUTING -d 172.16.104.0/24 (czyli ruch przychodzący nie ważne skąd, ale do mojej sieci).
Backfire (10.03.1, r29592)
USB Play Online (Huawei E173) + ExtRoot + Squid + Iptables