web-dev-qa-db-ja.com

nftablesの確率に基づいてパケットをドロップする方法は?

iptablesには 統計モジュール があり、確率に基づいてパケットを操作できます。nftablesを使用してこれを行うにはどうすればよいですか?

1
Avamander

numgen

nftablesにはすべての機能がありますが、何らかの理由で、nftマンページのどのバージョンにも記載されていません。

これを処理するカーネル側 nft_numgen が利用可能になりました Linux 4.9以降 およびユーザーランド側- 以降nftables 0.7リリース

  • 番号生成のサポートを追加します。ラウンドロビンパケットマークの設定に役立ちます。

    # nft add rule filter prerouting meta mark set numgen inc mod 2
    

    オフセットを指定して、開始する値を示すこともできます。

    モジュラスは、カウントシーケンスのスケールを提供します。あなたはできる
    これも地図から使用します。

    # nft add rule nat prerouting \
          dnat to numgen inc mod 2 map { 0 : 192.168.10.100, 1 : 192.168.20.200 }
    

    つまり、これはラウンドロビン方式で新しい接続を配布しています
    192.168.10.100と192.168.20.200の間。特別なNATチェーンセマンティクス:最初のパケットのみがルールを評価し、フォローアップパケットはconntrackに依存してNAT情報を適用することを忘れないでください。

    間隔を使用して、さまざまなバックエンドの重みでフロー分布をエミュレートすることもできます。

    # nft add rule nat prerouting \
          dnat to numgen inc mod 10 map { 0-5 : 192.168.10.100, 6-9 : 192.168.20.200 }
    

乱数のサポートもあります。例:前の例でinc(ラウンドロビンに使用)をrandomに置き換えます:

nft add rule nat prerouting dnat to numgen random mod 2 map { 0 : 192.168.10.100, 1 : 192.168.20.200 }

その他のドキュメントおよび関連資料:


質問に戻る

乱数は、モジュラスが適用される32ビット整数(モジュラスバイアスを無視するのに十分な大きさ)です。次に、その値を比較できます。すべての非ローカル着信IPv4パケットの5%をドロップするには、次のようになります。

#!/usr/sbin/nft -f

flush ruleset

table ip filter {
    chain input {
        type filter hook input priority 0; policy accept;
        iif "lo" accept
        numgen random mod 100 < 5 drop
    }
}

このルールセットを使用して、ホストからコンテナにpingを実行する場合の例:

# ping -q -f 10.0.3.66
PING 10.0.3.66 (10.0.3.66) 56(84) bytes of data.
^C
--- 10.0.3.66 ping statistics ---
34351 packets transmitted, 32592 received, 5% packet loss, time 19744ms
rtt min/avg/max/mdev = 0.004/0.017/0.481/0.018 ms, ipg/ewma 0.574/0.017 ms
2
A.B