NetBSD pf(4) "set skip on lo" doesn't work with IPv6
N6のpf(4).って、set skip on lo した場合に、外のマシンからは pass in してるサービスが見えるけど、自分自身から見ようとするとdropされるのが謎、Oはそういう動作はしないんだけど
2014-10-07 01:03:35最小ケースこんなんかな set skip on lo block in pass out quick pass in quick proto tcp to port = 22
2014-10-07 01:08:49動きを見てると、set skip on lo なら同じインタフェース間の通信はフィルタされないはずなのに、IPv6の場合だけスキップされず、さらに別のpass in ルールに壊れたデータ渡してin_chksumエラー出てる感じ
2014-10-07 17:40:06pf_test6()でPFI_IFLAG_SKIPが立ってたらPF_PASS返してるだけなので、DPFPRINTF()有効にしてもっと絞らんと駄目か
2014-10-08 00:53:47まったく基本的な知識無しでpf(4)のソース読んで、pf_check_proto_cksum()あたりが怪しい気がするんだけど、基本的な知識が無さ過ぎてワイ、むせび泣く。
2014-10-08 02:59:11@_enami Oもそこは4.3で直してますね、でも4.2ではAF_INETのままで動いてるんですよねー cvsweb.openbsd.org/cgi-bin/cvsweb…
2014-10-08 08:36:55@tnozaki この diff って if ((r->action == PF_DROP) && ... の中なので、drop するときにしか通らないんじゃないかなあ?
2014-10-08 09:02:09@tnozaki 「IPv6の場合だけスキップされず、フィルタされたままになる」=>間違ってドロップと判断されてるってことかな?
2014-10-08 09:06:03@_enami 症状だけみると block return してるのに RSTでconnection refused になってない = drop されてる?なので辻褄は合うんですよね
2014-10-08 09:12:00@tnozaki O の場合は想定どおりに通る (== drop されない)ので、件のコードは通らない、ので、AF_INET 固定で渡していても影響ない、ってことでいいのかな?
2014-10-08 09:16:40@_enami 私の理解が正しければ、set skip on loで同一インタフェース間の通信は全てフィルタ対象外なので、通らないと思うんですよね。
2014-10-08 09:25:05なんとなく、lo0 以外の if についたアドレス宛のパケットは、出て行くときには lo0 で、入ってくるときその if で pfil_hook に渡ってきているっぽい。
2014-10-08 18:10:47どうもそういう挙動になったのは、ip6_output.c 1.94 くらいからのよう。 cvsweb.netbsd.org/bsdweb.cgi/src…
2014-10-08 18:12:41