これは、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サーバー自体でこれを実行する場合でも、上記のもののアップロード部分を使用できます。一つの注目すべき変更点は、あなたが置き換えたいですFOWARD
しOUTPUT
。ダウンロードするには、「中間機能ブロック」デバイスを使用してキューイング規則をセットアップする必要があります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