在 Raspberry Pi 上安装时,pivpn
它将创建一条 iptables 规则:
pi@RPi64:~ $ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.122.242.0/24 anywhere /* wireguard-nat-rule */
我认为它是通过以下方式插入规则来实现的iptables-persistant
:
pi@RPi64:~ $ cat /etc/iptables/rules.v4
# Generated by iptables-save v1.8.7 on Fri Aug 12 08:07:21 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.122.242.0/24 -o eth0 -m comment --comment wireguard-nat-rule -j MASQUERADE
COMMIT
# Completed on Fri Aug 12 08:07:21 2022
当然,这是在服务器端。如果我想从客户端完全连接到该服务器,我需要通过在客户端上插入类似的规则来在客户端上添加伪装:
pi@schwarz:~ $ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
我这样做:
pi@schwarz:~ $ sudo cat /etc/wireguard/schwarz.conf
[Interface]
PrivateKey =
Address = 10.122.242.4/24
PostUp = iptables -t nat -A POSTROUTING -o schwarz -j MASQUERADE
PreDown = iptables -t nat -D POSTROUTING -o schwarz -j MASQUERADE
DNS = 9.9.9.9, 149.112.112.112
[Peer]
...
然后,我在两个路由器上添加静态路由,以便将到相应 LAN 的流量从这些 LAN 中的其他客户端路由到 wireguard 服务器或客户端。
这样我就可以从两个 LAN 中的任何客户端完全连接到两个 LAN 中的所有设备。
这种方法的问题是,客户端会丢失其原始 LAN 中的原始 IP,而是会使用 Wireguard 客户端的 IP(加上端口)出现在其他网络中。这当然是由于NATing(伪装)造成的。
这样一切工作都很好。
除了一项服务:Logitechmediaserver。该服务器无法处理来自远程 LAN 的所有客户端,因为它们现在具有相同的 IP。更具体地说,问题只是部分罗技客户端(Radio)。客户端在服务器上连接正常,但看不到服务器响应。其他客户端(Boom)连接良好。他们使用不同的协议。
这让我想知道为什么pivpn
还要伪装 IP。难道仅仅拥有从 LAN 到客户端/服务器以及在这些客户端/服务器上到它们创建的隧道的静态路由还不够吗?
为何要伪装?是否针对 Wireguard 服务器同时充当 Internet 的 ISP 路由器的情况进行了此操作?这里的情况并非如此。路由器始终位于不同的机器上。
长话短说,我想知道是否一般可以删除pivpn
.另外,也许有人可以指出我的设置中存在的错误。
答案1
伪装通常用于从第二个网络访问一个网络,其中第一个网络未设置为将回复路由回第二个网络。您对从网关到第一个网络的数据包进行伪装(重写数据包的源地址以使用网关的地址),以便该网络上的其他主机将回复到网关(这会将回复数据包的目的地转换回到原始源地址)。
如果您连接两个 LAN,并且每个 LAN 都设置为通过其自己的 WireGuard 网关(经典的站点到站点 WireGuard 配置)路由到另一个 LAN,则无需伪装。
如果您将 LAN(或 WireGuard 网络)连接到 Internet(即路由至互联网,不仅仅是隧道通过互联网)。
对于站点到站点连接,如果每个 LAN 上的 LAN 路由器也是 WireGuard 网关,则通常不会使用伪装;通常,您只需在每个 LAN 路由器上设置 WireGuard 接口,并AllowedIPs
提供到另一个 LAN 的路由(和适当的设置),并向路由器添加防火墙规则,以允许从一个站点到另一个站点的适当访问。
在您的情况下,听起来您在每个站点都有一个与 LAN 路由器不同的网关(您的 Pi),您可以通过以下方式消除伪装的需要 1) 将到其他站点的路由添加到每个 LAN 路由器(或或者需要访问其他站点的每个单独设备),以及 2) 将其他站点的 LAN 网络添加到AllowedIPs
WireGuard 网关上的设置。
听起来您可能已经这样做了;但举一个具体的例子,如果您连接两个 LAN,10.100.100.0/24 和 10.200.200.0/24,并且 LAN 1 中的 WireGuard 网关是 10.100.100.123,LAN 2 中的 WireGuard 网关是 10.200.200.234,则您将添加一条到 LAN 1 中的 LAN 路由器(或单个设备)的路由,如下所示(使用路由器或设备的相应 LAN 连接接口,例如 eth1):
10.200.200.0/24 via 10.100.100.123 dev eth1
以及 LAN 2 中 LAN 路由器(或单个设备)的相应路由,如下所示:
10.100.100.0/24 via 10.200.200.234 dev eth1
在 LAN 1 的 WireGuard 配置中,您可以将其他站点的网络包含在AllowedIPs
其他站点的设置中:
[Interface]
Address = 10.122.242.1/24
...
[Peer]
AllowedIPs = 10.122.242.2, 10.200.200.0/24
...
相应地,在 LAN 2 的 WireGuard 配置中,您可以将 LAN 1 的网络包含在AllowedIPs
LAN 1 的设置中:
[Interface]
Address = 10.122.242.2/24
...
[Peer]
AllowedIPs = 10.122.242.1, 10.100.100.0/24
...
完成该配置后,您可以安全地从 WireGuard 网关中删除伪装规则,并且可以将流量从一个站点路由到另一个站点并返回,而无需任何 NAT。
但是,如果您仍然想使用其中一个 WireGuard 网关作为 Internet 网关,则可以保留伪装规则,但只需为发往网关自己的 LAN 的数据包制定一个例外即可;例如,在 LAN 2 的 WireGuard 网关上如下所示:
iptables -t nat -A POSTROUTING ! -d 10.200.200.0/24 -o eth0 -J MASQUERADE
关于您发布的 WireGuard 配置的一个无关紧要的小问题:您几乎不想将该DNS
设置包含在站点到站点配置中。您通常只使用DNS
点到站点配置的“点”端的设置,以便在端点的 WireGuard 接口启动时和关闭时使用不同的 DNS 解析器。