wireguard: when dyn-dns refresh is enabled, reconnect after failures

Make the dynamic-dns refresh systemd service (controlled via the
preexisting option dynamicEndpointRefreshSecond) robust to e.g. dns
failures that happen on intermittent network connections.

Background:

When dns resolution fails with a 'permanent' error ("Name or service not
known" instead of "Temporary failure in name resolution"), wireguard
won't retry despite WG_ENDPOINT_RESOLUTION_RETRIES=infinity.

-> This change should improve reliability/connectivity.

somewhat related thread: https://github.com/NixOS/nixpkgs/issues/63869
This commit is contained in:
seb314 2021-10-02 13:34:25 +02:00
parent 574a61b4cd
commit 82c5c3c9a9

View file

@ -224,6 +224,21 @@ let
'';
};
dynamicEndpointRefreshRestartSeconds = mkOption {
default = null;
example = 5;
type = with types; nullOr ints.unsigned;
description = lib.mdDoc ''
When the dynamic endpoint refresh that is configured via
dynamicEndpointRefreshSeconds exits (likely due to a failure),
restart that service after this many seconds.
If set to `null` the value of
{option}`networking.wireguard.dynamicEndpointRefreshSeconds`
will be used as the default.
'';
};
persistentKeepalive = mkOption {
default = null;
type = with types; nullOr int;
@ -320,7 +335,16 @@ let
# cannot be used with systemd timers (see `man systemd.timer`),
# which is why `simple` with a loop is the best choice here.
# It also makes starting and stopping easiest.
#
# Restart if the service exits (e.g. when wireguard gives up after "Name or service not known" dns failures):
Restart = "always";
RestartSec = if null != peer.dynamicEndpointRefreshRestartSeconds
then peer.dynamicEndpointRefreshRestartSeconds
else peer.dynamicEndpointRefreshSeconds;
};
unitConfig = lib.optionalAttrs dynamicRefreshEnabled {
StartLimitIntervalSec = 0;
};
script = let
wg_setup = concatStringsSep " " (