使用拆分openvpnnetworking,无法通过VPN连接到远程服务器

我正在运行的Ubuntu 12.04,只需要vpn可以绑定到vpn端口(地址)的特定应用程序。 如果我连接到所有通过VPN端口路由的VPN一切工作正常(作为第二条路线显示)。 如果选中“只在networking上使用这个连接”,那么这个路由看起来就像我所期望的那样,其他程序可以到达互联网,但是我不能连接到绑定到vpn端口的远程服务器,比如“ telnet google.com 80 -b 10.187.1.9“看来我可以把数据包拿出来,但是也许不在。任何人都知道路由有什么问题?

使用“只为其networking上的资源使用此连接”集:(无法仅使用tun0(10.187.1.9)连接到远程服务器

0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth2 10.187.1.1 10.187.1.9 255.255.255.255 UGH 0 0 0 tun0 10.187.1.9 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 130.185.155.58 192.168.1.1 255.255.255.255 UGH 0 0 0 eth2 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth2 192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2 192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 

默认选项:(我可以使用tun0连接到远程服务器,但所有通信都通过tun0路由)

 0.0.0.0 10.187.1.9 0.0.0.0 UG 0 0 0 tun0 10.187.1.1 10.187.1.9 255.255.255.255 UGH 0 0 0 tun0 10.187.1.9 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth2 185.3.135.58 192.168.1.1 255.255.255.255 UGH 0 0 0 eth2 192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2 192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 

OpenVPN使用一个entre子网来容纳服务器端的虚拟接口以及连接的客户端。 在你的情况下,这个子网似乎被configuration为10.187.1.0/24。 OpenVPN为服务器端分配了10.187.1.1,并且将每个客户端连接的子网的其余部分分成更小的子网。 默认情况下,出于兼容性的原因,它将使用/ 30与2个可用地址,一个networking地址和一个广播地址,并将第一个可用地址分配给服务器,第二个分配给连接客户端。 在你的例子中,这将是10.187.1.9(服务器),大概是10.187.1.10(客户端)。

所以,你的第一个问题是运行telnet google.com 80 -b 10.187.1.9 – 你正在指示telnet绑定到非本地地址,这是行不通的。 第二个问题是Linux 通过默认评估目标地址来做路由决策。 由于google.com正在解决一些不属于本地networking的问题,也没有被其他路由所覆盖,所以数据包将通过默认路由进行中继,在您的情况下,该路由将为192.168.1.1,并且可能对10.187.1.0/ 24子网,所以它有效地丢弃了数据包。 如果你需要这个stream量来通过tun0路由,你应该明确告诉Linux:

 echo "200 vpn" >> /etc/iproute2/rt_tables ip rule add from 10.187.1.0/24 table vpn ip route add table vpn default dev tun0 

这将创build一个名为vpn的附加路由表注册,如果数据包来自10.187.1.0/24子网,则添加一个使用此路由表的规则,并通过tun0添加一条默认路由(这是一个点到点接口,因此路由规范不需要网关地址)通过vpn表路由的所有stream量。

我不认为-b选项会执行您认为的操作。

如果你做了一个tcpdump你会看到telnet连接将会从默认网关中出来,但是源IP地址是10.187.1.9。 问题变成即使你的源IP地址已经改变 – 你的路由都是基于目的地的; 您将始终在当前configuration中使用默认网关。

所以要解决这个问题有两个解决scheme。

  1. 使用您的VPN所有连接 – 即使您的VPN您的默认网关。
  2. 实施源路由 – 或策略路由。 这将根据您的数据包的源IP地址创build一个路由。

方法1很简单 – 事实上已经做到了。

方法2,这样做的基本方法如下所示:

 ip rule add from <source>/<mask> table <name> ip route add default via <VPN GW> dev tun0 table <name> 

要么

 ip route add default dev tun0 table <name> 

其中<name>将在/etc/iproute2/rt_tables (您可以创build一个名称),或者您可以使用一个数字。

资料来源:

http://www.saeedpazoki.com/how-to-implement-source-routing-with-linux/

https://superuser.com/a/377039/161569