web-dev-qa-db-ja.com

`tc netem`を使用したネットワークシェーピングが機能していないようです

Ubuntu 16.06ボックスで特定のIPアドレスを対象とするトラフィックを単純に遅らせようとしています。私が研究した thisthisthis または this のように多くのリソースがあります。私はこれらの2つのコマンドセットで終わったが、どちらも機能しなかった。

tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 100ms
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.19.0.2/32 flowid 1:1

-または-

tc qdisc add dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 100ms
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.19.0.2/32 flowid 1:1

それらを実行した後、すべてのトラフィックがブロックされます-つまり、何も出てきません、ホストに到達できません:

$ ping pingserver2
PING pingserver2 (172.19.0.4) 56(84) bytes of data.
From 14d25a894559 (172.19.0.3) icmp_seq=1 Destination Host Unreachable
From 14d25a894559 (172.19.0.3) icmp_seq=2 Destination Host Unreachable

$ ping pingserver
PING pingserver (172.19.0.2) 56(84) bytes of data.
From 14d25a894559 (172.19.0.3) icmp_seq=1 Destination Host Unreachable
From 14d25a894559 (172.19.0.3) icmp_seq=2 Destination Host Unreachable

最初の行だけを実行した直後でも、それは行われます。

私が取っているアプローチの何が悪いのか誰かが誰か知っていますか?

3
peetonn

ようやくわかりました。 thisthis の章を注意深く調べた後、それがどのように機能するか、およびtcがパケットを処理する方法について、はるかによく理解できました。

基本的に、私がしなければならないことは、この種の木を構築することです:

          1:   root qdisc
         / | \ 
       /   |   \
       /   |   \
     1:1  1:2  1:3    classes
      |    |    |
     10:  20:  30:    qdiscs    qdiscs
    netem sfq  ---
band  0    1    2

つまり、netem qdiscを追加する以外に、2番目のバンドにsfqを追加して、「キャッチオール」ケース用のフィルターを追加する必要がありました。ここに私が使用しているすべてのコマンドがあります:

tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst 172.19.0.2 match ip dport 6363 0xffff flowid 1:1
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip protocol 1 0xff flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10ms
tc qdisc add dev eth0 parent 1:2 handle 20: sfq

上記の各行の説明は次のとおりです。

  1. インターフェース1:0にハンドル(id)eth0(0は必須ではありません)を使用して、prioキューイング規則をルートに追加します。 prio qdiscにはデフォルトで3つのクラスがあります-1:1 1:2および1:3。これらのクラスには、次の3行でフィルターが割り当てられます(順序が重要です!)。発信パケットの処理方法を理解することが重要です。ルートからツリーに入り、ルートから終了します(葉から落ちることはありません!) )。

  2. スローダウンするトラフィック用のフィルターを追加します(この場合、ポート172.19.0.26363に向かうトラフィックです)。フィルターはルートノード(parent 1:)に接続します-これは、すべての送信パケットがこのフィルターによってチェックされることを意味します。フィルターはIPとポート(ip dst ... ip dport ...)をチェックし、クラス1:1flowid 1:1)にリダイレクトします。

  3. 上記と同様に、これは "catch-all"フィルターが設定される方法で(これに感謝 post )、クラス1:2にリダイレクトします。

  4. 同様に、このフィルターはICMPパケット(pingパケット)の「キャッチオール」であり、1:2にもリダイレクトされます。

  5. qdiscをクラス1:1にアタッチし、10:0のハンドルを割り当てて、netem qdiscに10ミリ秒遅延させます。

  6. sfq qdiscをクラス1:2にアタッチします-このqdiscは、「確率的公平性」の方法で「キャッチオール」フィルターに一致した他のすべてのパケットを処理します。

リンクを張った章を読むことを強くお勧めします。これらの章は多くのことを明確にし、解決策を模索するのをやめ、自分でネットワークシェーピングの設計を開始できるようにするためです。

また、これらのコマンドはデバッグ/検査に非常に役立つことがわかりました。

tc -s qdisc ls dev eth0
tc -s filter ls dev eth0
3
peetonn