在 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
从头开始并按顺序解决您的问题:
无法建立连接
连接可以建立,我会获得 IP,但由于未设置默认网关,我无法通过 VPN 获得流量 [...]
如果您无法 ping 通连接的远程端,那么您就会遇到比更改默认路由更重要的问题。在查看潜在的路由问题之前,请确保您可以 ping 通远程端。由于您甚至没有包含客户端配置文件的近似值,因此我无法为您提供具体的命令。
如何更改默认网关?
不要自行更改默认网关。如果您想通过 VPN 连接路由所有流量,请使用
redirect-gateway def1
配置参数如 OpenVPN HOWTO 中所述。如何在开机时启动VPN?
这也是OpenVPN HOWTO 中有解释并涉及您创建适当的配置文件
/etc/openvpn
(并在 Debian 派生系统上进行编辑/etc/default/openvpn
以激活自动启动)。如何避免失去其他互联网连接
最终连接到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