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


103

特定のサービスのレートを制限したくありません。私の目標は、着信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を使用してレート制限を設定するにはどうすればよいですか?

回答:


165

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でスクリプトを呼び出して全体を再作成できます。


3
まあ、私はあなたに十分に感謝することはできません。これは非常に説明的で非常に有益です。後でTCの知識が必要であることに気づき、それを調べ始めました。再度、感謝します!
ジェームズ

ああ、接続を失うのは。VPSからホストマシンに移動する前に、構成がダウンしていることを確認しています。また、ETH0のプライベートネットワークへのVPNアクセスがあります。私はETH1のみに取り組んでいるので、理論上は問題はありません。しかし、警告が聞こえました!
ジェームズ

2
私は、これは意味を成していた最初のもので、私は同様のチュートリアルを読んだ回数を教えてくれカント
RC1140

5
補足として、中央集中型の「ポリシーストア」でCPU、メモリ、IO、およびネットワークのアプリケーションごとの制限を定義できるため、通常は制御グループ(これもまた可能性があり、十分に活用されておらず素晴らしい)でこのようなリソース制限を行う方が適切です'。しかし、答えを提供するためにそのような質問が提起されるのをまだ見ていません。
マシューイフェ

2
tc構文が気に入らない場合は、コマンドを生成するユーザーフレンドリーな言語をもう少し追加するtcngを試してくださいtc。私はシェルスクリプトでこれが好きecho '... multi line tcng configuration ...' | tcng | shでした:
マティアスワッドマン

5

レート制限ルールを使用して-sスイッチを追加するのと同じくらい簡単です。-sスイッチは着信IPアドレスと一致しました。たとえばiptables -A INPUT -s 1.1.1.1、そのルールのレート制限の望ましい方法で仕上げます。


迅速な回答ありがとうございます。残念ながら、私の主な問題は後半です。--limitを調べましたが、KB / sに基づいて制限できるものは何もありませんでした。
ジェームズ

1
@ジェームズ私はあなたに戻っていただろうが、私は友人の家に出なければならなかった。ちょうど戻って、MIfeがかなりの仕事をしたことがわかります。=)
ウェズリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.