我正在运行的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很简单 – 事实上已经做到了。
方法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/