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