Senast ändrad: January 5, 2008
shape/program
#!/bin/bash
# The Ultimate Setup For Your Internet Connection At Home
#
#
# Set the following values to somewhat less than your actual download
# and uplink speed. In kilobits
DOWNLINK=2048
#DOWNLINK=1860
UPLINK=330
UPLINK_BULK=280
DEV=eth0
INT_DEV=eth1
IPTABLES=/usr/local/sbin/iptables
# Kill tc settings
tc qdisc del dev $DEV root
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
# Some iptables markings
$IPTABLES -t mangle -N MANGLE_MARK
# Set icmp as prioritized traffic
$IPTABLES -t mangle -A MANGLE_MARK -p icmp -j MARK --set-mark 20
$IPTABLES -t mangle -A MANGLE_MARK -p icmp -j RETURN
# Set udp as prioritized traffic
$IPTABLES -t mangle -A MANGLE_MARK -p udp -j MARK --set-mark 20
$IPTABLES -t mangle -A MANGLE_MARK -p udp -j RETURN
# Set ftp as prioritized traffic
$IPTABLES -t mangle -A MANGLE_MARK -p tcp --sport 21 -j MARK --set-mark 20
$IPTABLES -t mangle -A MANGLE_MARK -p tcp --sport 21 -j RETURN
# Set ssh as prioritized traffic
$IPTABLES -t mangle -A MANGLE_MARK -p tcp --sport ssh -j MARK --set-mark 20
$IPTABLES -t mangle -A MANGLE_MARK -p tcp --sport ssh -j RETURN
# Set ACK as prioritized traffic
$IPTABLES -t mangle -A MANGLE_MARK -p tcp -m length --length 0:70 -j MARK --set-mark 20
$IPTABLES -t mangle -A MANGLE_MARK -p tcp -m length --length 0:70 -j RETURN
# Set everything as bulk traffic
$IPTABLES -t mangle -A MANGLE_MARK -j MARK --set-mark 22
$IPTABLES -t mangle -A MANGLE_MARK -j RETURN
# Jump to tables
#$IPTABLES -t mangle -A OUTPUT -o $DEV -j MANGLE_MARK
$IPTABLES -t mangle -A OUTPUT -j MANGLE_MARK
$IPTABLES -t mangle -A PREROUTING -i $DEV -j MANGLE_MARK
$IPTABLES -t mangle -A PREROUTING -i $INT_DEV -j MANGLE_MARK
# clean existing down- and uplink qdiscs, hide errors
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null
###### uplink
# install root HTB, point default traffic to 1:20:
tc qdisc add dev $DEV root handle 1: htb default 20
# shape everything at $UPLINK speed - this prevents huge queues in your
# DSL modem which destroy latency:
tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit burst 6k
# high prio class 1:10:
tc class add dev $DEV parent 1:1 classid 1:10 htb rate ${UPLINK}kbit burst 6k prio 1
# bulk & default class 1:20 - gets slightly less traffic,
# and a lower priority:
tc class add dev $DEV parent 1:1 classid 1:20 htb rate ${UPLINK_BULK}kbit ceil ${UPLINK}kbit \
burst 6k prio 7
# both get Stochastic Fairness:
tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
# Match marked packets with tc (20=fast, 22=bulk)
tc filter add dev $DEV parent 1:0 protocol ip prio 10 handle 20 fw flowid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 10 handle 22 fw flowid 1:20
# rest is 'non-interactive' ie 'bulk' and ends up in 1:20
########## downlink #############
# slow downloads down to somewhat less than the real speed to prevent
# queuing at our ISP. Tune to see how high you can set it.
# ISPs tend to have *huge* queues to make sure big downloads are fast
#
# attach ingress policer:
tc qdisc add dev $DEV handle ffff: ingress
# filter *everything* to it (0.0.0.0/0), drop everything that's
# coming in too fast:
tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
Först börjar vi med att skapa en ny kedja som vi döper till: MANGLE_MARK
I denna kedjan märker vi sedan paketen efter typ och storlek
När vi märkt alla paket vi är intresserade av, skapar vi dom olika trafik-köerna. Men det är riktigt avancerat och ett stort ämne.
Bättre att kolla på www.docum.org över hur det funkar.
Sist så lägger vi in våran kedja i linux-netfilter.
Det är kanske inte det snyggaste kodexemplet, men det funkar för mig.
bang.sh Bang är ett perlscript skrivet av mig. Tanken är att ha ett program som ser ut som ping men visar aktuellt bandbreddsnyttjande. bang ger följande svar: RX=1026, TX=48448 seq=1 time=1 --- eth0 bandwitdh statistics --- RX bandwidth min/avg/max = 720/937/1206 TX bandwidth min/avg/max = 27252/43300/49962 RX = recieve, TX = Transmit, seq=sekvens, time=angivet intervall (normalt 1) Man ser även minsta, medelvärde, maximalt använda bandbredd på respektive riktning.
ping ping behöver ingen närmare förklaring. $ ping pop -c 10 -q (pop = point of presence) 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max/mdev = 103.083/204.169/353.484/76.240 ms pop eller point of presence är den enhet närmast mig på andra sidan ADSL- kopplingen. I detta fallet är det gateway som befinner sig ca 8ms ifrån mig. -c 10 betyder utför ping 10 gånger. -q betyder tyst utan löpande utskrift, endast summering.
bwbar bwbar är en liten utility som jag hittade på www.kernel.org. Den visar en stapel på hur aktuellt bandbreddsnyttjande är. Jag har satt upp bwbar att mäta tiden under 15 sekunder och sedan uppdatera infon. Incoming Current bandwidth utilization 7.33 kbit/sOutgoing Current bandwidth utilization 354.34 kbit/s
![]()