IP アドレスごとに時間枠内でデータ転送を制限することはできますか?

IP アドレスごとに時間枠内でデータ転送を制限することはできますか?

私は自分のウェブサイトで比較的大きなファイルをホストしていますが、誰かがスクリプトを作成して何度もダウンロードさせ、データ転送を食いつぶしてお金がかかるようにするのは簡単だと思いました。一般的な家庭の接続でも、24時間365日ダウンロードさせておくと問題が発生するほどの速度です。ましてや超高速の光ファイバー接続や適切なリモートサーバーなど、問題はありません。

そこで、Apache や Ubuntu システム全体で IP アドレスごとに制限を課すことができるものがあるかどうか疑問に思っています。たとえば、24 時間あたり 10 GB の転送などです。制限に達すると、クライアントには「禁止 - クォータに達しました」という簡易ページが表示されるか、接続が完全に拒否されます。いろいろ調べてみましたが、さまざまなスロットリング ソリューション以外は何も見つかりませんでした。これは役立つかもしれませんが、問題の解決にはなりません。

答え1

iptables クォータ モジュールについては、こちらで説明されています。http://ipset.netfilter.org/iptables-extensions.man.html#lbBT

quota
    Implements network quotas by decrementing a byte counter with each
    packet. The condition matches until the byte counter reaches zero.
    Behavior is reversed with negation (i.e. the condition does not match
    until the byte counter reaches zero).

    [!] --quota bytes
           The quota in bytes.

ただし、この方法を使用すると、サーバーに流入する可能性のあるすべてのソース IP アドレスに対して個別のクォータ ルールを作成する必要があるため、役に立たないと思います (これはほぼ不可能です)。また、ここで説明されているように、24 時間 (または任意の期間) ごとにこれらのクォータをリセットするために、何らかの BASH スクリプト自動化を統合する必要があります。IPtables トラフィック クォータ - 増加と減少

何年も前になりますが、私は IP アドレスごとにアプリケーション レベルでこれを実行できる Apache モジュールを試しました。これはより良いアプローチかもしれません (Apache/Nginx でこれを実行できる最新のモジュールが何であるかはわかりません。さらに調査が必要です)。

私が知っている中で、よりうまく機能する唯一の他の代替手段は (私の意見では) iptables hashlimit モジュールを tc (トラフィック シェーピング/ポリシング) と組み合わせて使用​​することです。http://ipset.netfilter.org/iptables-extensions.man.html#lbAY- このアプローチを使用すると、トラフィックは遅くなるだけで、ブロックされることはありません。これがより実現可能である理由は、iptables hashlimit モジュールが、サーバーに着信したときに個別の IP アドレスや送信元/宛先ポートの「ハッシュ キー」を記録することで、クライアントのオンザフライ トラッキングを処理できるためです。これを実現する方法については、別の関連する質問に回答を投稿しました。https://serverfault.com/a/754116/30506- 要約すると、トラフィック シェーピング クラス (たとえば 5Mb/秒に固定された帯域幅リミッター) を作成し、クライアント セッションごとのパケット レートが特定のしきい値に達すると、そのパケットをこのクラスに送り込み、トラフィックを鎮静化します。ただし、この場合、鎮静化は数秒ではなく数時間にわたって動作するように調整する必要があります。

答え2

こんにちは、Server Fault へようこそ!

iptables帯域幅の制限は、モジュールを使用して行うことができますlimit

これについての非常に良い入門書が見つかりますここ

このリンクからの帯域幅スロットルを設定するための小さな例:

$ sudo iptables --flush  # start again
$ sudo iptables --new-chain RATE-LIMIT
$ sudo iptables --append INPUT --match conntrack --ctstate NEW --jump RATE-LIMIT
$ sudo iptables --append RATE-LIMIT --match limit --limit 50/sec --limit-burst 20 --jump ACCEPT
$ sudo iptables --append RATE-LIMIT --jump DROP

前述の記事の著者 Will Sewell 氏と Jim Fisher 氏に感謝します。

関連情報