web-dev-qa-db-ja.com

IPTABLES-特定の着信IPの制限レート

特定のサービスのレートを制限したくありません。私の目標は、着信IPアドレスのみに基づいてレートを制限することです。たとえば、疑似ルールを使用します。

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

着信IPアドレスに基づいてIPTablesを使用してレート制限するにはどうすればよいですか?

103
James

IPTablesは、このような作業のために作成されたものではなく、これらの決定を行うために大量のパケットを分析する必要があります。 IPTablesは部分的には答えです!

これに対する本当の答えは、Linuxのすばらしく、十分に活用されていないトラフィック制御機能です。何が起こっているのかを知らずにこれをいじくると、マシンへのネットワーク接続が失われる可能性があることに注意してください!警告されました!

Eth0が発信デバイスであると想定すると、クラスベースのトラフィック制御キューを作成する必要があります。このキューは、デフォルトで「高速」キューを介してほとんどのトラフィックを出力し、特定の人々のリストを「低速」キューに入れます。

これの利点は、オーバーライドするクラスが帯域幅を必要としない限り、遅いユーザーに多くの送信トラフィックを許可する状況を作成できることですが、この例ではこれを行いません(遅いユーザーには常に10kbpsを提供します)。キューイングシステムは次のようになります。

                         Inbound traffic
                              +
                              |
                              |
                              v
                     +------------------+
                     |   Class 1:1      |
                     |------------------|
                     |  Root (all flows)|
                     |       100mbit    |
                     +-----+-----+------+
                           |     |
                           |     |
                           |     |
                           |     |
                           |     |
          +----------+     |     |     +----------+
          |    1:11  +-----+     +-----+    1:12  |
          |----------|                 |----------|
          | Default  |                 | Slow     |
          |100mb-80kb|                 |   80kb   |
          +----------+                 +----------+

これを行うには、まず、カーネルでキューイング規則をセットアップする必要があります。以下はあなたのためにこれを行います。これをスクリプト全体として実行する必要があります

#!/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スクリプトがないと思います(そして、それらも作成する必要がありますbefore iptablesルール)トラフィック制御をリセットするinitスクリプトがないと確信しています再起動に関するルール。気にしない場合は、rc.localでスクリプトを呼び出すことで全体を再作成できます。

166
Matthew Ife

これは、レート制限ルールを取り、-sスイッチを追加するだけの簡単なものです。 -sスイッチは、着信IPと一致します。たとえば、iptables -A INPUT -s 1.1.1.1を使用して、そのルールのレート制限の優先方法で仕上げます。

5
Wesley