Wireguard WAN IP 服务器可从路由器访问,但不能从 LAN 访问

Wireguard WAN IP 服务器可从路由器访问,但不能从 LAN 访问

我正在使用带有 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):

LUCI 路由表截图

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 专家,所以我不能保证这些更改会在路由器重启后保存。

相关内容