简而言之:解决方案

简而言之:解决方案

我有一台运行 OpenVPN 客户端的 Raspberry Pi,它连接到 VPN 提供商和 Wireguard 服务器,因此我可以从外部连接到我的家庭 LAN。我想通过 wireguard 连接到我的家,并通过 Openvpn 连接发送所有流量。

这是我的 ifconfig 输出

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.5  netmask 255.255.255.0  broadcast 192.168.1.255

wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 172.1.1.1  netmask 255.255.255.0  destination 172.1.1.1

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.8.8.17  netmask 255.255.255.0  destination 10.8.8.17

eth0-是互联网网关(连接到我的家庭路由器)

当我在未运行 OpenVPN 客户端的情况下连接到 wireguard 服务器时,我可以访问我的内部 LAN (192.168.1.X),并且还可以通过 raspberry pi (eth0) 将我的请求转发到互联网。当我启用 OpenVPN 客户端 (tun0 up) 时,我无法访问内部 LAN,也无法访问互联网。

我想要做的是通过 wireguard 连接到我的家,并通过 openvpn 连接(tun0)传输所有流量。

这是我从“route -n”输出的:

在 OpenVPN 启动之前(wireguard 工作正常):

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    202    0        0 eth0
172.1.1.0       0.0.0.0         255.255.255.0   U     0      0        0 wg0
192.168.1.0     0.0.0.0         255.255.255.0   U     202    0        0 eth0

openVPN tun0 启动后(wireguard 连接未到达互联网和 LAN 客户端):

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.8.8.1        128.0.0.0       UG    0      0        0 tun0 
0.0.0.0         192.168.1.1     0.0.0.0         UG    202    0        0 eth0 
10.8.8.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0 
95.142.172.143  192.168.1.1     255.255.255.255 UGH   0      0        0 eth0 
128.0.0.0       10.8.8.1        128.0.0.0       UG    0      0        0 tun0 
172.1.1.0       0.0.0.0         255.255.255.0   U     0      0        0 wg0  
192.168.1.0     0.0.0.0         255.255.255.0   U     202    0        0 eth0 

我的防火墙规则:

-A FORWARD -i wg0 -j ACCEPT
-A POSTROUTING -o eth0 -j MASQUERADE

是否缺少任何防火墙规则或我必须添加任何路由才能使其正常工作?我应该怎么做?

谢谢!!

答案1

简而言之:解决方案

创建新的路由表:

ip route add default via 192.168.1.5 dev eth0 table 7
ip rule add fwmark 0x55 priority 1000 table 7
ip route flush cache

其中 192.168.1.5 是您的外部接口 (eth0) 的 IP。现在将其添加到您的 wg0.conf:

FwMark = 0x55

现在,即使 OpenVPN 隧道处于打开状态,您也可以通过 WireGuard 连接到您的家庭服务器。

更长的解释

当您启动 OpenVPN 隧道时,主路由表中会设置一条新路由。此路由可能如下所示:0.0.0.0/1 via 10.8.8.1 dev tun0表示您的所有互联网流量都应通过隧道发送出去。

这很好,但是每当你想通过不受保护的接口与路由机器通信时,你的机器的答案也会被发送到隧道中。这就是为什么你无法再通过 https 访问你的服务器,即使你已经将端口 443 转发给它。它的答案只会被发送到隧道中并丢失。

通过设置第二个路由表(可通过ip route show table 70x55 规则查看),我们基本上告诉您的机器通过正常的、不受保护的 eth0 接口路由每个标记的数据包。其余的数据包仍将发送到隧道中。

还能做什么?

OpenVPN 服务器

当我还没有听说过 WireGuard 时,我实际上找到了解决方案。当时我想通过 OpenVPN 连接到我的家庭网络,但当服务器的隧道打开时,我却无法做到这一点。但是,我自己的 OpenVPN 服务器正在监听端口 993,因此我将通过该端口的每个数据包标记为“0x55”:

sudo iptables -t mangle -A OUTPUT -p tcp -m multiport --sport 993 -j MARK --set-mark 0x55

这使得与我的 VPN 连接服务器建立 VPN 连接成为可能。

电子邮件端口不受保护

我的 VPN 提供商不允许通过其 VPN 发送邮件,因为存在垃圾邮件问题。此规则将路由到我的邮件帐户的连接,而不通过隧道:

iptables -t mangle -A PREROUTING -p tcp --dport 25 -j MARK --set-mark 0x55

无需 VPN 的 MAC 地址

您可能希望整个设备“不受保护”。如果您使用的是瑞典服务器,并且不想在平板电脑上看到瑞典 YouTube 广告,您可能需要执行以下操作:

iptables -t mangle -A PREROUTING -m mac --mac-source 4c:h7:9f:0l:17:k1 -j MARK --set-mark 0x55

当然,您必须使用平板电脑的 MAC 地址。

答案2

您说“我想通过 wireguard 连接到我的家,并通过 Openvpn 连接发送所有流量”,这没有意义。我将其解释为“我想通过 wireguard 连接到我的家,并通过 Openvpn 连接发送所有其他流量。”

启动 OpenVPN 服务器时,默认路由将从 192.168.1.1 更改为 10.8.8.1,该路由通过 tun0 进行路由。tun0 的对等地址似乎是 95.142.172.143,它定义了自己的 /32 路由,因此该地址的流量始终通过 eth0 直接发送到 Internet。该静态路由使隧道端点免受默认路由的影响,如果没有它,隧道将无法工作。

这表明您的 OpenVPN 客户端已配置为将所有流量路由到 OpenVPN 隧道的远端。这是典型的 OpenVPN 配置,当您不信任本地网络并希望所有流量都通过 OpenVPN 服务器安全加密和路由时,可以使用此配置。

一旦启动 OpenVPN 服务器,Wireguard 服务器的所有流量都会通过该默认路由通过 OpenVPN 隧道重新路由,并到达隧道另一端,然后可能会在那里被丢弃。

我猜你需要的是为你的 Wireguard 服务器指定一个静态路由,类似于 OpenVPN 为其服务器 (95.142.172.143) 添加 /32 路由的方式。例如,如果你的 Wireguard 服务器是 100.100.100.10,你将为该 IP 添加一个静态路由以通过 eth0。你将能够判断你是否做对了,因为它将类似于上面显示的 95.142.172.143 路由表中的输出。要在命令行上进行测试,请在启动 OpenVPN 服务器后尝试:

# route add -host IP-OF-REMOTE-WIREGUARD-SERVER gw DEFAULT-GATEWAY-IP

其中“DEFAULT-GATEWAY-IP”是您的 ISP 路由器的 IP 地址,从上面的示例来看,它类似于 192.168.1.1。然后,当您执行“netstat -rn”时,您应该会看到带有“UGH”标志的新路由,就像问题中“netstat”输出中的 95.142.172.143 路由一样。

总而言之,隧道应该通过原始互联网连接传输。您的设置有问题,因为它试图将 Wireguard 隧道塞进 OpenVPN 隧道内。

答案3

我有完全相同的设置(openVPN-Server<->openVPN-Client/Wireguard-Server(MiddleMan)<->Wireguard-Client),但只能解决一半。

当我在 MiddleMan WireGuard 配置中向 MiddleMan 添加以下 iptables 规则时:

PreUp = iptables -t nat -A POSTROUTING -s 10.200.200.0/24  -o tun0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.200.200.0/24  -o tun0 -j MASQUERADE

其中 10.200.200.0 是 wg0 网络,tun0 是 openvpn 接口,并将以下规则添加到 MiddleMan 上的 openVPN 配置中:

route-nopull
route 192.168.178.0 255.255.255.0

其中 192.168.178.0 是 openVPN 服务器的内部网络,我能够从 WireGuard 客户端(手机) ping 并访问 192.168.178.0 网络。

但我仍然不知道如何将互联网从 openVPN 服务器转发到 Wireguard 客户端。如果我将所有路由从 openVPN 服务器拉到 MiddleMan,MiddleMan 上的默认网关将被替换,WireGuard 客户端将无法再访问 MiddleMan。我只需要知道正确的路由,如何将互联网流量从 openVPN 服务器转发到 WireGuard 客户端,而无需替换 MiddleMan 上的默认网关。

相关内容