LoginSignup
1
0

More than 1 year has passed since last update.

NPF(NetBSD Packet Filter)でパケットフィルタログを確認してみる

Posted at

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 でのロギング宣言を複数行うことで、フィルタルール毎にログを変えるという運用もできそうです。

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