NetBSD Advent Calendar 2022 18日目の記事です。今日はNPF(NetBSD Packet Filter)の拡張機能として提供されている、randblock機能を紹介しようと思います。
NPFのrndblock機能
NetBSDの拡張機能として、rndblockという機能が提供されています。ソースコードはsrc/sys/net/npf/npf_ext_rndblock.cにあり、機能としては一定の確立でランダムにパケットをドロップするというもので、コメントをみると拡張機能のデモ的な位置づけで用意されているようです。
/*
* NPF random blocking extension - kernel module.
* This is also a demo extension.
*/
とはいえ、NPFの拡張機能の設定方法や実装手順のサンプルとして有用な感じがします。
rndblockを試してみる
実際にrndblock機能を試してみましょう。例として、ICMP echoパケットに対し、rndblockを適用してみます。
NPFでの設定は以下のようになります。
procedure "rndblock" {
rndblock: percentage 50.0
}
group "icmp rule" {
pass in final on $ext_if proto icmp icmp-type echo all apply "rndblock"
pass out final on $ext_if proto icmp all
}
注意点としては、どうやらrndblockは pass
ルールに対して適用する類の機能となっているようです。ソースコードを見ると、 block
ルールにrndblockを apply
した場合は、単にブロックされるルールとして処理されています。以下のコードの106行目~109行目の部分で、すでにブロックされるルール(という判定になっている)なら、そのままブロックする、という挙動になっています。そのため、NPFのフィルタルールでも pass
ルールに対してrndblockを apply
しています。
sys/net/npf/npf_ext_rndblock.c:
96 /*
97 * npf_ext_rndblock: main routine implementing the extension functionality.
98 */
99 static bool
100 npf_ext_rndblock(npf_cache_t *npc, void *meta, const npf_match_info_t *mi,
101 int *decision)
102 {
103 npf_ext_rndblock_t *rndblock = meta;
104 unsigned long c;
105
106 /* Skip, if already blocking. */
107 if (*decision == NPF_DECISION_BLOCK) {
108 return true;
109 }
...
さっそくrndblockによるパケットフィルタの挙動を試してみます。先述したルールをリロードします。
$ sudo npfctl reload
外部ネットワーク側から ping
を実行してみます。 ping -c 10
と試行回数が小さいので結果に若干のぶれがありますが、おおよそ半分のICMP echoパケットがブロックされている(NPF側では rndblock: percentage 50.0
という設定)ということが分かります。
$ ping -c 10 172.16.0.1
PING 172.16.0.1 (172.16.0.1): 56 data bytes
64 bytes from 172.17.0.1: icmp_seq=2 ttl=255 time=0.603397 ms
64 bytes from 172.17.0.1: icmp_seq=4 ttl=255 time=0.768500 ms
64 bytes from 172.17.0.1: icmp_seq=7 ttl=255 time=0.702710 ms
64 bytes from 172.17.0.1: icmp_seq=8 ttl=255 time=0.640894 ms
----172.16.0.1 PING Statistics----
10 packets transmitted, 4 packets received, 60.0% packet loss
round-trip min/avg/max/stddev = 0.603397/0.678875/0.768500/0.072434 ms
まとめ
NPFの拡張機能として提供されている、rndblock機能を試してみました。パケットフィルタの機能を拡張できるという仕組みは、実際に動かしてみないとイメージしづらいこともあるため、このようなサンプルの形で具体的な機能が提供されているのはありがたいですね。