LoginSignup
1
0

More than 1 year has passed since last update.

NPF(NetBSD Packet Filter)のrndblock拡張機能でパケットをランダムにドロップしてみる

Posted at

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機能を試してみました。パケットフィルタの機能を拡張できるという仕組みは、実際に動かしてみないとイメージしづらいこともあるため、このようなサンプルの形で具体的な機能が提供されているのはありがたいですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0