25.6. tc-ctinfo ユーティリティーを使用したパケットのレート制限の設定
レート制限を使用すると、特定の時間枠内の反復的なパケット要求を制限することで、ネットワークトラフィックを制限し、ネットワーク内のリソースの枯渇を防ぎ、サーバーの負荷を軽減できます。
接続追跡エントリーには、Netfilter マークと接続情報が格納されます。ルーターがファイアウォールからパケットを転送するとき、ルーターはパケットから接続追跡エントリーを削除または変更します。接続追跡情報 (ctinfo) モジュールは、接続追跡マークからさまざまなフィールドにデータを取り出します。このカーネルモジュールは、Netfilter マークを、ソケットバッファー (skb) マークメタデータフィールドにコピーすることで保存します。
前提条件
-
iperf3ユーティリティーがサーバーとクライアントにインストールされている。
手順
サーバーで次の手順を実行します。
ネットワークインターフェイスに仮想リンクを追加します。
ip link add name ifb4eth0 numtxqueues 48 numrxqueues 48 type ifb
# ip link add name ifb4eth0 numtxqueues 48 numrxqueues 48 type ifbCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドには次のパラメーターがあります。
name ifb4eth0- 新しい仮想デバイスインターフェイスを設定します。
numtxqueues 48- 送信キューの数を設定します。
numrxqueues 48- 受信キューの数を設定します。
type ifb- 新しいデバイスのタイプを設定します。
インターフェイスの状態を変更します。
ip link set dev ifb4eth0 up
# ip link set dev ifb4eth0 upCopy to Clipboard Copied! Toggle word wrap Toggle overflow 物理ネットワークインターフェイスに
qdisc属性を追加し、それを受信トラフィックに適用します。tc qdisc add dev enp1s0 handle ffff: ingress
# tc qdisc add dev enp1s0 handle ffff: ingressCopy to Clipboard Copied! Toggle word wrap Toggle overflow handle ffff:オプションでは、handleパラメーターはデフォルト値としてメジャー番号ffff:をenp1s0物理ネットワークインターフェイス上のクラスフルqdiscに割り当てます。ここで、qdiscは、トラフィック制御を分析するためのキューイング規則パラメーターになります。パケットを分類するために、
ipプロトコルの物理インターフェイスにフィルターを追加します。tc filter add dev enp1s0 parent ffff: protocol ip u32 match u32 0 0 action ctinfo cpmark 100 action mirred egress redirect dev ifb4eth0
# tc filter add dev enp1s0 parent ffff: protocol ip u32 match u32 0 0 action ctinfo cpmark 100 action mirred egress redirect dev ifb4eth0Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドには次の属性があります。
parent ffff:-
親
qdiscのメジャー番号ffff:を設定します。 u32 match u32 0 0-
パターン
u32の IP ヘッダーと一致 (match) するように、u32フィルターを設定します。最初の0は、IP ヘッダーの 2 番目のバイトを表し、もう 1 つの0は、一致させるビットがどれであるかをフィルターに指示するマスク照合です。 action ctinfo- 接続追跡マークからさまざまなフィールドにデータを取り出すアクションを設定します。
cpmark 100-
接続追跡マーク (connmark)
100をパケットの IP ヘッダーフィールドにコピーします。 action mirred egress redirect dev ifb4eth0-
actionをmirredに設定して、受信したパケットを宛先インターフェイスifb4eth0にリダイレクトします。
クラスフル
qdiscをインターフェイスに追加します。tc qdisc add dev ifb4eth0 root handle 1: htb default 1000
# tc qdisc add dev ifb4eth0 root handle 1: htb default 1000Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、メジャー番号
1を rootqdiscに設定し、マイナー ID1000のクラスフルqdiscを持つhtb階層トークンバケットを使用します。インターフェイス上のトラフィックを 1 Mbit/s に制限し、上限を 2 Mbit/s にします。
tc class add dev ifb4eth0 parent 1:1 classid 1:100 htb ceil 2mbit rate 1mbit prio 100
# tc class add dev ifb4eth0 parent 1:1 classid 1:100 htb ceil 2mbit rate 1mbit prio 100Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドには次のパラメーターがあります。
parent 1:1-
classidを1、rootを1としてparentを設定します。 classid 1:100-
classidを1:100に設定します。ここで、1は親qdiscの数で、100は親qdiscのクラスの数です。 htb ceil 2mbit-
htbのクラスフルなqdiscでは、ceilレート制限として2 Mbit/sの上限帯域幅が許可されます。
クラスレス
qdiscの Stochastic Fairness Queuing (sfq) を、60秒の時間間隔でインターフェイスに適用して、キューアルゴリズムの摂動を軽減します。tc qdisc add dev ifb4eth0 parent 1:100 sfq perturb 60
# tc qdisc add dev ifb4eth0 parent 1:100 sfq perturb 60Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイアウォールマーク (
fw) フィルターをインターフェイスに追加します。tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100
# tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接続マーク (
CONNMARK) からパケットのメタマークを復元します。nft add rule ip mangle PREROUTING counter meta mark set ct mark
# nft add rule ip mangle PREROUTING counter meta mark set ct markCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドでは、
nftユーティリティーにはチェーンルール仕様PREROUTINGを含むmangleテーブルがあり、ルーティング前に受信パケットを変更してパケットマークをCONNMARKに置き換えます。nftテーブルとチェーンが存在しない場合は、以下のようにテーブルを作成してチェーンルールを追加します。nft add table ip mangle nft add chain ip mangle PREROUTING {type filter hook prerouting priority mangle \;}# nft add table ip mangle # nft add chain ip mangle PREROUTING {type filter hook prerouting priority mangle \;}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定された宛先アドレス
192.0.2.3で受信したtcpパケットにメタマークを設定します。nft add rule ip mangle PREROUTING ip daddr 192.0.2.3 counter meta mark set 0x64
# nft add rule ip mangle PREROUTING ip daddr 192.0.2.3 counter meta mark set 0x64Copy to Clipboard Copied! Toggle word wrap Toggle overflow パケットマークを接続マークに保存します。
nft add rule ip mangle PREROUTING counter ct mark set mark
# nft add rule ip mangle PREROUTING counter ct mark set markCopy to Clipboard Copied! Toggle word wrap Toggle overflow -sパラメーターを使用して、iperf3ユーティリティーをシステム上のサーバーとして実行すると、サーバーはクライアント接続の応答を待ちます。iperf3 -s
# iperf3 -sCopy to Clipboard Copied! Toggle word wrap Toggle overflow
クライアント上で、
iperf3をクライアントとして実行し、IP アドレス192.0.2.3で定期的な HTTP 要求と応答のタイムスタンプをリッスンするサーバーに接続します。iperf3 -c 192.0.2.3 | tee rate
# iperf3 -c 192.0.2.3 | tee rateCopy to Clipboard Copied! Toggle word wrap Toggle overflow 192.0.2.3はサーバーの IP アドレスで、192.0.2.4はクライアントの IP アドレスです。Ctrl+C を押して、サーバー上の
iperf3ユーティリティーを終了します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ctrl+C を押して、クライアント上の
iperf3ユーティリティーを終了します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
インターフェイス上の
htbクラスとsfqクラスのパケット数に関する統計情報を表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow mirredアクションとctinfoアクションのパケット数の統計情報を表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow htbレートリミッターとその設定の統計情報を表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow