使用拆分 openvpn 网络,无法通过 vpn 连接到远程服务器

使用拆分 openvpn 网络,无法通过 vpn 连接到远程服务器

我正在运行 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 地址已更改 - 您的路由都是基于目的地的;在当前配置中,您将始终通过默认网关。

因此,要解决这个问题,有两个解决方案。

  1. 使用您的 VPN 进行所有连接 - 即将您的 VPN 设为您的默认网关。
  2. 实施源路由 - 或策略路由。这将根据数据包的源 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/

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

相关内容