我有一台运行 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 7
0x55 规则查看),我们基本上告诉您的机器通过正常的、不受保护的 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 上的默认网关。