NetBSD Advent Calendar 2022 12日目の記事です。今日はNPF(NetBSD Packet Filter)でフィルタログを確認する手順を紹介しようと思います。
実験用のネットワーク環境
まずはNPFでパケットフィルタの動作を試してみる実験環境を示します。今回は以下のように、2台のマシンを接続し、ホスト h1
から nr
へのICMPをフィルタする例で確認してみます。
(n1) (nr)
172.17.0.2<---->172.17.0.1
フィルタルールの例
NPFでのフィルタルールは以下になります。"icmp rule"グループにICMPをブロックするルールを記述しています。また、11日目の記事のMSSクランプでも解説しているように、 procedure
で宣言した内容は、フィルタルール側で apply
しないと適用されません。NPFのフィルタログ機能もMSSクランプと同じく、拡張機能として実装されているため、 procedure "log"
のような形で宣言しておき、マッチしたルールで apply
します。
また、ICMPグループ内で宣言したルールにマッチした時点でフィルタ処理を行ないため、 block {in|out} final ...
のように、 final
キーワードを付与しておきます。
$int_if = "wm1"
# The logging facility can be used together with npfd(8).
procedure "log" {
log: npflog0
}
group "icmp rule" {
block in final on $ext_if proto icmp all apply "log"
block out final on $ext_if proto icmp all apply "log"
}
NPFでのロギングはnpfdを動作させておく点に注意
NPFでログを記録するサンプルがnpf.conf(5)にありますが、そこには以下のようなコメントがあります。どうやらログを記録する場合は、フィルタルール側の設定だけでなく、併せてnpfd(8)という、ロギングと状態同期用のデーモンを動かしておく必要があります。
procedure "log" {
# The logging facility can be used together with npfd(8).
log: npflog0
}
さっそく npfd
を動かします。これで準備は完了です。
$ sudo /etc/rc.d/npfd onestart
NPFのパケットフィルタログを確認する
さっそく動作確認してみます。まずは npfctl start
でパケットフィルタ動作を有効化します。
$ sudo npfctl start
$ sudo npfctl reload
前述した n1
から nr
に対し、 ping
を実行します。想定通り応答が返ってこないため、パケットフィルタでICMPパケットがブロックされているようです。
ping -c 4 172.16.0.1
PING 172.16.0.1 (172.16.0.1): 56 data bytes
(応答が返ってこない(想定通りの挙動))
本当にパケットフィルタで止められているか確認してみます。npfctl stats
でブロックしたパケットの数が確認できるため、ホスト n1
側で ping
を実行したまま、ホスト nr
側で以下のようなコマンドを実行してみます。
$ sudo npfctl stats | grep -i block ; sleep 3 ; sudo npfctl stats | grep -i block
Packets blocked:
0 default block
337 ruleset block
Packets blocked:
0 default block
340 ruleset block
ブロックされているパケット数が増加しており、ちゃんとパケットがブロックされていることが分かります。
パケットフィルタログを確認してみる
パケットフィルタログを確認してみます。ログの設定は log: npflog0
のように記述し、この例では /var/log/npflog0.pcap
というファイルにログが記録されます。
procedure "log" {
log: npflog0
}
これはpcapファイルであるため、tcpdump(8)コマンドで内容を確認できます。
$ sudo tcpdump -enr /var/log/npflog0.pcap
...
07:03:29.133664 rule 5.rules.0/0(match): block in on wm1: 172.17.0.2 > 172.16.0.1: ICMP echo request, id 518, seq 300, length 64
07:03:30.132875 rule 5.rules.0/0(match): block in on wm1: 172.17.0.2 > 172.16.0.1: ICMP echo request, id 518, seq 301, length 64
n1
(172.17.0.2)から nr
(172.16.0.1)への ICMP echo request
をブロックしたというログがバッチリ残っていますね。
まとめ
NPFでパケットフィルタログを確認する手順を紹介しました。今回の例では単一のpcapファイルにログを記録していますが、 procedure
でのロギング宣言を複数行うことで、フィルタルール毎にログを変えるという運用もできそうです。