在家里,有一个 ISP 可以为我提供 CGNAT。
因此,我已将 VPS 作为 wireguard 服务器启动并运行。在我的家庭实验室中,我安装了一台安装了 Ubuntu 和 Nginx 代理管理器的虚拟机。在此虚拟机上,我还安装了 wireguard 以连接到 VPS。
拓扑图:
在我的局域网中,NginxProxyManager (NPM) GUI 可通过 172.16.0.9:81 访问
路由按预期工作。如果我通过子域连接到公共 VPS,我会看到我的网络服务器。所以这很好用。但我必须在 NPM wireguard 配置上使用“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 wireguard 上,在我启动隧道之前,我得到了:
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
答案1
32764: from all lookup main suppress_prefixlength 0
32765: not from all fwmark 0xca6c lookup 51820
32766: from all lookup main
首先,您需要了解此处 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
或它的一个子集。)
值得一提的是,如果这个“本地网络”实际上没有前缀长度/8
(但例如,实际上只是一些第一个八位/24
字节10
),最好更具体地进行路由。
答案2
大家好 :) 我的设置几乎相同,但我在 NPM 网站上遇到了 SNAT 问题。使用:
PostUp = iptables -t nat -A POSTROUTING -o ens192 -j SNAT --to-source z.z.z.z
来自客户端的原始 IP 也转发到 NPM 服务器,从那里将每个预留代理的 80/443 流量转发到其他机器。
但是,如果我想将特定端口从 NPM 服务器转发到另一个本地服务器,并使用 SNAT 保留来自客户端的原始 IP,这对我来说不起作用。但是,使用 MASQUERADE 就可以了。MASQUERADE 的问题在于,在本地计算机上,我只能看到来自 NPM 计算机的 IP,而看不到来自客户端的原始 IP:
VPS:
Address = 192.168.4.1/24
PostUp = iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT
PostUp = iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
PostUp = iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --dport 1234-j DNAT --to 192.168.4.2
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source z.z.z.z
PostDown = iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT
PostDown = iptables -t nat -D PREROUTING -i eth0 -p tcp -m multiport --dport 1234-j DNAT --to 192.168.4.2
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j SNAT --to-source z.z.z.z
AllowedIPs = 192.168.4.2/24
新平台
Address = 192.168.4.2/24
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 192.168.2.6:1234; iptables -t nat -A POSTROUTING -p tcp --dport 1234 -j MASQUERADE
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 192.168.2.6:1234; iptables -t nat -D POSTROUTING -p tcp --dport 1234 -j MASQUERADE
AllowedIPs = 0.0.0.0/0
也许有人知道我如何将原始 IP 从 VPS 转发到 NPM 再到本地机器?