NAT mit Bandbreiten-Limit
Es gibt mehrere gute Gründe die Geschwindigkeit von Verbindungen zu drosseln. In einer Firewall oder einem DSL-Router will man in der Regel die Geschwindigkeit einzelner Dienste drosseln, um zum Beispiel während eines FTP-Uploads noch gemütlich surfen zu können.
Im Linux Bereich erledigen die Programme iptables und tc diese Aufgabe zuverlässig.
Bei einem Server kann es auch sehr interessant sein, um für zeitkritische Dienste wie Live-Streaming Ressourcen garantieren zu können.
Während wir bei der Suche nach Scripten zur Bandbreitenbegrenzungen für Arbeitsplazpcs recht schnell im Internet fündig wurden, haben wir für ein Script zur Bandbreitensteuerung für ein Servertbackend noch etwas selbst experimentieren müssen.
Der elegantere Weg ist es hier die Traffic-Regeln auf dem NAT-Server einstellen zu können, statt jeden Backendserver einzeln konfigurieren zu müssen.
Ein Script traffic.sh erledigt die Bandbreitenbegrenzung
DEV=eth0 IPT=/sbin/iptables TC=/sbin/tc $IPT -t mangle -F $TC qdisc del dev $DEV ingress > /dev/null 2>&1 $TC qdisc del dev $DEV root > /dev/null 2>&1 $TC qdisc del dev lo root > /dev/null 2>&1 $TC qdisc add dev $DEV root handle 1:0 htb default 12 r2q 6 $TC class add dev $DEV parent 1:0 classid 1:1 htb rate 100mbit ceil 100mbit $TC class add dev $DEV parent 1:1 classid 1:10 htb rate 1mbit ceil 2mbit prio 0 $TC class add dev $DEV parent 1:1 classid 1:11 htb rate 5mbit ceil 10mbit prio 1 $TC class add dev $DEV parent 1:1 classid 1:12 htb rate 100mbit ceil 100mbit prio 2 $TC filter add dev $DEV parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10 $TC filter add dev $DEV parent 1:0 prio 0 protocol ip handle 11 fw flowid 1:11 $TC qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10 $TC qdisc add dev $DEV parent 1:11 handle 11: sfq perturb 10 $TC qdisc add dev $DEV parent 1:12 handle 12: sfq perturb 10
Ein Script ipnat.sh sorgt neben dem Nating auch für die Markierung der Pakete
#!/bin/bash IPTABLES=`which iptables`; #skript muss als root laufen, sonst hat er nicht die nötige rechte die Tablen und Kernel einstellungen anzupassen! MYNAME=`whoami`; if [ $MYNAME != "root" ]; then exec `which sudo` $0 $1; fi case $1 in "start") echo "1" > /proc/sys/net/ipv4/ip_forward; # clear the NAT table to be sure $IPTABLES -t nat -F $IPTABLES -t mangle -F $IPTABLES -A PREROUTING -t mangle -s 10.10.10.100 -p tcp -j MARK --set-mark 10 $IPTABLES -t nat -A PREROUTING -p tcp -d 192.168.111.72 --dport 80 -j DNAT --to-destination 10.10.10.100:80 ;; "stop") echo "0" > /proc/sys/net/ipv4/ip_forward; $IPTABLES -t nat -F ;; "stop") echo "0" > /proc/sys/net/ipv4/ip_forward; $IPTABLES -t nat -F ;; "restart") $0 stop $0 start ;; *) echo "Usage: $0 start|stop|restart" ;; esac
In diesem Beispiel ist das Entscheidende, dass auf dem NAT-Server alle Pakete markiert werden, die von der IP -s 10.10.10.100, also unserem Backendserver auf das System gelangen.
Stehen im Backend jetzt zum Beispiel ein Streamingserver und ein Webserver, lassen sich sehr einfach die Pakete vom Streamingserver höher priorisieren.
Deutlich ergänzende Möglichkeiten kann auch ein echter Loadbalancer mit LVS bieten.



