firewall: ensure wireguard egress traffic uses the anycast source IP

Before we relied on the IP being first in the interfaces file, which
is less than optimal. Now we use nftables to ensure the correct source
IP is set only for the (fwmarked) wireguard traffic.

Also remove iface hints from interfaces configuration as they are not
needed with ifupdown-ng.
This commit is contained in:
Timotej Lazar 2025-07-18 18:35:36 +02:00
parent 9b03b002f7
commit 6840838978
3 changed files with 20 additions and 5 deletions

View file

@ -1,10 +1,9 @@
{% set addrs = interfaces | selectattr('name', '==', 'lo') | map(attribute='ip_addresses') | first -%}
source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
address {{ wg_ip }}
iface lo
{% for address in addrs %}
address {{ address.address }}
{% endfor %}
source-directory /etc/network/interfaces.d

View file

@ -146,6 +146,19 @@ table inet filter {
}
}
table inet wireguard {
chain input {
type filter hook prerouting priority raw; policy accept
udp dport 51820 notrack \
comment "Disable connection tracking for wireguard"
}
chain output {
type route hook output priority raw; policy accept
meta mark 51820 meta nfproto ipv4 ip saddr set {{ wg_ip | ipaddr('address') }} notrack \
comment "Disable connection tracking and set anycast source IP for wireguard"
}
}
table ip nat {
include "/etc/nftables.d/interfaces.nft"
include "/etc/nftables.d/networks.nft"

View file

@ -1,5 +1,8 @@
iface lo
address {{ wg_ip }}
auto wg
iface wg inet static
iface wg
use wireguard
{% if wg_net is defined %}
address {{ wg_net }}