NetBSD Advent Calendar 2022 1日目の記事です。今年もNetBSDの記事を増やして行きましょう!
今日はnpf(7)の紹介をしようと思います。
NPFとは?
NPF(NetBSD Packet Filter)とは、NetBSDで利用可能なレイヤ3パケットフィルタで、高いパフォーマンスとスケーラビリティ、モジュール性にフォーカスして開発が行われています。NPFは2009年にC99でスクラッチから作成されており、ライセンスは2条項BSDとなっています。
基本的に、パケットフィルタはユーザランド側から操作するためのコマンドが提供されますが、NPFではこれに加え、libnpf(3)というNPF操作用のライブラリも提供しています。そのため、DPDK(Data Plane Development Kit)やnetmapと組み合わせて使用されたりもします。
BSD系ってパケットフィルタの実装がいくつかありますよね?
BSD系OSでパケットフィルタを使う際、ちょっと悩ましいのが「どのパケットフィルタを使えば良いの?」という点があるかと思います。
以下のように、FreeBSD,NetBSD,OpenBSDで使用されるパケットフィルタはそれぞれ異なっています。
OS | 実装 | 名称 |
---|---|---|
FreeBSD | ipf(5) | IP Filter |
NetBSD | npf(7) | NetBSD Packet Filter |
OpenBSD | pf(4) | Packet Filter |
ただ、それぞれ相互に移植されていたりするので、基本的には使い慣れているパケットフィルタの実装を利用すれば良いのですが、NetBSDでは他のBSDで実装されたパケットフィルタの取り込み(メンテナンス)に手が回っていないという現状があります。
少し前の記事ですが、2019年の時点でNetBSDではOpenBSD由来のpfサポートが取り除かれています。
そのため、現時点(2022年時点)でパケットフィルタを使用する場合、NetBSDではnpf(7)またはipf(5)のどちらかを選択する形になります。
NPFを使ってみよう!
NPFの操作コマンド
NPFの操作はnpfctl(8)というコマンドを用いて行います。基本的な操作例は以下になります。
# npfctl reload npf.conf # NPF設定ファイルを読み込む
# npfctl stats # パケットフィルタの統計情報を表示
#
# npfctl show # パケットフィルタリングの設定を表示
#
# npfctl start # パケットフィルタリングを有効化する
# npfctl stop # パケットフィルタリングを無効化する
また、NetBSD起動時にNPFによるパケットフィルタを有効化する場合は、 /etc/rc.conf
に以下を追記します。
npf=YES
NPFの設定ファイル
NPFの設定は /etc/npf.conf
に記載します。任意の場所に設定ファイルを用意しておくことも可能で、その場合は npfctl reload
で設定を読み込ませます。
簡単なサンプルでNPFの設定例を見てみます。例としてICMP(ping)をブロックする設定例を以下に示します。
この例では、インタフェース wm0
から入ってくるICMPパケットは全てブロックされます。
group "block icmp" {
block in on wm0 proto 1 all
block out on wm0 proto 1 all
}
上記と同等のフィルタルールをipf(5)で記述する場合は以下のようになります。NPFではルールのグルーピングなどでより分かりやすい記述になることが見て取れます。
block in log quick proto icmp all group 100
block out log quick proto icmp all group 100
まとめ
NetBSDで利用できるパケットフィルタであるNPFについて簡単な概要を紹介してみました。
2日目以降はNPFを実際に使用する際の設定例やipfからNPFに置き換える場合のフィルタルール読み替えなどを紹介できればと思います。