我正在运行 ubuntu 12.04,并且只希望将 VPN 用于可以绑定到 VPN 端口(地址)的特定应用程序。如果我连接到 VPN,并且所有流量都通过 VPN 端口路由,则一切都会正常工作(如下面第二条路由所示)。如果我选中选项“仅将此连接用于其网络上的资源”,则路由看起来与我预期的一样,其他程序可以访问互联网,但我无法连接到绑定到 VPN 端口的远程服务器,例如“telnet google.com 80 -b 10.187.1.9”。似乎我可以发出数据包,但可能无法接收。有人知道路由出了什么问题吗?
设置“仅将此连接用于其网络上的资源”:(无法仅使用 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
答案1
OpenVPN 使用整个子网来容纳服务器端的虚拟接口以及连接客户端。在您的例子中,该子网似乎配置为 10.187.1.0/24。OpenVPN 为服务器端分配 10.187.1.1,并将子网的其余部分拆分为较小的子网,供每个客户端连接使用。默认情况下,出于兼容性原因,它将使用 /30 和 2 个可用地址、一个网络地址和一个广播地址,并将第一个可用地址分配给服务器,第二个分配给连接客户端。在您的示例中,这将是 10.187.1.9(服务器),大概是 10.187.1.10(客户端)。
因此,您的第一个问题是运行telnet google.com 80 -b 10.187.1.9
- 您指示telnet
绑定到非本地地址,这不起作用。第二个问题是 Linux 通过评估仅限目标地址默认情况下。由于google.com
解析到不属于您网络本地且未被任何其他路由覆盖的地址,因此数据包通过默认路由中继,在您的情况下该路由为 192.168.1.1,并且可能对 10.187.1.0/24 子网一无所知,因此它实际上会丢弃数据包。如果您需要此流量通过路由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
这将创建一个名为的附加路由表注册vpn
,添加一条规则,如果数据包来自 10.187.1.0/24 子网,则使用此路由表,并通过 tun0(这是一个点对点接口,因此路由规范不需要网关地址)为通过该表路由的所有流量添加默认路由vpn
。
答案2
我认为该-b
选项并不像您所想的那样有效。
如果您执行此操作,tcpdump
您将看到telnet
连接将通过默认网关,但源 IP 地址为 10.187.1.9。问题是,即使您的源 IP 地址已更改 - 您的路由都是基于目的地的;在当前配置中,您将始终通过默认网关。
因此,要解决这个问题,有两个解决方案。
- 使用您的 VPN 进行所有连接 - 即将您的 VPN 设为您的默认网关。
- 实施源路由 - 或策略路由。这将根据数据包的源 IP 地址创建路由。
方法 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
(您可以创建一个名称)或者您可以使用一个数字。
资料来源:
http://www.saeedpazoki.com/how-to-implement-source-routing-with-linux/