IPTables ist nicht für diese Art von Arbeit geeignet, bei der viele, viele Pakete analysiert werden müssen, um diese Entscheidungen zu treffen. IPTables ist zum Teil die Antwort!
Die eigentliche Antwort auf diese Frage sind die fantastischen und wenig genutzten Verkehrssteuerungsfunktionen in Linux. Beachten Sie, dass Sie die Netzwerkverbindung zum Computer verlieren können, wenn Sie nicht wissen, was gerade passiert. Du wurdest gewarnt!
Angenommen, eth0 ist das ausgehende Gerät, das Sie benötigen, um eine klassenbasierte Verkehrssteuerungswarteschlange zu erstellen, die standardmäßig den meisten Verkehr über die "schnelle" Warteschlange ausgibt und eine bestimmte Liste von Personen in die "langsame" Warteschlange stellt.
Das Schöne daran ist, dass Sie eine Situation erstellen können, in der Sie viel ausgehenden Datenverkehr für langsame Benutzer zulassen, es sei denn, eine übergeordnete Klasse möchte die Bandbreite. In diesem Beispiel wird dies jedoch nicht ausgeführt (den langsamen Benutzern werden immer 10 KBit / s bereitgestellt). Das Warteschlangensystem sieht ungefähr so aus:
Inbound traffic
+
|
|
v
+------------------+
| Class 1:1 |
|------------------|
| Root (all flows)|
| 100mbit |
+-----+-----+------+
| |
| |
| |
| |
| |
+----------+ | | +----------+
| 1:11 +-----+ +-----+ 1:12 |
|----------| |----------|
| Default | | Slow |
|100mb-80kb| | 80kb |
+----------+ +----------+
Dazu müssen Sie zuerst die Warteschlangendisziplin im Kernel einrichten. Das Folgende erledigt dies für Sie. Sie müssen dies als ein ganzes Skript ausführen
#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit
tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo
Die "Standard 11" ist wichtig, da sie dem Kernel mitteilt, was mit nicht klassifiziertem Datenverkehr zu tun ist.
Anschließend können Sie eine iptables-Regel einrichten, um Pakete zu klassifizieren, die bestimmten Kriterien entsprechen. Wenn Sie vorhaben, viele, viele Leute in diese langsame Regel einzubeziehen, ist eine Ipset-Regel geeigneter (die meines Erachtens auf rhel6 verfügbar sein sollte).
Erstellen Sie also eine ipset-Datenbank, um den Abgleich gegen ...
ipset create slowips hash:ip,port
Erstellen Sie dann die iptables-Regel, um den Abgleich durchzuführen.
iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12
Dies weist den Kernel an, dass, wenn Sie die Ziel-IP mit dem Quellport aus der Gruppe abgleichen, diese in die langsame Warteschlange klassifizieren, die Sie mit der Verkehrssteuerung eingerichtet haben.
Nun, wann immer Sie eine IP verlangsamen möchten, können Sie den Befehl ipset verwenden, um die IP der Gruppe wie folgt hinzuzufügen:
ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...
Sie können testen, ob es mit dem Befehl "tc -s class show dev eth0" funktioniert. Dort sehen Sie Statistiken, die angeben, dass Pakete an die langsame Warteschlange umgeleitet werden.
Beachten Sie, dass der einzige wirkliche Nachteil darin besteht, Neustarts zu überstehen. Ich glaube nicht, dass Init-Skripte verfügbar sind, um die IPSets beim Neustart aus Speicherauszügen zu erstellen (und sie müssen auch vor den Iptables-Regeln erstellt werden), und ich bin sicher, dass es keine Init-Skripte gibt, mit denen die Regeln für die Verkehrssteuerung beim Neustart zurückgesetzt werden können. Wenn es Sie nicht stört, können Sie das Ganze einfach durch Aufrufen eines Skripts in rc.local neu erstellen.