OpenVPN 无法工作,因为未设置网关

OpenVPN 无法工作,因为未设置网关

在 Debian 机器上,我在连接 openVPN 服务器时遇到了问题。

连接可以建立,只是增加了一个接口,并为其分配了一个 10.130.xx IP,但我无法通过 VPN 获得任何流量。所有流量仍将通过我原来的公共 IP 地址:

root@vps2:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
92.222.32.0 0.0.0.0 255.255.255.0 U 0 0 0 venet0
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0
root@vps2:~# wget --no-dns-cache --no-proxy --header="Host: ipecho.net" http://146.255.36.1/plain -q -O - 2>&1;echo
92.222.32.42
root@vps2:~# service openvpn start
[ ok ] Starting virtual private network daemon: myvpn.
root@vps2:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.130.3.137 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
92.222.32.0 0.0.0.0 255.255.255.0 U 0 0 0 venet0
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0
root@vps2:~# wget --no-dns-cache --no-proxy --header="Host: ipecho.net" http://146.255.36.1/plain -q -O - 2>&1;echo
92.222.32.42
root@vps2:~#

在我的系统日志中,我可以看到消息NOTE: unable to redirect default gateway -- Cannot read current default gateway from system。经过一番搜索,我发现这是因为未明确设置默认网关。我猜远程 VPN 正在使用某种客户端脚本,而这些脚本并不只是期望找到明确设置的默认网关。

我尝试了两种方法来明确设置我的默认网关。都有效

  • 首先,我尝试将原来的公共 IP 地址设置为默认网关,此操作成功:

    route add default gw 92.222.32.42
    root@vps2:~# route add default gw 92.222.32.42
    root@vps2:~# route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    92.222.32.0 0.0.0.0 255.255.255.0 U 0 0 0 venet0
    0.0.0.0 92.222.32.42 0.0.0.0 UG 0 0 0 venet0
    0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0
    root@vps2:~# service openvpn start
    [ ok ] Starting virtual private network daemon: myvpn.
    root@vps2:~# wget --no-dns-cache --no-proxy --header="Host: ipecho.net" http://146.255.36.1/plain -q -O - 2>&1;echo
    217.23.15.239
    root@vps2:~#

  • 但为什么要使用我原来的公共 IP 作为默认网关呢?我不知道。所以我也尝试将随机跟踪路由的第一个跳设置为默认网关。这也有效:

    root@vps2:~# traceroute foo.com
    traceroute to foo.com (121.232.122.233), 30 hops max, 60 byte packets
    1 49.ip-92-222-50.eu (92.222.50.49) 0.039 ms 0.011 ms 0.012 ms
    2 [......... I stop the traceroute when I see the first hop]
    ^C
    root@vps2:~# route add default gw 92.222.50.49 root@vps2:~# route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    92.222.32.0 0.0.0.0 255.255.255.0 U 0 0 0 venet0
    0.0.0.0 92.222.50.49 0.0.0.0 UG 0 0 0 venet0
    0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0
    root@vps2:~# service openvpn start
    [ ok ] Starting virtual private network daemon: myvpn.
    root@vps2:~# wget --no-dns-cache --no-proxy --header="Host: ipecho.net" http://146.255.36.1/plain -q -O - 2>&1;echo
    217.23.15.239
    root@vps2:~#

好极了!我靠自己走到了这一步。

现在,连接到 VPN 后,路由会自动更改。这很好,但现在我失去了通过原始公共 IP 地址的所有连接,并且我的 SSH 连接被断开,我的 Web 服务器不再可访问,甚至我提供的其他服务也无法访问。我猜这是因为现在所有传入连接的响应都通过 VPN 路由。我更希望看到所有通过原始公共 IP 传入的连接都从同一 IP 获得响应。并且 VPN 仅用于我的服务器向外界发起的连接。我还没有弄清楚这部分。

连接到 VPN 后,我的路由如下所示:

root@vps2:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.130.0.1 10.130.3.73 255.255.255.255 UGH 0 0 0 tun0
10.130.3.73 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
217.23.15.239 92.222.32.42 255.255.255.255 UGH 0 0 0 venet0
92.222.32.0 0.0.0.0 255.255.255.0 U 0 0 0 venet0
0.0.0.0 10.130.3.73 128.0.0.0 UG 0 0 0 tun0
128.0.0.0 10.130.3.73 128.0.0.0 UG 0 0 0 tun0
0.0.0.0 92.222.32.42 0.0.0.0 UG 0 0 0 venet0
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0
root@vps2:~#

我的问题是:

  • 既然两种方法都有效,我应该使用什么作为默认网关?我的原始公共 IP 还是跟踪路由中的第一个跳转?或者甚至是完全不同的东西?

  • 我如何才能自动执行此操作,以便在启动时自动设置网关?我的意思是,服务器在启动时检查是否设置了默认网关,如果没有,它将把我的公共 IP 或跟踪路由的第一跳设置为默认网关...

  • 最终连接到 openVPN 后,如何防止通过原始公共 IP 地址丢失连接,但仍让所有传出连接使用 VPN?

相关内容