通过 wireguard 从主机操作系统路由 KVM VM 流量

通过 wireguard 从主机操作系统路由 KVM VM 流量

我正在尝试在主机操作系统上设置 Wireguard 隧道,并通过此 Wireguard VPN 路由来自特定 KVM VM 的所有网络流量。我的 KVM VM 是使用桥接网络设置的。我想要通过 VPN 路由的特定 VM 的主机操作系统上的接口名称是“viifv1424”。这些是我为尝试实现此目的而运行的命令,但似乎 VM 仍在正常路由,而不是通过 VPN 路由:

这些是我运行的确切命令。VM 接口名称为 viifv1424,wireguard 接口名为 wg_viifv1424

#Setup fireguard tunnel
ip link add dev wg_viifv1424 type wireguard
wg setconf wg_viifv1424 /etc/wireguard/wg_viifv1424.conf

#routing table
ip link set dev wg_viifv1424 up
ip route add default dev wg_viifv1424 table 100
ip rule add iif viifv1424 table 100

#iptables rules
iptables -t nat -A POSTROUTING -o wg_viifv1424 -j MASQUERADE
iptables -A FORWARD -i viifv1424 -o wg_viifv1424 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i viifv1424 -o wg_viifv1424 -j ACCEPT

wg_viifv1424.conf内容:

[Interface]
PrivateKey = XXXXXXX
[Peer]
PublicKey = XXXXXXX
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = 1.2.3.4:51820

我做错了什么以及我该如何实现这一目标?

答案1

当您的主机做出相关路由决策时,输入接口(iif在您的规则中)是桥接设备,而不是viifv1424

示例设置

在我的系统上,我运行的是典型的 libvirt 设置。我有一个default与桥接设备关联的网络virbr0。如果我在该网络上创建虚拟机,则虚拟机将连接到虚拟接口vnet0

我有一个配置为 的 wireguard 接口wg0,地址为192.168.64.14

无效的规则

如果我设置了与您的规则相同的规则:

ip route add default dev wg0 table 100
ip rule add prio 100 iif vnet0 table 100
iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE

然后尝试ping 8.8.8.8,我看到回显请求传出主机默认接口。

有效的规则

如果我设置以桥接接口作为输入接口的策略规则:

ip route add default dev wg0 table 100
ip rule add prio 100 iif virbr0 table 100
iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE

然后我看到请求wg0按预期发出。运行后tcpdump -i wg0 -n我看到:

19:05:19.217001 IP 192.168.64.14 > 8.8.8.8: ICMP echo request, id 26, seq 1, length 64
19:05:19.274453 IP 8.8.8.8 > 192.168.64.14: ICMP echo reply, id 26, seq 1, length 64

相关内容