ネットワークをレート制限しますが、制限する前にTCP接続ごとのバーストを許可します


8

レート制限は可能ですが(ポリシングと呼ばれます)、TCP接続ごとにバーストを許可するCiscoルータがあります。たとえば、帯域幅を50メガビットに制限できますが、4メガバイトが転送されるまで制限は課されません。これは、確立される各TCP接続ごとに適用されます。

Linuxでこれを行う方法はありますか?また、そのようなソリューションには欠点がありますか?誰にとっても役立つ場合、バーストを設定するためのシスココマンドは、(少なくともASA 5505で)ポリシーマップの下で実行されるpoliceコマンドの3番目のパラメータです。

これの目標は、サーバーが95/5バーストを利用して、通常のユーザーに可能な限り迅速にWebページを提供できるようにする一方で、5%以上の時間のバーストの可能性を減らすことです(サーバー間で行う場合など)。転送またはウェブサイトからダウンロードされている大きなファイル)。長すぎるDDoS攻撃については理解できましたが、これは解決策ではないかもしれませんが、さまざまな理由から、ここでは問題になりません。

回答:


6

これは、Linuxとiptablesで実行できtcます。MARKいくつかのバイトが転送された接続のパケットにiptablesを設定します。次に、を使用tcして、これらのマークされたパケットをキューイング規則のクラスに入れ、帯域幅をレート制限します。

やや難しいのは、アップロードとダウンロードの両方の接続を制限することです。tc入力のトラフィックシェーピングをサポートしていません。これを回避するには、ウェブサーバーに面するインターフェース(ウェブサーバーへのダウンロードを形成する)で下りをシェーピングし、アップストリームプロバイダーに面するインターフェース(ウェブサーバーからのアップロードを形成する)で下りをシェーピングします。アップストリームプロバイダーがデータを送信する速度を制御できないため、実際には入力(ダウンロード)トラフィックを形成していません。ただし、ウェブサーバー向けのインターフェースを形成すると、パケットがドロップされ、アップローダーが帯域幅の制限に対応するためにTCPウィンドウを縮小します。

例:(これがLinuxベースのルーター上にあり、Webサーバーeth0側のインターフェースがアップストリームであると想定していますeth1

# mark the packets for connections over 4MB being forwarded out eth1
# (uploads from webserver)
iptables -t mangle -A FORWARD -p tcp -o eth1 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50

# mark the packets for connections over 4MB being forwarded out eth0
# (downloads to webserver)
iptables -t mangle -A FORWARD -p tcp -o eth0 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50

# Setup queuing discipline for server-download traffic
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:50 htb rate 50mbit

# Setup queuing discipline for server-upload traffic
tc qdisc add dev eth1 root handle 1: htb
tc class add dev eth1 parent 1: classid 1:50 htb rate 50mbit

# set the tc filters to catch the marked packets and direct them appropriately
tc filter add dev eth0 parent 1:0 protocol ip handle 50 fw flowid 1:50
tc filter add dev eth1 parent 1:0 protocol ip handle 50 fw flowid 1:50

LinuxルーターではなくWebサーバー自体でこれを実行する場合でも、上記のもののアップロード部分を使用できます。一つの注目すべき変更点は、あなたが置き換えたいですFOWARDOUTPUT。ダウンロードするには、「中間機能ブロック」デバイスを使用してキューイング規則をセットアップする必要がありますifb。つまり、仮想インターフェイスを使用して、入力トラフィックを出力として扱い、を使用してそこからシェーピングできますtc。セットアップ方法の詳細については、httpsifb//serverfault.com/questions/350023/tc-ingress-policing-and-ifb-mirroringをご覧ください。

このタイプのものは、スケーリングするために多くのチューニングを必要とする傾向があることに注意してください。差し迫った懸念の1つは、多数の接続があるスケーリングの壁にぶつかる傾向があるモジュールにconnbytes依存していることconntrackです。重い負荷のテストをお勧めします。

もう1つの注意点は、UDPではステートレスであるため、まったく機能しないことです。これに対処する他の手法がありますが、要件はTCPのみに対するもののようです。

また、上記のすべてを元に戻すには、次の操作を行います。

# Flush the mangle FORWARD chain (don't run this if you have other stuff in there)
iptables -t mangle -F FORWARD

# Delete the queuing disciplines
tc qdisc del dev eth0 root
tc qdisc del dev eth1 root
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.