我正在尝试在主机操作系统上设置 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