Linux 桥上主机到 Wireguard 隧道的基于 Linux 策略的路由

Linux 桥上主机到 Wireguard 隧道的基于 Linux 策略的路由

172.16.20.4/32我正在尝试使用 Linux 路由将Linux 网桥(名为 )上的特定 IP ( ) 的流量路由vmbr-dmz到wireguard 隧道(名为wg0)。但是它不起作用。

我有两个问题,首先如何让它在wireguardAllowedIPs=0.0.0.0/0和限制为仅工作时工作AllowedIPs=172.16.20.4/32

我所做的 - 在我的主机上(默认安装 debian 11)使用 linux-bridging

9: vmbr-dmz: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 172.16.20.1/28 brd 172.16.20.15 scope global vmbr-dmz
11: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.2.0.2/32 scope global wg0
       valid_lft forever preferred_lft forever

我在 /etc/iproute2/rt_tables.d/dmzwg0.conf 中创建了一个新的策略路由表

100 dmzwg0

我为该 IP 地址创建一条规则以使用表 dmzwg0。该规则在列表中可见。

ip rule add from 172.16.20.4 lookup dmzwg0

我从 VPN 的默认设置开始,并开始使用systemctl start wg-quick@wg0

[Interface]
PrivateKey = k...=
Address = 10.2.0.2/32
DNS = 10.2.0.1

[Peer]
PublicKey = 8...=
AllowedIPs = 0.0.0.0/0
#AllowedIPs = 172.16.20.4/32
Endpoint = NNN.NNN.NNN.NNN:51820

我不确定如何找到 wg 的下一个 hopw 地址 - 但猜测它是 10.2.0.1。如何确定wireguard 接口的下一跳?由于它是AllowedIPs=0.0.0.0/0,我可以ping它,所以我可以添加为下一跳。

ip route add default via 10.2.0.1 dev wg0 table dmzwg0

看着表格dmzwg0我看到了我期望的路线

ip route show table dmzwg0
default via 10.2.0.1 dev wg0

我添加了以下 nf 表规则用于伪装。

nft add table nat
nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule nat postrouting oifname "wg0" ip saddr 172.16.20.4/32 counter packets 0 bytes 0 masquerade

我从虚拟机开始尝试连接到互联网。在我运行的主机上tcpump -i vmbr-dmz,我可以发现来自网桥的流量具有预期的 I 地址 IP

tcpdump -i vmbr-dmz
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on vmbr-dmz, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:40:09.803588 IP 172.16.20.4.56226 > dns.google.domain: 59264+ SRV? _http._tcp.security.debian.org. (48)
14:40:09.803620 IP 172.16.20.4.55497 > dns.google.domain: 60873+ SRV? _http._tcp.deb.debian.org. (43)
14:40:14.808719 IP 172.16.20.4.41741 > 8.8.8.4.domain: 60873+ SRV? _http._tcp.deb.debian.org. (43)
14:40:14.808721 IP 172.16.20.4.54173 > 8.8.8.4.domain: 59264+ SRV? _http._tcp.security.debian.org. (48)

wg0我在物理网卡上尝试了 tcpdump eno1,但看不到流量。

我的 nft nat 规则没有计算任何数据包?

Q1) - 那么我错过了什么?我可以采取哪些步骤来确定我的流量流向?

另外,如果我将wireguard配置更改为我想要的IP地址 allpw 172.16.20.4。我无法添加下一跃点,因为主机无法通过 到达/ping 下一跃点wg0

ip route add default via 10.2.0.1 dev wg0 table dmzwg0
Error: Nexthop has invalid gateway.

Q2) - 如何将默认路由添加到dmzwg0表中以仅通过 wg0 发送所有流量172.16.20.4/32

答案1

WireGuard 接口有效地使用其对等方的配置来确定下一个路由跃点,因此您不应尝试为 WireGuard 接口指定显式“下一跃点”。

您可以使用AllowedIPsWireGuard 接口的每个对等方的设置来让接口知道哪些数据包应发送到该对等方,有点像接口自己的内部路由表。您直接从 WireGuard 接口发出的数据包将被发送到对等方,其AllowedIPs设置与数据包的目标地址相匹配(如果有多个匹配项,将选择范围最小的匹配项;并且 WireGuard 不会让您对多个对等点使用相同的精确范围)。如果不AllowedIPs匹配,数据包将被丢弃。

快速工作组将自动设置路由以匹配AllowedIPs您为接口配置的所有路由。您可以使用接口的Table设置来指示 wg-quick 在与主路由表不同的路由表中设置这些路由:

[Interface]
PrivateKey = ...
Address = 10.2.0.2/32
Table = dmzwg0

[Peer]
PublicKey = ...
AllowedIPs = 0.0.0.0/0
Endpoint = NNN.NNN.NNN.NNN:51820

dmzwg0上面的配置将像这样设置你的表:

$ ip route show table dmzwg0
default dev wg0 scope link

要通过此 WireGuard 接口发送您要转发的数据包172.16.20.4,您只需添加您在问题中提到的策略路由规则:

ip rule add from 172.16.20.4 lookup dmzwg0 priority 123

请注意,如果您正在转发数据包 172.16.20.4通过 WireGuard 接口向某个对等方发送信息,您不要想要将该AllowedIPs对等点设置为172.16.20.4。始终设置AllowedIPs目的地你想发送的对等点(或通过它转发)——如果其中包括到互联网上任何地方的流量,则应该是0.0.0.0/0

相关内容