NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/60191: npf: map dynamic to localhost works for v4 but not for v6



>Number:         60191
>Category:       kern
>Synopsis:       npf: map dynamic to localhost works for v4 but not for v6
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Apr 13 16:15:00 +0000 2026
>Originator:     Taylor R Campbell
>Release:        current, 11, 10, 9, ...
>Organization:
The NetBSDv6 Forwarding
>Environment:
>Description:

	With npf, a dynamic inbound NAT mapping of

	map $if dynamic proto tcp 127.0.0.1 port 8000 <- $v4 port 80

	works, but

	map $if dynamic proto tcp ::1 port 8000 <- $v6 port 80

	does not -- the packets arrive but don't seem to go anywhere.

>How-To-Repeat:

	Host has a public IPv4 address and a public IPv6 address.

	httpd listens on 127.0.0.1:8000 and [::1]:8000, as confirmed by
	sockstat:

	# sockstat -n | grep 'httpd.*tcp'
	1001     httpd      4024   3 tcp    127.0.0.1.8000        *.*
	1001     httpd      4024   4 tcp6   ::1.8000              *.*
	1001     httpd      5965   3 tcp    127.0.0.1.8000        *.*
	1001     httpd      5965   4 tcp6   ::1.8000              *.*
	1001     httpd      12899  3 tcp    127.0.0.1.8000        *.*
	1001     httpd      12899  4 tcp6   ::1.8000              *.*
	1001     httpd      21211  3 tcp    127.0.0.1.8000        *.*
	1001     httpd      21211  4 tcp6   ::1.8000              *.*

	Complete npf.conf:

$primary_if = "xennet0"

$primary_addrs = ifaddrs($primary_if)
$primary_v4 = { inet4($primary_if) }
$primary_v6 = { inet6($primary_if) }

procedure "log" {
	log: npflog0
}

map $primary_if dynamic proto tcp 127.0.0.1 port 8000 <- $primary_v4 port 80
map $primary_if dynamic proto tcp ::1 port 8000 <- $primary_v6 port 80

group default {
	pass final on lo0 all
	pass final on $primary_if all
	block all apply "log"
}

	Querying the public address over IPv4 on port 80 works:

	$ curl -4 --head 'http://...'
	HTTP/1.1 200 ...

	But querying the public address over IPv6 on port 80 just hangs:

	$ curl -6 --head 'http://...'

	`tcpdump -i lo0 -s 0 -vvv -n tcp port 8000 or tcp port 80'
	produces no output in either case.

	`tcpdump -i xennet0 -s 0 -vvv -n tcp port 8000 or tcp port 80'
	in the IPv4 case shows the whole conversation as expected.

	`tcpdump -i xennet0 -s 0 -vvv -n tcp port 8000 or tcp port 80'
	in the IPv6 case shows incoming TCP SYN packets and nothing
	else.

>Fix:

	Yes, please!




Home | Main Index | Thread Index | Old Index