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 接口指定显式“下一跃点”。
您可以使用AllowedIPs
WireGuard 接口的每个对等方的设置来让接口知道哪些数据包应发送到该对等方,有点像接口自己的内部路由表。您直接从 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
。