OpenVPN 客户端中断对 Web 服务器的远程访问

OpenVPN 客户端中断对 Web 服务器的远程访问

我遇到一个问题,每当我使用 OpenVPN 客户端连接到远程服务器(显然)设置 VPN 隧道时,我都无法再看到我的 nginx 服务器。我可以连接到本地网络,但似乎它正在放弃对 nginx Web 服务器的任何远程访问。VPN 隧道运行正常。只要 OpenVPN 客户端未运行,nginx 就可以正常工作,但如果我设置 VPN 会话,它会立即停止。这可以通过 iptables 或路由设置来解决吗?系统是 x86_64 Fedora 19;eth0 是网卡,tun0 是 vpn 接口。提前致谢!

答案1

经过大量的谷歌搜索和尝试后,这对我有用:

编辑您的 ovpn 文件。例如:my.ovpn,您使用的 ovpn 文件如下:openvpn --config my.ovpn

在输入任何证书内容之前:

route-nopull
route 0.0.0.0 128.0.0.0

这会导致传出连接通过 VPN,而入站连接使用默认值。

我花了很长时间才弄清楚这两行。

答案2

OpenVPN 服务器可能会将该push "redirect-gateway <if_name>"选项发送给您的客户端。

在这种情况下,客户端的默认网关指向 VPN 隧道。如果 VPN 服务器端的网络未配置为将 VPN 客户端的流量通过 NAT 转发回互联网,那么客户端能够访问的唯一主机就是那些可在 VPN 服务器网络上直接访问的主机。

答案3

这是一个很老的问题了,但是类似的问题尽管我在网上搜索,却没有得到很好的解决办法。

提问者提出的问题是,当OpenVPN客户端启动后,运行在OpenVPN客户端上的Nginx将无法从外部访问。造成这种现象的原因是Nginx的响应数据包被发往OpenVPN隧道(通常是tun0接口),因此无法从eth0接口被Web客户端接收。其实从IP路由的角度来说,假如我的服务器是A,Web服务请求者IP是B,那么B也可能是A试图访问的外部目标服务提供者。对于传输层路由来说,A对B的Web服务响应和A主动向B发送的请求是无法区分的。从这个角度来看,想要实现入站和出站流量的单独路由似乎是不可能的。

但其实我们有一个突破点:Web服务总是使用本地机器上的固定端口(通常是80和443)与请求者进行通信,因此我们可以通过端口区分入站和出站流量。

首先,我们运行以下命令:

iptables -t mangle -A OUTPUT -p tcp -m multiport --sports 80,443 -j MARK --set-mark 1

在这个命令中,我们将指示路由表观察从本地端口 80 和 443 发送的数据包,并为这些数据包赋予特定的标签 (--set-mark 1)。然后我们运行以下命令:

ip route add default via [gateway addr of eth0] dev eth0 table 100

此命令将创建一个名为“表 100”的新路由表,然后向此表添加默认路由,通过 eth0 接口将流量引导至原始网关。然后我们运行

ip rule add fwmark 1 table 100

该命令将使用“table 100”路由表路由带有标签1的数据包。运行上述配置后,Web服务即可正常访问。

相关内容