回答:
IPTablesは、このような決定を行うために大量のパケットを分析する必要があるこの種の作業には適していません。IPTablesは部分的には答えです!
これに対する本当の答えは、Linuxで使用されていない素晴らしいトラフィック制御機能です。何が起こっているのか知らずにこれをいじくり回すと、マシンへのネットワーク接続が失われる可能性があることに注意してください!警告されました!
eth0が発信デバイスであると仮定すると、デフォルトで「高速」キューを介してほとんどのトラフィックを出力し、特定の人のリストを「低速」キューに入れるクラスベースのトラフィック制御キューを作成する必要があります。
この利点は、優先クラスが帯域幅を必要としない限り、低速ユーザーに大量のアウトバウンドトラフィックを許可する状況を作成できることですが、この例ではこれを行いません(常に低速ユーザーに10kbpsを提供します)。キューイングシステムは次のようになります。
Inbound traffic
+
|
|
v
+------------------+
| Class 1:1 |
|------------------|
| Root (all flows)|
| 100mbit |
+-----+-----+------+
| |
| |
| |
| |
| |
+----------+ | | +----------+
| 1:11 +-----+ +-----+ 1:12 |
|----------| |----------|
| Default | | Slow |
|100mb-80kb| | 80kb |
+----------+ +----------+
これを行うには、まずカーネルでキューイング規則を設定する必要があります。以下はあなたのためにこれを行います.. これを1つのスクリプト全体として実行する必要があります
#!/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
「デフォルト11」は、分類されていないトラフィックをどう処理するかをカーネルに指示するため重要です。
これが完了したら、iptablesルールを設定して、特定の条件に一致するパケットを分類できます。この遅いルールにたくさんの人を入れるつもりなら、ipsetルールがより適切です(rhel6で利用できるはずです)。
そのため、ipsetデータベースを作成して、照合を行います...
ipset create slowips hash:ip,port
次に、iptablesルールを作成して、照合を行います。
iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12
これは、宛先IPをセットの送信元ポートと一致させる場合、トラフィック制御で設定した低速キューに分類するようカーネルに指示します。
これで、最終的にIPを遅くしたいときはいつでも、ipsetコマンドを使用して、次のようにIPをセットに追加できます。
ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...
コマンド「tc -s class show dev eth0」を使用して動作をテストできます。そこには、低速キューにリダイレクトされるパケットを示す統計が表示されます。
これの唯一の本当の欠点は、再起動後も生き残ることです。再起動時にダンプからipsetsを作成するためのinitスクリプトは存在しないと思います(また、iptablesルールの前に作成する必要があります)。再起動時にトラフィック制御ルールをリセットするinitスクリプトがないことは確かです。気にしない場合は、rc.localでスクリプトを呼び出して全体を再作成できます。
tc
構文が気に入らない場合は、コマンドを生成するユーザーフレンドリーな言語をもう少し追加するtcngを試してくださいtc
。私はシェルスクリプトでこれが好きecho '... multi line tcng configuration ...' | tcng | sh
でした: