我正在使用带有 OpenWRT OpenWrt 19.07.8 r11364-ef56c85848 的 GL.inet 路由器。
我在远程机器上设置了一个 Wireguard 服务器。在未连接 VPN 的情况下,我可以使用其公共 IP 从我的 LAN 访问该服务器。在连接 VPN 的情况下,我可以使用内部 IP 访问它,但无法再通过 LAN 上的计算机的外部 IP 访问它。
Traceroute 显示数据包在路由器上失败,没有到主机的路由:
~ % ping 35.190.161.xxx
PING 35.190.161.169 (35.190.161.xxx): 56 data bytes
92 bytes from router.local.wan (192.168.1.254): Destination Host Unreachable
但是如果我通过 ssh 进入路由器,它不仅显示预期的路由,而且 ping 和 traceroute 也会成功:
~# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 100.64.0.1 0.0.0.0 UG 0 0 0 wan
10.66.66.0 * 255.255.255.0 U 0 0 0 wg0
34.120.255.244 * 255.255.255.255 UH 0 0 0 wan
35.190.161.xxx 100.64.0.1 255.255.255.255 UGH 0 0 0 wan
100.64.0.0 * 255.192.0.0 U 0 0 0 wan
192.168.0.0 * 255.255.252.0 U 0 0 0 br-lan
~# ping 35.190.161.xxx
PING 35.190.161.xxx (35.190.161.xxx): 56 data bytes
64 bytes from 35.190.161.xxx: seq=0 ttl=59 time=243.335 ms
我针对该客户端的 Wireguard 配置是:
[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxlMxuhwtB9vV2Gpks=
Address = 10.66.66.3/32,fd42:42:42::3/128
DNS = 8.8.8.8,8.8.4.4
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxkIIPFsO2/EuXDNbeR3g=
PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxYnnXy4CZUMUzGBAieqU=
Endpoint = 35.190.161.xxx:60242
AllowedIPs = 10.66.66.0/24,::/0
当我能使用内部 IP 到达远程服务器(例如通过 ssh),必须根据 VPN 是否建立来选择正确的地址,这很不方便。
我的 Wireguard 配置中缺少什么吗?或者存在其他问题?
答案1
我最近也遇到了这个问题,我发现我的路由器为服务器IP地址添加了IP规则(表31):
root@GL-MT300N-V2:~# ip rule
0: from all lookup local
31: from all fwmark 0x60000/0x60000 lookup 31
1001: from all iif eth0.2 lookup 1
2001: from all fwmark 0x100/0x3f00 lookup 1
2061: from all fwmark 0x3d00/0x3f00 blackhole
2062: from all fwmark 0x3e00/0x3f00 unreachable
32766: from all lookup main
32767: from all lookup default
如果我启用 wireguard 客户端,然后使用ip rule del from all fwmark 0x60000/0x60000 lookup 31
命令手动删除此规则,我就可以直接从 LAN 网络 ping/ssh 到 Wireguard 服务器 IP。
我找到了几个添加了此规则的地方:
/etc/init.d/wireguard
/etc/vpn.user
我已经用 IP 规则添加命令注释了各行,现在我可以关闭和打开 wireguard 客户端并且仍然可以访问 WAN IP:
#fix ddns conflict
#local DDNS=$(iptables -nL -t mangle | grep WG_DDNS)
#local lanip=$(uci get network.lan.ipaddr)
#local gateway=${lanip%.*}.0/24
#if [ -z "$DDNS" ];then
#iptables -t mangle -N WG_DDNS
#iptables -A WG_DDNS -t mangle -i br-lan -s $gateway -d $publicip -j MARK --set-mark 0x60000
#iptables -t mangle -I PREROUTING -j WG_DDNS
#ip rule add fwmark 0x60000/0x60000 lookup 31 pref 31
#ip route add $publicip dev wg0 table 31
#fi
请注意,我不是路由专家,我不知道这个 hack 是否会破坏任何东西(评论中说“修复 ddns 冲突”——不确定这是什么意思),但对我来说,它工作正常,不会破坏任何东西(我使用 wireguard 连接仅访问远程网络)。另外,我也不是 OpenWRT 专家,所以我不能保证这些更改会在路由器重启后保存。