前言
阅读本文,建议你有相关Linux/Windows或CCNA的网络基础,本文着重讲解路由技术,会涵盖Linux的iptable/route命令和Windows的route命令。
本教程的内容是在OpenVPN软件不是本地网络的默认网关(即,将OpenVPN安装在某些计算机/服务器而不是路由器上)时,提供有关访问OpenVPN的LAN资源的一些提示。
ss8.png
每台计算机将数据包发送到某个地址时都需要知道将数据发送到哪里。在现代系统中,这是通过具有路由表来完成的,其中每行都指示将特定数据包发送到的位置。路由线路包括目标网络,用于分隔网络位的网络掩码,网关(即将处理数据包的远程ip)以及将通过其发送数据包的接口名称(或IP)。路由表中有默认路由,该路由指示将目的地为自身接口,环回目的地,本地lan计算机的数据包发送到何处,以及不符合其他条件的默认路由。默认路由定义为零,即网络0.0.0.0和网络掩码0.0.0.0,并且作为网关IP,它具有某些本地路由器的IP或ISP的网关的IP。该规则被命名为常规或默认路由。如果计算机需要发送未由更特定的规则指定的数据包,则将其发送到默认规则中指定的默认GW。
通常,当新的OpenVPN用户开始加入远程站点时,它们会成功安装OpenVPN并配置防火墙和iptable规则,但在访问远程资源时仍然存在问题。
假设我们在局域网中的其他计算机上设置了OpenVPN。 如上图中的公司局域网的主机192.168.50.10不知道VPN网关的IP 10.8.0.1和远程站点A的LAN的IP 10.8.0.2,即主机中的路由表中没有他们的任何条目,路由表将指定将这些网络的数据包发送到何处呢?如下图所示为192.168.50.10主机的路由表
没错,主机192.168.50.10会将他认为不知道的任何目标网络的数据包发送到LAN的默认网关192.168.50.254,但该192.168.50.254的网关(在网络中默认情况下)将丢弃这些数据包,因为网关也不知道如何处理此类目标数据包。 这是写本文的提出的问题,在本教程中,我们将使用这种配置:
站点A
网络: 10.8.0.0/24
vpn网关: 10.8.0.1
运行OpenVPN的主机的IP 10.8.0.2由vpn网关的dhcp分配
站点B
网络:192.168.50.0/24。
默认网关的IP:192.168.50.254(站点B中所有主机默认网关)
备份网关的IP:192.168.50.253 (是一台运行iptable+openvpn的防火墙,也充当vpn网关的职能)
VPN IP来自10.8.0.0/255.255.255.0,这是openvpn默认配置的。
在讨论这个问题时,哪个站点是服务器或客户端以及哪些IP获取TAP接口并不重要。 要解决此路由问题,有四种方法:
方案1:默认网关搭载OpenVPN服务
很明显,将OpenVPN软件移至局域网的默认网关。 由于在某些情况下这是不可能的(无法运行OpenVPN的简单路由器),因此方法是将来扩展的最佳方法,因为添加更多远程站点不会涉及路由问题。
方案2:为远程站点的内网主机添加路由条目
将远程网络的站点B的静态路由添加到站点A中被访问主机的路由表。在每台主机上,我们必须添加如下路由:
Windows的路由配置
如果你站点A中存在Windows的主机
route add <remote_network> mask <remote_netmask> <getway_ip> \
metric <metric_numeric> if <interface_numeric>
例如,我们在站点A的主机192.168.50.10,添加相关的openvpn网段路由,不过再次之前,你需要知道该路由条目使用主机接入局域网用到哪一个网卡接口,
首先,我们可以使用ipconfig命令查看网卡的名称,我这里是“本地连接5”
然后,我们需要查找对应的网卡接口的号码,这里需要用到netsh interface ipv4 show interface这条命令
ss8.png
这里,我们知道接口号是18,这个号码是主机的路由条目需要用到的,那么我们可以配置192.168.50.10主机的通向站点B网络10.8.0.0/24
route add 10.8.0.0 mask 255.255.255.0 192.168.50.253 metric 1 if 18
现在可以通过route print命令来查看192.168.50.10主机的路由表
我们可以使用执行路由跟踪看看我们的路由配置是否正确
但这种方法唯一的缺点,该主机重启后刚才配置的路由条目会消息,因为它不是一条静态路由,配置静态路由很简单,就是在刚才的路由条目的配置指令后添加命令参数"-p"即可,再次查看路由表,你会发现底部多了一条静态路由
Linux路由配置
如果是站点B的存在Linux主机,使用如下格式
route add -net <remote_network/remote_mask> gw <openvpn_host_ip>
例如,在站点A的Linux主机,我们可以添加
sudo route add -net 10.8.0.0/24 gw 192.168.50.253
在Linux中我们可以通过route -n指令可以产看Linux主机下的路由表,值得一说的是,Linux的路由配置一向都是利索干净,没像Windows那样那么多余动作。
我们知道Linux路由表当中多了一条通向10.8.0.0的路由,意思就是告知Linux内核,所有IP数据包的目标地址符合网络号10.8.0.0/24的丢到网关192.168.50.253,而数据出口就是eno1,离开了主机的数据包,再由网关192.168.50.253,根据它的路由表再次转发到站点A的主机10.8.0.2,Window主机的路由配置同理。如下图所示
方法3:在默认网关上配置路由重定向
此方法意味着仅在LAN的默认网关上添加与方法2中相同的路由。 因此重定向将由路由器负责,我们不需要在每台主机上添加路由。
为什么我这里没有这VPN服务集成到默认网关呢?事实上,Juniper也能够配置vpn啊,但我们想将多种关联的服务集成一台设备,例如邮件过滤/代理转发/SSH穿透等集成在一台Linux防火墙上,我的管理理念就是相关的应用服务都集中在一台服务器上,这样便于集中管理。而独立硬件防火墙就让他负责网络安全防御和简单的路由交换。
OK,Juniper的路由条目配置,其实也是一目了然的,见下图,记得选择trust-vr到trust-vr,然后选择New,这样就告诉Juniper防火墙,这个目标路由仅仅是内网的重定向,也就是从192.168.50.254到192.168.50.253网关的流量重定向
然后按照如下图填写站点A的10.8.0.0/24的网络和下一跳网关192.168.50.253
我们查看一下Juniper的路由表,OK没问题
我们删除上面配置过的站点A主机192.168.50.10的路由条目,很简单,使用route delete 10.8.0.0命令即可,此时我们再次路由跟踪查看默认网关的路由重定向是否生效?
结果,发现一切都是正常的,下图就是从站点B的主机到站点A主机的路由重定向的数据包流向。
ss8.png
上图的配置,我们通过方案1到方案3解析了路由交换的技术细节,我们解决了访问站点B内主机资源访问的问题。但对于大部分外资企业而言,相信大部分老外高管需要用到他们自己app 无法正常使用的,而刚好的你的公司又能提供访问国际专线的便利,那么那些长期在国内异地出差的人员就能通过你搭建的vpn服务能够很好地与国外的分支机构互通了。
ss8.png
但事实上,默认状态下,OpenVPN服务端提给新接入的OpenVPN用户提供的默认路由还是OpenVPN服务端所在线路上的默认路由,如上图,vpn客户端仍然只能访问的是国内的线路,而不是走国际专线的默认网关的线路
那么负责IT应用架构的你需要做的是在vpn网关设定一条路由,告知192.168.50.253的网关,只要符合源网路是10.8.0.0/24,目标地址是任何公网的网站的数据包就转发给默认网关192.168.50.254,这对于站点A的用户来说也是路由重定向,而这次路由重定向的配置会比Juniper的路由重定向稍微复杂一些。下图就是我们要得到的路由效果
ss8.png
方案4:VPN网关的路由重定向
Ok我们来看看vpn客户端主机10.8.0.2接入远程站点B后的路由表,首先读者思考一个问题,你认为在10.8.0.2的主机添加路由重定向还是在vpn网关做路由重定向呢?如果你还没有清晰的概念,请自行搞清楚网络的路由与交换原理,可以找找CCNA学习指南之类的教程来看看。
ss8.png
更新待续....
网友评论