由于未设置网关,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:~#   

在我的系统日志中,我能够看到消息注意:无法重定向默认网关 - 无法从系统读取当前默认网关。经过一番搜索,我发现这是因为没有明确设置默认网关。我猜想远程 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还是traceroute中的第一跳?或者甚至是完全不同的东西?

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

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

答案1

从头开始并按顺序解决您的问题:

  1. 无法建立连接

    连接可以建立,我会获得 IP,但由于未设置默认网关,我无法通过 VPN 获得流量 [...]

    如果您无法 ping 通连接的远程端,那么您就会遇到比更改默认路由更重要的问题。在查看潜在的路由问题之前,请确保您可以 ping 通远程端。由于您甚至没有包含客户端配置文件的近似值,因此我无法为您提供具体的命令。

  2. 如何更改默认网关?

    不要自行更改默认网关。如果您想通过 VPN 连接路由所有流量,请使用redirect-gateway def1配置参数如 OpenVPN HOWTO 中所述。

  3. 如何在开机时启动VPN?

    这也是OpenVPN HOWTO 中有解释并涉及您创建适当的配置文件/etc/openvpn(并在 Debian 派生系统上进行编辑/etc/default/openvpn以激活自动启动)。

  4. 如何避免失去其他互联网连接

    最终连接到openVPN后,将默认网关更改为使用openVPN。然而,任何现有连接(例如我的 SSH 连接)都会被切断,并且无法再通过互联网访问该计算机。我可以阻止这种行为吗?

    如果您要通过 VPN 路由所有流量,则不能任意选择通过 Internet 路由其中一些流量。您可能需要重新考虑通过 VPN 路由“所有”流量的标准。例如,这可能是“仅 HTTP/HTTPS 流量”、“除 SSH 之外的所有流量”吗?

答案2

你的路线venet让我觉得你正在运行类似 OpenVZ 的东西?

如果是这样,您可能需要在虚拟机管理程序上加载 tun 模块,并允许您的来宾使用它。假设您使用 OpenVZ,这看起来像:

vz# modprobe tun && echo tun >>/etc/modules
vz# vzctl set $CTID --devnodes net/tun:rw --capability net_admin:on --save

相关内容