Dies ist unter Linux mit iptables
und möglich tc
. Sie konfigurieren iptables für MARK
Pakete in einer Verbindung, in der eine bestimmte Anzahl von Bytes übertragen wurde. Anschließend tc
setzen Sie diese markierten Pakete in eine Klasse in einer Warteschlangendisziplin, um die Bandbreite zu begrenzen.
Ein etwas kniffliger Teil besteht darin, die Verbindung sowohl für Uploads als auch für Downloads zu beschränken. tc
unterstützt nicht die Verkehrsformung des Eingangs. Sie können dies umgehen, indem Sie den Ausgang auf Ihrer dem Webserver zugewandten Oberfläche (der die Downloads auf Ihren Webserver beeinflusst) und den Ausgang auf Ihrer dem Upstream-Anbieter zugewandten Oberfläche (der die Uploads von Ihrem Webserver formt) gestalten. Sie gestalten den eingehenden (Download-) Datenverkehr nicht wirklich, da Sie nicht steuern können, wie schnell Ihr Upstream-Anbieter Daten sendet. Wenn Sie jedoch die Schnittstelle Ihres Webservers gestalten, werden Pakete verworfen und der Uploader verkleinert sein TCP-Fenster, um die Bandbreitenbeschränkung zu berücksichtigen.
Beispiel: (setzt voraus, dass dies auf einem Linux-basierten Router ist, auf dem sich die Schnittstelle zum Webserver befindet eth0
und der Upstream ist eth1
)
# mark the packets for connections over 4MB being forwarded out eth1
# (uploads from webserver)
iptables -t mangle -A FORWARD -p tcp -o eth1 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50
# mark the packets for connections over 4MB being forwarded out eth0
# (downloads to webserver)
iptables -t mangle -A FORWARD -p tcp -o eth0 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50
# Setup queuing discipline for server-download traffic
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:50 htb rate 50mbit
# Setup queuing discipline for server-upload traffic
tc qdisc add dev eth1 root handle 1: htb
tc class add dev eth1 parent 1: classid 1:50 htb rate 50mbit
# set the tc filters to catch the marked packets and direct them appropriately
tc filter add dev eth0 parent 1:0 protocol ip handle 50 fw flowid 1:50
tc filter add dev eth1 parent 1:0 protocol ip handle 50 fw flowid 1:50
Wenn Sie dies auf dem Webserver selbst anstatt auf einem Linux-Router tun möchten, können Sie weiterhin die Upload-Teile der oben genannten Inhalte verwenden. Eine bemerkenswerte Änderung ist , dass Sie ersetzen würden FOWARD
mit OUTPUT
. Zum Herunterladen müssen Sie eine Warteschlangendisziplin mit einem "Intermediate Functional Block" -Gerät einrichten oder ifb
. Kurz gesagt, es wird eine virtuelle Schnittstelle verwendet, sodass Sie eingehenden Datenverkehr als ausgehenden Datenverkehr behandeln und von dort aus mithilfe von gestalten können tc
. Weitere Informationen zum Einrichten eines ifb
finden Sie hier: /server/350023/tc-ingress-policing-and-ifb-mirroring
Beachten Sie, dass diese Art von Material in der Regel viel Skalierung erfordert. Ein unmittelbares Problem besteht darin, dass connbytes
das conntrack
Modul verwendet wird, das dazu neigt, Skalierungswände mit einer großen Anzahl von Verbindungen zu treffen. Ich würde Schwerlasttests empfehlen.
Eine weitere Einschränkung ist, dass dies für UDP überhaupt nicht funktioniert, da es zustandslos ist. Es gibt andere Techniken, um dies zu beheben, aber es sieht so aus, als ob Ihre Anforderungen nur für TCP gelten.
Um alle oben genannten Schritte rückgängig zu machen, gehen Sie wie folgt vor:
# Flush the mangle FORWARD chain (don't run this if you have other stuff in there)
iptables -t mangle -F FORWARD
# Delete the queuing disciplines
tc qdisc del dev eth0 root
tc qdisc del dev eth1 root