Here is a way to make QoS on an existent network. First thing to do is to measure the bandwidth of our wan link. Then we will add a Debian bridge just before our wan router. The example will show how to prioritize bandwidth to a remote IP (ex : 169.254.18.10).
root@host:~# apt-get install bridge-utils
Let's change our network interfaces name.
root@host:~# vi /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="b4:83:dc:c2:c4:b8", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="enp*", NAME="lan" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="a8:1b:11:c4:c2:2e", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="enp*", NAME="wan"
We set permanent bridge and we ask to launch /usr/local/sbin/iptables.sh script once br0 interface is up
root@host:~# vi /etc/network/interfaces
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo br0 iface lo inet loopback iface lan inet manual iface wan inet manual iface br0 inet static bridge_ports lan wan address 10.0.0.10 broadcast 10.0.0.255 netmask 255.255.255.0 gateway 10.0.0.254 up /usr/local/sbin/iptables.sh
Here is our QoS script. Let's say we have a 1Mo/s=8Mbit/s=8192kbit/s upload/download bandwidth. I will reserve 5500kbit to 7040kbit for traffic to 169.254.18.10 in upload and download. Default traffic will have 800kbit to 2048kbit. And finally I'll keep bandwidth for ssh traffic.
#!/bin/sh #iptables reset iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT #commands TC=/usr/bin/tc IP=/usr/bin/ip # load modules modprobe ifb numifbs=2 modprobe sch_fq_codel modprobe act_mirred modprobe br_netfilter #in order to netfilter aware about bridge traffic #QoS reset for IFB in ifb0 ; do $IP link set dev $IFB down done for IF in wan ifb0 lan ; do $TC qdisc del dev $IF root 2> /dev/null > /dev/null $TC qdisc del dev $IF ingress 2> /dev/null > /dev/null done iptables -t mangle -F for IFB in ifb0 ; do $IP link set dev $IFB up done modemif=wan #iptables rules if needed #iptables -t mangle -A POSTROUTING -o $modemif -p tcp -m tos --tos Minimize-Delay -j CLASSIFY --set-class 1:10 #iptables -t mangle -A POSTROUTING -o $modemif -p tcp --dport 53 -j CLASSIFY --set-class 1:10 #iptables -t mangle -A POSTROUTING -o $modemif -p tcp --dport 80 -j CLASSIFY --set-class 1:10 #iptables -t mangle -A PREROUTING -s tcp --dport 443 -j CLASSIFY --set-class 1:10 ############## #UPLOAD RULES# ############## #RULES tc qdisc add dev $modemif root handle 1: htb default 10 tc class add dev $modemif parent 1: classid 1:1 htb rate 7600kbit ceil 7600kbit #800kbit #ceil 1500kbit # burst 10k tc class add dev $modemif parent 1:1 classid 1:10 htb rate 800kbit ceil 2048kbit prio 2 # ceil 2000kbit prio 3 # burst 10k tc class add dev $modemif parent 1:1 classid 1:12 htb rate 5500kbit ceil 7040kbit prio 1 #ceil 300kbit prio 1 tc class add dev $modemif parent 1:1 classid 1:13 htb rate 80kbit ceil 200kbit prio 3 #ceil 300kbit prio 2 #FILTERS tc filter add dev $modemif protocol ip parent 1:0 prio 2 u32 match ip sport 22 0xffff flowid 1:13 #ssh traffic tc filter add dev $modemif protocol ip parent 1:0 prio 2 u32 match ip dport 22 0xffff flowid 1:13 #ssh traffic tc filter add dev $modemif protocol ip parent 1:0 prio 1 u32 match ip dst 169.254.18.10/32 flowid 1:12 #remote traffic ## Martin Devera, author of HTB, then recommends SFQ for beneath these classes: tc qdisc add dev $modemif parent 1:10 handle 10: sfq perturb 10 tc qdisc add dev $modemif parent 1:12 handle 20: sfq perturb 10 tc qdisc add dev $modemif parent 1:13 handle 30: sfq perturb 10 ################ #DOWNLOAD RULES# ################ #Create ingress on external interface tc qdisc add dev wan ingress handle ffff: #Forward all ingress traffic to the IFB device tc filter add dev wan parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev ifb0 #RULES tc qdisc add dev ifb0 root handle 2: htb default 10 tc class add dev ifb0 parent 2: classid 2:1 htb rate 7600kbit ceil 7600kbit tc class add dev ifb0 parent 2:1 classid 2:10 htb rate 800kbit ceil 2048kbit prio 3 tc class add dev ifb0 parent 2:1 classid 2:12 htb rate 5500kbit ceil 7040kbit prio 1 tc class add dev ifb0 parent 2:1 classid 2:13 htb rate 80kbit ceil 200kbit prio 2 #FILTERS tc filter add dev ifb0 protocol ip parent 2:0 prio 1 u32 match ip src 169.254.18.10/32 flowid 2:12 #traffic tc filter add dev ifb0 protocol ip parent 2:0 prio 2 u32 match ip sport 22 0xffff flowid 2:13 #ssh traffic tc filter add dev ifb0 protocol ip parent 2:0 prio 2 u32 match ip dport 22 0xffff flowid 2:13 #ssh traffic
root@host:~# tc -s class ls dev wan
root@host:~# tc -s qdisc ls dev wan
root@host:~# tc qdisc show
root@host:~# tc qdisc show dev wan
root@host:~# tc filter show dev wan
root@host:~# tc qdisc del dev wan root
Source : https://www.funtoo.org/Traffic_Control ; Gentoo Wiki
Contact :