Re: Problems with wireguard and maybe DDNS - SOLVED

Martijn van Wely <[email protected]> Sun, 19 Jul 2026 12:21:16 +0200
Newsgroups gmane.os.netbsd.general
Message-ID <[email protected]>
Hi all!

A while back I started this thread.
I'm happy to report I've found a configuration that works!
So if anyone else is running into this issue, here's my solution:

Long story short: yes wgconfig, unlike wg-quick on linux, can't make use 
of ddns hostnames, urls, however you're supposed to call them. It needs 
a ip-address:port combination to set the endpoint of a given peer.
Luckily, getaddrinfo can actually resolve the ddns hostname and provide 
the current IP address of the server peer (tested on NetBSD 10.1 amd64).

So I now have this working ifconfig.IF file:

---------------<ifconfig.wg0>------------------------

[host's ip within the wg network]
!wgconfig ${int} set private-key [path to private key file]
!wgconfig ${int} add peer [peername] [peer's public key] 
--preshared-key=[path to preshared-key file] --allowed-ips=[allowed ip 
range in peer's network] --endpoint=$(getaddrinfo [ddns hostname] | awk 
'NR==1 {print $4; exit 0}'):[peer's listening port]
up

------------------------------------------------------------

Of course this only works for a limited time since the peer is behind a 
residential IP.
So we just fix it by re-adding the peer.

I wrote this script for it:

----------<wg-ip-updater>--------------------------

#!/bin/sh

if test $# -ne 7
then
             echo 'usage: wg-ip-updater interface peer public-key 
preshared-key-path allowed-ips hostname port'
             exit 1
fi

int=$1
peer=$2
pubkey=$3
preshared=$4
ips=$5
host=$6
port=$7

case $(ifconfig ${int} | awk '/status/ {print $NF; exit 0}') in
             active)
                             # update peer
                             endpoint=$(getaddrinfo ${host} | awk 'NR==1 
{print $4; exit 0}'):${port}

                             wgconfig ${int} delete peer ${peer}
                             wgconfig ${int} add peer ${peer} \
                                              ${pubkey} \
  --preshared-key=${preshared} \
                                              --allowed-ips=${ips} \
  --endpoint=${endpoint}

                             ;;
esac

------------------------------------------------------------

Then just install that to wherever you think is appropriate (I went with 
/usr/local/sbin).
And then add it to root's crontab with the appropriate arguments.
I have it set to run every five minutes, since that is how often the 
peer device sends an updated ip-address to the dns provider.

There's probably ways to improve the script, like only updating things 
when the peer's ip-address has actually changed, but this works for now.
If anyone knows how to actually fix this without running this cronjob, 
of course please share.
This solution is fairly duct-tape-y.

Thanks to all the people who replied, your suggestions where very 
helpful in figuring things out.

Kind regards,

Martijn



On 06-07-2026 22:57, Martijn van Wely wrote:
> Hi!
>
> I'm trying to add a NetBSD device to my wireguard network.
> Since the wireguard 'server' peer is in a homenetwork, I've configured 
> it to be reachable through duckdns.
> On Debian Linux I would have a /etc/wireguard/wg0.conf like this for 
> one of the peers connecting to the server:
>
> [Interface]
> PrivateKey = [this peer's private key]
> Address = [this peer's ip adress]
>
> [Peer]
> PublicKey = [server's public key]
> PresharedKey = [a preshared key]
> AllowedIPs = [the ip range]
> Endpoint = [the duckdns url]:[listening port]
>
> And then you can activate it by running wg-quick wg0 up (or via the 
> init system: systemctl start wg-quick@wg0).
>
> I noticed that wg-quick isn't available after installing 
> wireguard-tools from pkgsrc (I guess because NetBSD's networking works 
> differently from most Linux distros?).
> But after some googling I've found some examples of setting it up via 
> an ifconfig.if file with a bunch of calls to wgconfig.
> Since the command-line arguments for wgconfig map pretty well on to 
> the lines in the wg0.conf I would normally write, I wrote this in 
> /etc/ifconfig.wg0:
>
> [the selected ip/range within the wg-network]
> !wgconfig ${int} set private-key /etc/wireguard/private.key
> !wgconfig ${int} add peer wgserver $(cat /etc/wireguard/public.key) 
> --preshared-key=/etc/wireguard/preshared.key --allowed-ips=[the 
> wg-network's ip-range] --endpoint=[the duckdns url]:[listening port]
> up
>
> (also for context, yes they keys are stored as separate files in 
> /etc/wireguard. They're owned by root:wheel with chmod 600 permission 
> bits).
>
> When I restart the network (by calling doas sh /etc/rc.d/network 
> restart) I get the following error message:
> wg0wgconfig: getaddrinfo: hostname or servname not provided or not known.
>
> getaddrinfo [duckdns url] does work though, but maybe there's a 
> problem with the fact that --endpoint is provided with a url:port 
> instead of a ip:port (the man page does specify ip:port)?
> getaddrinfo with [duckdns url]:[listening port] fails.
> I've also tried quoting various part in the url and port in case it's 
> a shell parsing problem, but that didn't help either.
>
> Anyhow, does anyone know how to configure NetBSD as a wireguard peer 
> when the other peer is behind a ddns url?
>
> Also: I am relatively experienced with Linux but new to NetBSD, so am 
> I completely off base in how I should configure wireguard here in the 
> first place?
> Also also, I'm new to mailing lists, so please say if I'm breaking 
> some kind of etiquette or formatting rule.
>
> Kind regards,
>
> Martijn.