OpenVPN tap 接口未通过隧道连接到服务器公网 IP

OpenVPN tap 接口未通过隧道连接到服务器公网 IP

我有一台服务器,其中 1 个接口桥接到tap0。另外,还有一台客户端,它有 2 个接口,有公共互联网连接(eth1eth2)和接口 2 的隧道,因此我可以通过 发送流量tap0,并且实际上会通过 发送数据eth2

如果我做

curl ifconfig.co

我获取了 的公共 IP eth1。如果我这样做

curl ifconfig.co --interface eth2

我获取了公共 IP eth2,如果我这样做

curl ifconfig.co --interface tap0

我获得了服务器的公共 IP(它通过了隧道,所以一切正常)。

tap0192.168.0.0/24子网中(其他的是192.168.1.0/24192.168.3.0/24,所以这里没有冲突),并且我可以正确连接到192.168.0.1192.168.0.22(这是服务器本地IP)等。

我已经在服务器路由器(192.168.0.1)中设置了我需要到机器的端口的重定向192.168.0.22(iperf3、80、OpenVPN 等)。

简而言之,我认为到目前为止一切都运行正常。

当我想连接到服务器公共 IP 时,问题就出现了。假设公共 IP 是1.2.3.4通过 VPN 连接的。如果我这样做

curl 1.2.3.4

我得到了我需要的所有信息,因为连接通过eth1服务器路由器,路由器将其重定向到服务器所在的本地机器。但如果我这样做

curl 1.2.3.4 --interface tap0

什么都没发生!

使用 tcpdump检查客户端tap0,我可以看到创建了一个请求 在此处输入图片描述
但是该请求从未到达tap0服务器(检查服务器上的 eth0 是否有传入的 OpenVPN UDP 数据包,当在客户端创建此数据包时没有新数据包到达tap0)。这是eth0从客户端连接到其他任何服务器时的情况: 在此处输入图片描述
这将成为解密的数据包tap0,并且不用说,tap0当没有 UDP 数据包出现时,也不会出现解密的数据包。

我不知道这里发生了什么。我以为所有经过tap0客户端的数据包都会无限制地发送到服务器,但事实似乎并非如此。

另外,如果我转到服务器机器192.168.0.22并对公共 IP 执行 curl,我会连接回 Web 服务器并且 curl 会收到结果,因此服务器在连接自身时不会出现问题。

图表 (不要杀我): 在此处输入图片描述

我该怎么做才能使与我的服务器公共 IP 的连接在发送时正常工作tap0

答案1

首先,您必须接受这一点:为了使 VPN 保持连接,从 VPN 客户端到 VPN 服务器的连接必须在 VPN 之外进行。

其次,您必须了解,这curl 1.2.3.4 --interface tap0不会改变客户端上的路由。它所做的只是控制数据包的源 IP。如果您连接到 VPN 服务器的外部 IP,它仍将直接出去,而不会神奇地被吸入隧道。

反正仔细查看你的路由表,告诉您数据包如何流动。

我该怎么做才能使通过 tap0 发送时与我的服务器公共 IP 的连接能够正常工作?

标准答案:不需要。使用拆分 DNS 或其他方式,这样当您的 VPN 启动时,您就可以使用内部地址。

复杂/黑客式的答案:如果您的所有客户端都是基于 Linux 的,那么您可以对策略路由和设置进行一些操作,以便 OpenVPN 流量仍然穿过公共网络,而非 OpenVPN 流量使用隧道。但设置起来几乎肯定会非常复杂,并且需要一些奇怪的脚本。我还没有这样做过,也不知道有任何教程。

答案2

明白了!我认为这更像是一种解决方法,而不是其他方法,但它的效果正如预期的那样。

只需创建一条iptables规则,如果源和目标对应于公共服务器 IP 和隧道 IP,则该规则将修改数据包的目的地:

iptables -t nat -A OUTPUT -s [client tap0 IP] -d [server public IP] -j DNAT --to-destination [server local IP]

大功告成!与 MP-TCP 配合使用效果极佳。

相关内容