NetBSD 8.0 と 8.1 以降で npf の挙動が違う?

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 だった。

カテゴリーBSD