NetBSD pf(4) "set skip on lo" doesn't work with IPv6

NetBSD 標準の packet filter である pf(4) の設定でハマッた記録 多分 ipflter(4) も npf(4) もおんなじ問題ありそう(こなみ感)
3
tnozaki @tnozaki

N6のpf(4).って、set skip on lo した場合に、外のマシンからは pass in してるサービスが見えるけど、自分自身から見ようとするとdropされるのが謎、Oはそういう動作はしないんだけど

2014-10-07 01:03:35
tnozaki @tnozaki

最小ケースこんなんかな set skip on lo block in pass out quick pass in quick proto tcp to port = 22

2014-10-07 01:08:49
tnozaki @tnozaki

同じ設定のOだと問題ないんだよなー

2014-10-07 01:19:02
tnozaki @tnozaki

pflogに何も出てこないのでブロックされてるんじゃなくてなんか変な虫さんいるのか、単にワイのPF力が雑魚なのか

2014-10-07 01:21:43
tnozaki @tnozaki

Nのpf(4)のバグについての再現方法を、チラシの裏に書いておいた hi-matic.org/diary/?2014100…

2014-10-07 06:50:11
tnozaki @tnozaki

Nのpf(4)と同じコードベースのO 4.2入れて試したけどset skip on loは問題ないにゃー

2014-10-07 17:22:44
tnozaki @tnozaki

動きを見てると、set skip on lo なら同じインタフェース間の通信はフィルタされないはずなのに、IPv6の場合だけスキップされず、さらに別のpass in ルールに壊れたデータ渡してin_chksumエラー出てる感じ

2014-10-07 17:40:06
tnozaki @tnozaki

net/netinetの下わかんないマン

2014-10-07 17:42:08
tnozaki @tnozaki

Nのpf(4)バグ追うのにpfctl(8)から読まないとならない程度の知識の時点で敗北感高い

2014-10-08 00:33:49
tnozaki @tnozaki

sys/dist/pfの下をPFI_IFLAG_SKIPあたりを蜘蛛の糸に読んでけば良さげ

2014-10-08 00:44:02
tnozaki @tnozaki

pf_test6()でPFI_IFLAG_SKIPが立ってたらPF_PASS返してるだけなので、DPFPRINTF()有効にしてもっと絞らんと駄目か

2014-10-08 00:53:47
tnozaki @tnozaki

まったく基本的な知識無しでpf(4)のソース読んで、pf_check_proto_cksum()あたりが怪しい気がするんだけど、基本的な知識が無さ過ぎてワイ、むせび泣く。

2014-10-08 02:59:11
enami tsugutomo @_enami

@tnozaki とりあえず、呼び出し側で固定で AF_INET 渡してるのはアカンと思うのだけど、もっと先?

2014-10-08 08:07:39
tnozaki @tnozaki

@_enami Oもそこは4.3で直してますね、でも4.2ではAF_INETのままで動いてるんですよねー cvsweb.openbsd.org/cgi-bin/cvsweb…

2014-10-08 08:36:55
enami tsugutomo @_enami

@tnozaki この diff って if ((r->action == PF_DROP) && ... の中なので、drop するときにしか通らないんじゃないかなあ?

2014-10-08 09:02:09
enami tsugutomo @_enami

@tnozaki 「IPv6の場合だけスキップされず、フィルタされたままになる」=>間違ってドロップと判断されてるってことかな?

2014-10-08 09:06:03
tnozaki @tnozaki

@_enami 症状だけみると block return してるのに RSTでconnection refused になってない = drop されてる?なので辻褄は合うんですよね

2014-10-08 09:12:00
tnozaki @tnozaki

@_enami とするともっと上に虫さんいるわけですかねぇ

2014-10-08 09:12:35
enami tsugutomo @_enami

@tnozaki O の場合は想定どおりに通る (== drop されない)ので、件のコードは通らない、ので、AF_INET 固定で渡していても影響ない、ってことでいいのかな?

2014-10-08 09:16:40
tnozaki @tnozaki

@_enami 私の理解が正しければ、set skip on loで同一インタフェース間の通信は全てフィルタ対象外なので、通らないと思うんですよね。

2014-10-08 09:25:05
enami tsugutomo @_enami

入り口は pfil6_wrapper か。

2014-10-08 09:52:48
enami tsugutomo @_enami

なんとなく、lo0 以外の if についたアドレス宛のパケットは、出て行くときには lo0 で、入ってくるときその if で pfil_hook に渡ってきているっぽい。

2014-10-08 18:10:47
enami tsugutomo @_enami

どうもそういう挙動になったのは、ip6_output.c 1.94 くらいからのよう。 cvsweb.netbsd.org/bsdweb.cgi/src…

2014-10-08 18:12:41
enami tsugutomo @_enami

対応する kame のコミットはこれか。 kame.net/dev/cvsweb2.cg…

2014-10-08 18:15:44
enami tsugutomo @_enami

で、O はまだそれが入ってない。

2014-10-08 18:16:08