Ratenlimit-Netzwerk, aber Bursting pro TCP-Verbindung vor dem Limitieren zulassen

8

Wir haben einen Cisco-Router, der eine Ratenbegrenzung ermöglicht (sie nennen es Polizeiarbeit), aber das Bursting pro TCP-Verbindung zulässt. Zum Beispiel können wir die Bandbreite auf 50 MBit begrenzen, aber die Obergrenze wird erst festgelegt, wenn 4 Megabyte übertragen wurden. Dies wird für jede hergestellte TCP-Verbindung erzwungen.

Gibt es eine Möglichkeit, dies unter Linux zu tun? Gibt es auch Nachteile bei einer solchen Lösung? Falls es für jemanden hilfreich ist, ist der Cisco-Befehl zum Festlegen des Bursts der dritte Parameter des Polizeibefehls, der unter einer Richtlinienzuordnung ausgeführt wird (zumindest auf unserem ASA 5505).

Ziel ist es, einem Server zu ermöglichen, das 95/5-Bursting zu nutzen und Webseiten für normale Benutzer so schnell wie möglich bereitzustellen, aber die Wahrscheinlichkeit eines Bursts in mehr als 5% der Fälle zu verringern (z. B. wenn ein Server an einen Server gesendet wird) Übertragung oder große Dateien, die von einer Website heruntergeladen werden). Ich verstehe, dass bei einem zu langen DDoS-Angriff dies möglicherweise keine Lösung ist, aber aus verschiedenen Gründen ist dies hier kein Problem.

sa289
quelle

Antworten:

6

Dies ist unter Linux mit iptablesund möglich tc. Sie konfigurieren iptables für MARKPakete in einer Verbindung, in der eine bestimmte Anzahl von Bytes übertragen wurde. Anschließend tcsetzen 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. tcunterstü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 eth0und 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 FOWARDmit 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 ifbfinden 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 connbytesdas conntrackModul 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
alienth
quelle