双链路网站智能分流
安信证券股份有限公司 武孟军
双链路接入出口路由问题
由于中国电信、中国网通两家国内大ISP运营商南北而治,从而引发了互联网特有的“互联互通”问题:电信互联网用户如果访问的服务器位于网通的网站,速度极慢,反之亦然。基于此,一些大的网站,通常在电信和网通分别放置服务器,达到提高访问速度的目的。对于一些大型企业,全国各地遍布分支机构,当通过互联网访问总部时,例如使用基于互联网的VPN连接总部,或通过Web方式访问企业内部OA服务器等,就会遇到同样的问题。
为此,大多数企业采用“双链路+单服务器”的方式来解决这一问题,即分别申请网通、电信两条互联网接入专线,内网中放置一台OA服务器,通过智能DNS解析(或直接使用不同公网IP),实现网通用户从网通专线访问,电信用户从电信专线访问。图1是一种典型的网络结构。
图1 双链路接入结构
这种解决方案,通过智能DNS解析(或直接使用不同公网IP)来保证网通用户从网通专线访问,电信用户从电信专线访问。但这只解决了一个方向——进入方向的数据路径问题。难点在于,要保证从OA服务器回去的数据包,能够选择正确的路径。
我们最常见的做法是:
收集网通(或电信)使用的互联网IP地址段,将可以聚合的分散网段聚合。
在图1中的路由器逐条配置静态路由。
这种方式存在的缺点是:
(1)收集的网段不完整,有遗漏;
(2)路由器上需要增加大量的静态路由;
(3)运营商有新增加的网段时,需要实时调整配置。
因此,这不是一个理想的解决方案。一些商业公司抓住这个商机,提供一种专用的硬件设备来解决这个问题,但价格不菲。
这里,我们假定图1中的路由器为Cisco路由器,通过使用策略路由或NAT技术,解决从OA返回外网数据的路径选择问题。
NAT和策略路由
NAT即地址翻译,一开始是为了解决IP地址短缺而提出来的,如今已经得到了广泛的应用。简单地说,NAT是针对某些符合条件的IP数据包,将目的或源IP地址替换为指定的IP地址。NAT是双向的,即来、去两个方向,某个方向发生了NAT动作,另一个方向回来的数据包会做逆向的NAT。例如多台主机共享一条ADSL访问互联网时,出去的数据包,内网地址(源地址)被翻译为一个公网IP;返回的数据包,再替换回原来的内网地址。
使用NAT需要定义两个接口:Inside和Outside。虽然不是必须,但通常内网口被定义为Inside,外网口被定义成Outside。
一定要弄清楚的是NAT操作和路由查找的顺序,对于Cisco路由器来说,当数据包从Inside进入时,首先查找路由表选路,然后根据选路的结果,决定是否需要NAT。当数据包从Outside进入时,则先做NAT操作,再根据替换的结果查找路由表,进行选路操作。
策略路由本质上是一种静态路由技术,不同的是,普通的静态路由是根据目的地址来确定数据包下一跳地址的,而使用策略路由,可以根据源地址(或其他特征)来确定数据包下一跳的地址。
策略路由功能强大,利用它可以实现许多特殊的功能,有兴趣的读者可以自己找资料了解一下。
为了叙述方便,下面,我们假定图1中的网络环境如表1所示。
表1 网络环境
一般情况下使用单服务器模式,为了安全起见,电信接口公网IP地址121.1.1.1和网通接口公网IP地址58.1.1.1,均被翻译为OA服务器内网地址192.168.1.10。实现公网、私网地址映射,路由器做如下配置:
int e0 ip nat inside ... int e1 ip nat outside ... int e2 ip nat outside ... ip nat static outside destnation 121.1.1.1192.168.1.10 ip nat static outside destnation 58.1.1.1192.168.1.10
策略路由
图1中,路由器按常规静态路由模式,通常是配置一条默认路由指向网通或电信出口,然后再增加另一个运营的明细路由。使用策略路由,可以根据数据包源地址决定下一跳的地址,即网通或电信的出口。
但是,由于只有一台服务器,返回的数据包源地址是相同的,因此,要先做处理,使得服务器返回给从网通或电信不同入口进来的数据包,源IP地址不同。
首先在OA服务器网卡上多绑定一个IP地址,比如192.168.1.11;然后在路由器上调整NAT配置,使得新增加的IP地址给网通用户使用。
ip nat static outside destnation 58.1.1.1192.168.1.11
这样,从网通和电信不同接口进来的数据包,访问的OA服务器IP地址不同,但仍然是同一台服务器。返回的数据包源地址也不相同。再使用策略路由,就可以很容易地将返回的数据流分开了。
假定已经配置了一条默认路由指向电信出口,则需要配置策略路由,使得从e0口到达的源地址为192.168.1.11的数据包,转发到网通出口。配置步骤如下:
1.建立Access List
access-list 11 permit 192.168.1.11
本条访问控制列表匹配所有内网服务器返回的应答从网通接口进入请求包的数据包。
2.配置route-map
route-map CNC permit 10 match ip address 11 set ip next-hop 58.1.1.14
匹配控制列表110的数据包,下一跳的地址为网通网关地址。
3.应用
Intface e0 ip policy route-map CNC
通过NAT聚合网段
策略路由实现的合理分流,是通过特殊的配置,使得返回给不同入口的数据包使用不同的源地址,再根据源地址选路。
前面已经提到,增加的明细路由由于太分散、量大且动态变化而不容易处理。每个遇到此类问题的人可能都在想,如果运营商使用的网段有规律,所有网段可以聚合成几个甚至一个网段,这样问题就简单多了。好了,现在我们就把这些分散的网段聚合成一个网段,当然,不是通过普通的路由聚合技术,而是NAT。
使用这种方式的前提是图1中的网通链路中串接一台实现NAT功能的设备。这里假定一台防火墙+路由器的模式,如图2 所示。当然,图中的防火墙也可以是一台路由器。
图2 调整网络结构
实现原理是,通过网通、电信入口进入的数据包都使用静态NAT将各自的公网地址(目的地址)转换为私网地址。同时,从网通(或电信)入口进入的数据包,使用动态NAT做源地址转换。所有的源地址,转换为某一私网网段地址,比如10.1.0.0。
通过这种方式,网通所有分散网段都将被翻译为一个特定的网段。这样,只需在防火墙上增加一条静态路由即可。
NAT路由器上的配置为:
int e0 ip nat inside ... int e1 ip nat outside ... ip nat static outside destnation 58.1.1.1192.168.1.10
上面的配置实现了把从网通访问的用户的目的地址翻译为内网的服务器地址。注意,路由器上一定要有到达地址192.168.1.10的路由。
在实现目的地址翻译的同时,将所有源地址翻译为某一私网网段,网段IP容量可以根据实际情况调整,配置示例中翻译为10.1.0.0。
1.建立Access List
access-list 11 permit any
本条访问控制列表匹配所有从网通接口进入数据包的源地址,即所有数据包源地址均做转换。
2.定义NAT Pool
ip nat pool CNC 10.1.0.1 10.1.254.254 netmask 255.255.0.0
转换源地址使用的地址池。
3.配置NAT
ip nat outside source list 11 pool CNC
这样所有从网通进入内网的数据包,源地址均被转换在10.1.0.1~10.1.254.254的范围内。下面的工作,只需要在防火墙上增加一条网段10.1.0.0的静态路由就可以了。