NetBSD/amd64 8.0_STABLE(以下 8.0)
NetBSD/amd64 8.1_STABLE(8.1)
NetBSD/amd64 9.0_BETA(9.0)
こんな感じの、中からの通信はプロトコルを問わないけれど、外からはsshだけ受け付ける npf.conf
:
$ext_if = "bge0" # or "re0" or ...
$ext_v4 = inet4($ext_if)
group "external" on $ext_if {
pass stateful out final all # rule (1)
pass in final proto tcp to $ext_v4 port ssh # rule (2)
}
default {
pass final on lo0 all
block all # rule (3)
}
だけど、8.1, 9.0 だと外から ssh で接続できない。
8.0 の方は、外からのssh 接続要求は rule (2) で、その返事は rule (1) で、それぞれ pass して、その後も問題なく通信できる。
8.1, 9.0 の方も、外からのssh 接続要求は rule (2) で pass するのだけれど、その返事が rule (1) にひっかからずに rule (3) で block される。
rule (2) を以下の rule (2)’:
pass stateful in final proto tcp to $ext_v4 port ssh # rule (2)'
に置き換えれば解決するんだけれど、何故挙動が違うのか不明。
追記:
npfctl show
してみると rule (1) が、
8.0 の方は:
pass stateful out final all
8.1, 9.0 の方は:
pass stateful out final flags S/FSRA
となっていて、pass stateful out で pass out を兼ねるような使い方は(デフォルトでは)できなくなったようです。(まあ正しい方向性だよね。)
さらに追記:
NetBSD 7.0 より前の時点で npf.conf(5) に:
By default, a stateful rule implies SYN-only flag check (“flags S/SAFR”) for the TCP packets.
とあるので、8.1, 9.0 の動作が正しくて 7.x, 8.0 の動作はバグかな?
またさらに追記:
PR bin/54124 だった。