検索

32.7. tc-ctinfo ユーティリティーを使用したパケットのレート制限の設定

download PDF

レート制限を使用すると、ネットワークトラフィックを制限し、ネットワーク内のリソースの枯渇を防ぐことができます。レート制限を使用すると、特定の時間枠内での反復的なパケット要求を制限することで、サーバーの負荷を軽減することもできます。さらに、tc-ctinfo ユーティリティーを使用して、カーネルでトラフィック制御を設定することにより、帯域幅レートを管理できます。

接続追跡エントリーには、Netfilter マークと接続情報が格納されます。ルーターがファイアウォールからパケットを転送するとき、ルーターはパケットから接続追跡エントリーを削除または変更します。接続追跡情報 (ctinfo) モジュールは、接続追跡マークからさまざまなフィールドにデータを取り出します。このカーネルモジュールは、Netfilter マークを、ソケットバッファー (skb) マークメタデータフィールドにコピーすることで保存します。

前提条件

  • iperf3 ユーティリティーがサーバーとクライアントにインストールされている。

手順

  1. サーバーで次の手順を実行します。

    1. ネットワークインターフェイスに仮想リンクを追加します。

      # ip link add name ifb4eth0 numtxqueues 48 numrxqueues 48 type ifb

      このコマンドには次のパラメーターがあります。

      name ifb4eth0
      新しい仮想デバイスインターフェイスを設定します。
      numtxqueues 48
      送信キューの数を設定します。
      numrxqueues 48
      受信キューの数を設定します。
      type ifb
      新しいデバイスのタイプを設定します。
    2. インターフェイスの状態を変更します。

      # ip link set dev ifb4eth0 up
    3. 物理ネットワークインターフェイスに qdisc 属性を追加し、それを受信トラフィックに適用します。

      # tc qdisc add dev enp1s0 handle ffff: ingress

      handle ffff: オプションでは、handle パラメーターはデフォルト値としてメジャー番号 ffff:enp1s0 物理ネットワークインターフェイス上のクラスフル qdisc に割り当てます。ここで、qdisc は、トラフィック制御を分析するためのキューイング規則パラメーターになります。

    4. 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

      このコマンドには次の属性があります。

      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
      actionmirred を設定して、受信パケットを宛先インターフェイス ifb4eth0 にリダイレクトします。
    5. クラスフル qdisc をインターフェイスに追加します。

      # tc qdisc add dev ifb4eth0 root handle 1: htb default 1000

      このコマンドは、メジャー番号 1 を root qdisc に設定し、マイナー ID 1000 のクラスフル qdisc を持つ htb 階層トークンバケットを使用します。

    6. インターフェイス上のトラフィックを 1 Mbit/s に制限し、上限を 2 Mbit/s にします。

      # tc class add dev ifb4eth0 parent 1:1 classid 1:100 htb ceil 2mbit rate 1mbit prio 100

      このコマンドには次のパラメーターがあります。

      parent 1:1
      classid1root1 として parent を設定します。
      classid 1:100
      classid1:100 に設定します。ここで、1 は親 qdisc の数で、100 は親 qdisc のクラスの数です。
      htb ceil 2mbit
      htb のクラスフルな qdisc では、ceil レート制限として 2 Mbit/s の上限帯域幅が許可されます。
    7. クラスレス qdisc の Stochastic Fairness Queuing (sfq) を、60 秒の時間間隔でインターフェイスに適用して、キューアルゴリズムの摂動を軽減します。

      # tc qdisc add dev ifb4eth0 parent 1:100 sfq perturb 60
    8. ファイアウォールマーク (fw) フィルターをインターフェイスに追加します。

      # tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100
    9. 接続マーク (CONNMARK) からパケットのメタマークを復元します。

      # nft add rule ip mangle PREROUTING counter meta mark set ct mark

      このコマンドでは、nft ユーティリティーにはチェーンルール仕様 PREROUTING を含む mangle テーブルがあり、ルーティング前に受信パケットを変更してパケットマークを CONNMARK に置き換えます。

    10. nft テーブルとチェーンが存在しない場合は、以下のようにテーブルを作成してチェーンルールを追加します。

      # nft add table ip mangle
      # nft add chain ip mangle PREROUTING {type filter hook prerouting priority mangle \;}
    11. 指定された宛先アドレス 192.0.2.3 で受信した tcp パケットにメタマークを設定します。

      # nft add rule ip mangle PREROUTING ip daddr 192.0.2.3 counter meta mark set 0x64
    12. パケットマークを接続マークに保存します。

      # nft add rule ip mangle PREROUTING counter ct mark set mark
    13. -s パラメーターを使用して、iperf3 ユーティリティーをシステム上のサーバーとして実行すると、サーバーはクライアント接続の応答を待ちます。

      # iperf3 -s
  2. クライアント上で、iperf3 をクライアントとして実行し、IP アドレス 192.0.2.3 で定期的な HTTP 要求と応答のタイムスタンプをリッスンするサーバーに接続します。

    # iperf3 -c 192.0.2.3 -t TCP_STREAM | tee rate

    192.0.2.3 はサーバーの IP アドレスで、192.0.2.4 はクライアントの IP アドレスです。

  3. Ctrl+C を押して、サーバー上の iperf3 ユーティリティーを終了します。

    Accepted connection from 192.0.2.4, port 52128
    [5]  local 192.0.2.3 port 5201 connected to 192.0.2.4 port 52130
    [ID] Interval       	Transfer 	Bitrate
    [5]   0.00-1.00   sec   119 KBytes   973 Kbits/sec
    [5]   1.00-2.00   sec   116 KBytes   950 Kbits/sec
    ...
    [ID] Interval       	Transfer 	Bitrate
    [5]   0.00-14.81  sec  1.51 MBytes   853 Kbits/sec  receiver
    
    iperf3: interrupt - the server has terminated
  4. Ctrl+C を押して、クライアント上の iperf3 ユーティリティーを終了します。

    Connecting to host 192.0.2.3, port 5201
    [5] local 192.0.2.4 port 52130 connected to 192.0.2.3 port 5201
    [ID] Interval       	Transfer 	Bitrate     	Retr  Cwnd
    [5]   0.00-1.00   sec   481 KBytes  3.94 Mbits/sec	0   76.4 KBytes
    [5]   1.00-2.00   sec   223 KBytes  1.83 Mbits/sec	0   82.0 KBytes
    ...
    [ID] Interval       	Transfer 	Bitrate     	Retr
    [5]   0.00-14.00  sec  3.92 MBytes  2.35 Mbits/sec   32     sender
    [5]   0.00-14.00  sec  0.00 Bytes  0.00 bits/sec            receiver
    
    iperf3: error - the server has terminated

検証

  1. インターフェイス上の htb クラスと sfq クラスのパケット数に関する統計情報を表示します。

    # tc -s qdisc show dev ifb4eth0
    
    qdisc htb 1: root
    ...
     Sent 26611455 bytes 3054 pkt (dropped 76, overlimits 4887 requeues 0)
    ...
    qdisc sfq 8001: parent
    ...
     Sent 26535030 bytes 2296 pkt (dropped 76, overlimits 0 requeues 0)
    ...
  2. mirred アクションと ctinfo アクションのパケット数の統計情報を表示します。

    # tc -s filter show dev enp1s0 ingress
    filter parent ffff: protocol ip pref 49152 u32 chain 0
    filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800: ht divisor 1
    filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 terminal flowid not_in_hw (rule hit 8075 success 8075)
      match 00000000/00000000 at 0 (success 8075 )
        action order 1: ctinfo zone 0 pipe
          index 1 ref 1 bind 1 cpmark 0x00000064 installed 3105 sec firstused 3105 sec DSCP set 0 error 0
          CPMARK set 7712
        Action statistics:
        Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 0 requeues 0)
        backlog 0b 0p requeues 0
    
        action order 2: mirred (Egress Redirect to device ifb4eth0) stolen
           index 1 ref 1 bind 1 installed 3105 sec firstused 3105 sec
        Action statistics:
        Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 61 requeues 0)
        backlog 0b 0p requeues 0
  3. htb レートリミッターとその設定の統計情報を表示します。

    # tc -s class show dev ifb4eth0
    class htb 1:100 root leaf 8001: prio 7 rate 1Mbit ceil 2Mbit burst 1600b cburst 1600b
     Sent 26541716 bytes 2373 pkt (dropped 61, overlimits 4887 requeues 0)
     backlog 0b 0p requeues 0
     lended: 7248 borrowed: 0 giants: 0
     tokens: 187250 ctokens: 93625

関連情報

  • tc(8) および tc-ctinfo(8) の man ページ
  • nft(8) の man ページ
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.