#!/bin/sh # See http://lartc.org/howto/lartc.cookbook.fullnat.intro.html # Basic setup: # Root class has no bandwidth limit (to allow unlimited LAN->LAN traffic) # The first-level class has two sub-classes: # 1: is out of LAN to internet # 2: is to LAN # Each second-level class is a host on the LAN (10,11,12,etc) # The third-level classes are the QOS classes (110,111,112,etc) # Filtering to LAN destination host is done by tc filters instead # of iptables filters because tc filters happen after the NAT # translation. # # On the other hand, filtering to find the originating LAN # host on outbound packets must be done by the iptables mangle # tables since it sees the packets before their source IP is changed # by NAT. # NOTE: Remember that all handle numbers in tc are hex! # External interface EX_IF=vlan1 export EX_IF # LAN interface LAN_IF=vlan0 export LAN_IF # Maximum bandwidth of DSL connection DOWN_CEIL=1300kbit UP_CEIL=340kbit # Maximum bandwidth of LAN connection (symmetric) LAN_CEIL=2000kbit # Queue length (in packets?) of network devices # Does this affect VoIP quality? I don't have time to test. # # vlan0 and vlan1 are the virtual devices, but the packets finally # go through eth0 and eth1, so to prevent poor performance shorten # the qlen on these devices too. echo "Setting qlen for eth0 to 2" ip link set dev eth0 qlen 2 echo "Setting qlen for eth1 to 2" ip link set dev eth1 qlen 2 echo "Setting qlen for $EX_IF to 0" ip link set dev $EX_IF qlen 0 echo "Setting qlen for $LAN_IF to 0" ip link set dev $LAN_IF qlen 0 MTU=400 echo "Setting mtu=$MTU for eth0 to prevent VOIP jitter" ip link set eth0 mtu $MTU echo "Setting mtu=$MTU for eth1 to prevent VOIP jitter" ip link set eth1 mtu $MTU echo "Setting mtu=$MTU for vlan0 to prevent VOIP jitter" ip link set vlan0 mtu $MTU echo "Setting mtu=$MTU for vlan1 to prevent VOIP jitter" ip link set vlan1 mtu $MTU # Default connection parameters DEFAULT_HOST_DOWN_RATE=$DOWN_CEIL DEFAULT_HOST_DOWN_CEIL=$DOWN_CEIL DEFAULT_HOST_UP_RATE=$UP_CEIL DEFAULT_HOST_UP_CEIL=$UP_CEIL DEFAULT_PRIO_DOWN_RATE=500kbps DEFAULT_PRIO_DOWN_CEIL=$DOWN_CEIL DEFAULT_PRIO_UP_RATE=100kbps DEFAULT_PRIO_UP_CEIL=$UP_CEIL DEFAULT_BULK_DOWN_RATE=$DOWN_CEIL DEFAULT_BULK_DOWN_CEIL=$DOWN_CEIL DEFAULT_BULK_UP_RATE=$UP_CEIL DEFAULT_BULK_UP_CEIL=$UP_CEIL LAN_IP_RANGE="192.168.0.0/24" echo "Deleting any old qdiscs for $EX_IF and $LAN_IF" tc qdisc del dev $EX_IF root tc qdisc del dev $LAN_IF root echo "Clearing iptables mangle table" iptables -t mangle -F iptables -t mangle -X iptables -t mangle -Z # Step here if the command-line option was "stop" [ "$1" = "stop" ] && exit 0 # --------------------------------------------------------------------- echo "Creating $EX_IF htb root (qdisc 1:) and parent class (class 1:) default 2:0x99" tc qdisc add dev $EX_IF root handle 1: htb default 0x99 tc class add dev $EX_IF parent 1: classid 1:1 htb \ rate $UP_CEIL ceil $UP_CEIL echo "Creating $LAN_IF htb root (qdisc 2:) and parent class (class 2:) default 2:0x99" tc qdisc add dev $LAN_IF root handle 2: htb default 0x99 tc class add dev $LAN_IF parent 2: classid 2:1 htb \ rate $LAN_CEIL ceil $LAN_CEIL #echo "Setting up fair queuing for $EX_IF and $LAN_IF for parent classes" #tc qdisc add dev $EX_IF parent 1:1 sfq perturb 10 #tc qdisc add dev $LAN_IF parent 2:1 sfq perturb 10 # --------------------------------------------------------------------- # --------------------------------------------------------------------- echo "Creating host classes" # --------------------------------------------------------------------- echo "Sending all traffic local to router to an unlimited queue (:10)" # Currently, no traffic ends up in this class, not sure why tc class add dev $EX_IF parent 1:1 classid 1:10 htb \ rate $UP_CEIL ceil $UP_CEIL tc class add dev $LAN_IF parent 2:1 classid 2:10 htb \ rate $LAN_CEIL ceil $LAN_CEIL tc filter add dev $EX_IF parent 1:1 protocol ip prio 1 \ handle 0x100 fw classid 1:10 tc filter add dev $LAN_IF parent 2:1 protocol ip prio 1 \ handle 0x100 fw classid 2:10 iptables -t mangle -A OUTPUT -j MARK --set-mark 0x100 iptables -t mangle -A OUTPUT -j RETURN # --------------------------------------------------------------------- SETUP_HOST='./rc.qos.lan-host $HOSTNAME $HOST_IP $CLASS_BASE $CLASS_PRIO $CLASS_MEDIUM $CLASS_BULK $HOST_UP_RATE $HOST_UP_CEIL $HOST_DOWN_RATE $HOST_DOWN_CEIL $PRIO_UP_RATE $PRIO_UP_CEIL $PRIO_DOWN_RATE $PRIO_DOWN_CEIL $BULK_UP_RATE $BULK_UP_CEIL $BULK_DOWN_RATE $BULK_DOWN_CEIL' # --------------------------------------------------------------------- #if [ 1 = 0 ]; then echo "Creating class: lanlan (:11)" HOSTNAME=lanlan # Special case: use network for HOST_IP HOST_IP=192.168.0.0/24 CLASS_BASE=0x11 CLASS_PRIO=0x110 CLASS_MEDIUM=0x111 CLASS_BULK=0x116 HOST_UP_RATE=$LAN_CEIL HOST_UP_CEIL=$LAN_CEIL HOST_DOWN_RATE=$LAN_CEIL HOST_DOWN_CEIL=$LAN_CEIL PRIO_UP_RATE=$LAN_CEIL PRIO_UP_CEIL=$LAN_CEIL PRIO_DOWN_RATE=$LAN_CEIL PRIO_DOWN_CEIL=$LAN_CEIL BULK_UP_RATE=$LAN_CEIL BULK_UP_CEIL=$LAN_CEIL BULK_DOWN_RATE=$LAN_CEIL BULK_DOWN_CEIL=$LAN_CEIL eval $SETUP_HOST #fi # --------------------------------------------------------------------- echo "Creating class: allhost (:12)" HOSTNAME=allhost HOST_IP=192.168.0.0/24 CLASS_BASE=0x12 CLASS_PRIO=0x120 CLASS_MEDIUM=0x121 CLASS_BULK=0x126 HOST_UP_RATE=$DEFAULT_HOST_UP_RATE HOST_UP_CEIL=$DEFAULT_HOST_UP_CEIL HOST_DOWN_RATE=$DEFAULT_HOST_DOWN_RATE HOST_DOWN_CEIL=$DEFAULT_HOST_DOWN_CEIL PRIO_UP_RATE=$DEFAULT_PRIO_UP_RATE PRIO_UP_CEIL=$DEFAULT_PRIO_UP_CEIL PRIO_DOWN_RATE=$DEFAULT_PRIO_DOWN_RATE PRIO_DOWN_CEIL=$DEFAULT_PRIO_DOWN_CEIL BULK_UP_RATE=$DEFAULT_BULK_UP_RATE BULK_UP_CEIL=$DEFAULT_BULK_UP_CEIL BULK_DOWN_RATE=$DEFAULT_BULK_DOWN_RATE BULK_DOWN_CEIL=$DEFAULT_BULK_DOWN_CEIL eval $SETUP_HOST # --------------------------------------------------------------------- echo "Creating class: nerdville (:12)" HOSTNAME=nerdville HOST_IP=192.168.0.100 CLASS_BASE=0x12 CLASS_PRIO=0x120 CLASS_MEDIUM=0x121 CLASS_BULK=0x126 HOST_UP_RATE=$DEFAULT_HOST_UP_RATE HOST_UP_CEIL=$DEFAULT_HOST_UP_CEIL HOST_DOWN_RATE=$DEFAULT_HOST_DOWN_RATE HOST_DOWN_CEIL=$DEFAULT_HOST_DOWN_CEIL PRIO_UP_RATE=$DEFAULT_PRIO_UP_RATE PRIO_UP_CEIL=$DEFAULT_PRIO_UP_CEIL PRIO_DOWN_RATE=$DEFAULT_PRIO_DOWN_RATE PRIO_DOWN_CEIL=$DEFAULT_PRIO_DOWN_CEIL BULK_UP_RATE=$DEFAULT_BULK_UP_RATE BULK_UP_CEIL=$DEFAULT_BULK_UP_CEIL BULK_DOWN_RATE=$DEFAULT_BULK_DOWN_RATE BULK_DOWN_CEIL=$DEFAULT_BULK_DOWN_CEIL #eval $SETUP_HOST # --------------------------------------------------------------------- echo "Creating class: unknown host (:99)" HOSTNAME=unkn HOST_IP=0.0.0.0/0 CLASS_BASE=0x99 CLASS_PRIO=0x990 CLASS_MEDIUM=0x991 CLASS_BULK=0x996 HOST_UP_RATE=100kbit HOST_UP_CEIL=$UP_CEIL HOST_DOWN_RATE=100kbit HOST_DOWN_CEIL=$DOWN_CEIL PRIO_UP_RATE=40kbit PRIO_UP_CEIL=40kbit PRIO_DOWN_RATE=90kbit PRIO_DOWN_CEIL=90kbit BULK_UP_RATE=50kbit BULK_UP_CEIL=50kbit BULK_DOWN_RATE=100kbit BULK_DOWN_CEIL=100kbit eval $SETUP_HOST # --------------------------------------------------------------------- # ---------------------------------------------------------------------