pf: first-match-wins for nat rules, even in anchors

Ensure we stop evaluating nat rules if we find a match in a nat-anchor.

PR:		299320
MFC after:	1 week
Sponsored by:	Rubicon Communications, LLC ("Netgate")
This commit is contained in:
Kristof Provost committed 2026-10-13 15:30:25 +02:00
1 parent ee8cb6ab67
commit b5219c068f
2 files changed
+50

No files matched your search

+46
View File
@@ -1009,6 +1009,51 @@ first_match_cleanup()
pft_cleanup
}
atf_test_case "first_match_anchor" "cleanup"
first_match_anchor_head()
{
atf_set descr 'Test that NAT matches within an anchor are final (PR 299320)'
atf_set require.user root
}
first_match_anchor_body()
{
pft_init
epair_nat=$(vnet_mkepair)
epair_echo=$(vnet_mkepair)
vnet_mkjail nat ${epair_nat}b ${epair_echo}a
vnet_mkjail echo ${epair_echo}b
ifconfig ${epair_nat}a 192.0.2.2/24 up
route add -net 198.51.100.0/24 192.0.2.1
jexec nat ifconfig ${epair_nat}b 192.0.2.1/24 up
jexec nat ifconfig ${epair_echo}a 198.51.100.1/24 up
jexec nat sysctl net.inet.ip.forwarding=1
jexec echo ifconfig ${epair_echo}b 198.51.100.2/24 up
# Enable pf!
jexec nat pfctl -e
pft_set_rules nat \
"nat-anchor \"foo\"" \
"nat on ${epair_echo}a inet from 192.0.2.0/24 to any -> 198.51.100.3"
echo "nat on ${epair_echo}a inet from 192.0.2.0/24 to any -> 198.51.100.1" | jexec nat pfctl -g -f - -a "foo"
atf_check -s exit:0 -o ignore ping -c 3 198.51.100.2
atf_check -s exit:0 -e ignore \
-o match:"all icmp 198.51.100.1:.*(192.0.2.2:.*) -> 198.51.100.2:8.*" \
jexec nat pfctl -ss
}
first_match_anchor_cleanup()
{
pft_cleanup
}
atf_init_test_cases()
{
atf_add_test_case "exhaust"
@@ -1032,4 +1077,5 @@ atf_init_test_cases()
atf_add_test_case "empty_pool"
atf_add_test_case "dummynet_mask"
atf_add_test_case "first_match"
atf_add_test_case "first_match_anchor"
}