我家里有一个 ISP,可以为我提供 CGNAT。
所以我有一个 VPS 作为 Wireguard 服务器并运行。在我的家庭实验室中,我有一个安装了 Ubuntu 和 Nginx 代理管理器的虚拟机。在此虚拟机上,我还安装了wireguard 以连接到VPS。
拓扑图:
在我的 LAN 中,NginxProxyManager (NPM) GUI 可在 172.16.0.9:81 上使用
路由按预期工作。如果我通过子域连接到公共 VPS,我会看到我的网络服务器。所以效果很好。但我必须在 NPMwireguard 配置上使用“AllowedIPs=0.0.0.0/0”。任何其他配置都不起作用。
就我打开wireguard隧道而言,我根本无法通过本地网络连接到我的NPM。但它有互联网连接。它与AllowedIPs 配置有关。
我访问https://www.procustodibus.com/blog/2021/03/wireguard-allowedips-calculator/ 并尝试了许多不同的配置,禁止本地地址范围等......但没有任何效果。我可以通过 VPS 的公共 IP 访问我的网络服务器,也可以在本地访问我的 NPM,但不能同时访问。
到目前为止,这是我的配置:
VPS配置:
[Interface]
PrivateKey = ****
ListenPort = 51999
Address = 192.168.200.1/24
PostUp = iptables -t nat -A PREROUTING -p tcp -i ens192 '!' --dport 22 -j DNAT --to-destination 192.168.200.2
PostUp = iptables -t nat -A POSTROUTING -o ens192 -j SNAT --to-source z.z.z.z
PostUp = iptables -t nat -A PREROUTING -p udp -i ens192 '!' --dport 51999 -j DNAT --to-destination 192.168.200.2
PostUp = iptables -A FORWARD -i wg0 -o ens192 -j ACCEPT
PostUp = iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT
PostDown = iptables -t nat -F
PostDown = iptables -F FORWARD;
[Peer]
PublicKey = *****
AllowedIPs = 192.168.200.2/32
NPM 配置:
[Interface]
PrivateKey = ****
Address = 192.168.200.2/24
[Peer]
PublicKey = ****
AllowedIPs = 0.0.0.0/0
Endpoint = z.z.z.z:51999
PersistentKeepalive = 25
编辑: 在 NPM 线卫上,在我打开隧道之前,我得到了:
IP路由:
default via 172.16.0.1 dev ens18 proto static
172.16.0.0/24 dev ens18 proto kernel scope link src 172.16.0.9
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.18.0.0/16 dev br-00d63081655a proto kernel scope link src 172.18.0.1
ip规则:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
打开隧道后:
IP路由:
default via 172.16.0.1 dev ens18 proto static
172.16.0.0/24 dev ens18 proto kernel scope link src 172.16.0.9
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.18.0.0/16 dev br-00d63081655a proto kernel scope link src 172.18.0.1
192.168.200.0/24 dev wg0 proto kernel scope link src 192.168.200.2
ip规则:
0: from all lookup local
32764: from all lookup main suppress_prefixlength 0
32765: not from all fwmark 0xca6c lookup 51820
32766: from all lookup main
32767: from all lookup default
首先你需要了解这里的ip规则的含义,尤其是第一个。当您使用 时
AllowedIPs = 0.0.0.0/0
,wg-quick 并不完全使您的系统将所有非 WG 封装的流量路由出 wg 接口。这里的顶级规则实际上意味着除表default
中的路由之外的所有路由main
仍将被使用,因为它是唯一前缀长度等于或小于 的路由0
。(default
基本上是 的别名0.0.0.0/0
。)通常,主机为其“本地网络”拥有特定的路由,即“前缀路由”。但是,在您的情况下,显然您所说的“本地网络”实际上是一个对于 NPM 主机“远程”的网络。
我不会在这里深入探讨我们如何定义网络是“本地”还是“远程”,无论如何它不是问题的根本原因,但它或多或少会导致根本原因,即,您的
main
表没有default
覆盖此相关“本地网络”(即10.0.0.0/8
)的特定/非路由。结果是,目的地属于子网的流量将被路由到隧道中,而不是172.16.0.1
进一步转发,因为表default
中的路由main
实际上被表中的51820
路由覆盖(标记的 WG 封装的流量被例外)。10.0.0.0/8
因此,恕我直言,最简单的解决方案是向表中添加特定的路由main
(而不是与Table=
您ip rule
自己混淆)。这假设您不需要从10.0.0.0/8
VPS 端的另一个(在任何时候都没有进行源 NAT/IP 伪装)访问 NPM。(例如,假设您有一堆属于同一网络的 VPS,并且使用10.0.0.0/8
该网络或其子集。)FWIW,如果这个“本地网络”实际上没有前缀长度
/8
(但例如,实际上只是第一个八位字节/24
)10
,那么最好更具体地进行路由。