25.6. tc-ctinfo ユーティリティーを使用したパケットのレート制限の設定
レート制限を使用すると、ネットワークトラフィックを制限し、ネットワーク内のリソースの枯渇を防ぐことができます。レート制限を使用すると、特定の時間枠内での反復的なパケット要求を制限することで、サーバーの負荷を軽減することもできます。さらに、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 ifb
Copy 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 up
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 物理ネットワークインターフェイスに
qdisc
属性を追加し、それを受信トラフィックに適用します。tc qdisc add dev enp1s0 handle ffff: ingress
# tc qdisc add dev enp1s0 handle ffff: ingress
Copy 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 ifb4eth0
Copy 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 1000
Copy 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 100
Copy 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 60
Copy 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:100
Copy 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 mark
Copy 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 0x64
Copy 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 mark
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -s
パラメーターを使用して、iperf3
ユーティリティーをシステム上のサーバーとして実行すると、サーバーはクライアント接続の応答を待ちます。iperf3 -s
# iperf3 -s
Copy 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 rate
Copy 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