Ramiro,

as you do not mention any sysctl settings -- do you have these entries in 
/etc/sysctl.conf:

    net.inet.ip.forwarding=1
    net.inet.ip.redirect=0

Do you see redirects from netstat -s?

--
J. Hannken-Illjes - [email protected]



> On 25. Jan 2026, at 08:43, Ramiro Aceves <[email protected]> wrote:
> 
> Hello,
> 
> I have been investigating this subject during days and the conclusion after 
> testing the same WireGuard tunnel in FreeBSD and Linux (were it works fine) 
> is that NetBSD works as is intended in the man page but fails in this 
> particular scenario. I do not know whether perhaps is intentional, aiming 
> security in the tunnels.
> 
> I am experiencing an issue with WireGuard on NetBSD when using a provider 
> that assigns a single routed IPv4 address (/32) over the tunnel. 
> (AMateurPackeRadioNetwork AMPRNet https://wiki.ampr.org)
> 
> My setup is the following:
> 
>    -NetBSD-10.1 on Raspberry Pi ZeroW
>     (have also tested in NetBSD AMD64, even NetBSD-current using
>     a live image.). Home router and ISP  provider without CGNAT.
> 
>    -WireGuard tunnel from a https://connect.44net.cloud.
> 
>    -Provider assigns one public IPv4 address (44.27.132.76/32)
>     over the  tunnel
> 
>    -The provider routes this address through the WireGuard peer
> 
>    -No NAT is involved
> 
>    -The same provider and configuration work correctly on Linux
>     and FreeBSD
> 
> The configuration script:
> 
> netbsd-raspaZeroW$ cat levantatunel.sh
> #!/bin/sh
> set -x
> ifconfig wg0 create mtu 1380
> ifconfig wg0 inet 44.27.132.76/32
> ifconfig wg0 inet6 fe80::644d:cf7a:c00:bae9/128
> wgconfig wg0 set private-key /etc/wg/wg0.priv
> wgconfig wg0 add peer A \
> asdfggfhffghkjhkhkhlkjhlkjhlkjhljhlkj \
> --allowed-ips=0.0.0.0/0,::/0 \
> --endpoint=44.27.227.1:44000
> ifconfig wg0 up
> 
> 
> netbsd-raspaZeroW# ifconfig wg0
> wg0: flags=0x8041<UP,RUNNING,MULTICAST> mtu 1380
> status: active
> inet6 fe80::ba27:ebff:feed:8547%wg0/64 flags 0 scopeid 0x3
> inet6 fe80::644d:cf7a:c00:bae9%wg0/128 flags 0 scopeid 0x3
> inet 44.27.132.76/32 flags 0
> netbsd-raspaZeroW#
> 
> 
> Observed behavior on NetBSD:
> 
>    Outgoing traffic works
> 
>    The tunnel is established correctly (I can see it in the
>    provider  "Dashboard" WEB page)
> 
>    Ping and SSH from the NetBSD host to the Internet work
> 
>    Incoming traffic from the Internet to 44.x.x.x does not work
> 
>    TCP connections (SSH, HTTP) time out
> 
>    ICMP do not work
> 
>    sshd is listening on all interfaces, and no firewall is active.
> 
> Comparison with Linux and FreeBSD
> 
>    With the same provider and same IP address:
> 
>    On Linux, ip route installs a local route for the tunnel address:
> 
>    local 44.x.x.x dev wg0
> 
>    On FreeBSD, the address is bound to lo0 and treated as a local
>    host  route. It does some trick dividing internet adreeses in
>    twoblocks
> 
>    0.0.0.0/1          link#3             US              wg0
>    128.0.0.0/1        link#3             US              wg0
> 
> In both Linux and FreeBSD operating systems, incoming connections work 
> correctly (please see routing tables at the botton of this email:
> 
> On NetBSD, the address appears to be treated mainly as a point-to-point/host 
> route, and incoming packets do not seem to be handled as local traffic in the 
> same way.
> 
> Possible workaround will be ask for a routed subnet (e.g. /29) instead of a 
> /32, and the interface is configured with that subnet, everything possibly 
> will work correctly on NetBSD (AI guess).
> 
> This suggests that the problem is specific to single-address (/32) routed 
> setups.
> 
> It seems that when a WireGuard interface is configured with a /32 address, 
> NetBSD does not install a proper “local” route for that address, or does not 
> treat it as fully local, which causes incoming traffic to be dropped or 
> misrouted.
> 
> Linux and FreeBSD appear to handle this case differently by creating explicit 
> local/loopback routes.
> 
> When a WireGuard interface is configured with a /32 address that is routed to 
> the host, incoming packets destined to that address should be treated as 
> local and delivered to local sockets, similarly to Linux and FreeBSD.
> 
> Could this be considered a bug or missing feature in the NetBSD 
> WireGuard/network stack?
> 
> Is there a recommended way to configure routed /32 tunnel addresses so that 
> incoming connections work correctly?
> 
> Any guidance or suggestions would be appreciated.
> 
> Should I fill a bug report/feature request?
> 
> Thank you very much for your time.
> 
> Best regards,
> Ramiro
> 
> ***NetBSD routing tables:
> 
> netbsd-raspaZeroW# route -n show
> Routing tables
> 
> Internet:
> Destination        Gateway            Flags    Refs      Use    Mtu Interface
> default            192.168.1.1        UGS         -        -      -  bwfm0
> 44.27.132.76       wg0                UHl         -        -      -  wg0
> 44.27.132.76/32    44.27.132.76       U           -        -      -  wg0
> 127/8              127.0.0.1          UGRS        -        -  33176  lo0
> 127.0.0.1          lo0                UHl         -        -  33176  lo0
> 192.168.1/24       link#2             UC          -        -      -  bwfm0
> 192.168.1.230      link#2             UHl         -        -      -  lo0
> 192.168.1.200      1c:69:7a:0a:83:9d  UHL         -        -      -  bwfm0
> 192.168.1.203      d8:3a:dd:99:78:45  UHL         -        -      -  bwfm0
> 192.168.1.1        60:8d:26:32:34:23  UHL         -        -      -  bwfm0
> 
> ***FreeBSD routing tables:
> root@freebsd-nuc8i7:/home/ramiro # netstat -rn
> Routing tables
> 
> Internet:
> Destination        Gateway            Flags         Netif Expire
> 0.0.0.0/1          link#3             US              wg0
> default            192.168.1.1        UGS             em0
> 44.27.132.76       link#2             UH              lo0
> 44.27.227.1        192.168.1.1        UGHS            em0
> 127.0.0.1          link#2             UH              lo0
> 128.0.0.0/1        link#3             US              wg0
> 192.168.1.0/24     link#1             U               em0
> 192.168.1.200      link#2             UHS             lo0
> 
> ***Linux tables:
> 
> root@debian-nuc8i7:~# ip -4 r show table all
> default dev wg0 table 51820 scope link
> default via 192.168.1.1 dev eno1 proto static metric 100
> 192.168.1.0/24 dev eno1 proto kernel scope link src 192.168.1.200 metric 100
> local 44.27.132.76 dev wg0 table local proto kernel scope host src 
> 44.27.132.76
> local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
> local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
> broadcast 127.255.255.255 dev lo table local proto kernel scope link src 
> 127.0.0.1
> local 192.168.1.200 dev eno1 table local proto kernel scope host src 
> 192.168.1.200
> broadcast 192.168.1.255 dev eno1 table local proto kernel scope link src 
> 192.168.1.200

Reply via email to