利用SLB实现VPN下的NAT-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

利用SLB实现VPN下的NAT

aoboseo 2013-12-26 17:18:05 13494

许多网络管理员试图在VPN中使用不可路由的专用网IP通信时,经常发现使用NAT的VPN连接总是失败的。这是因为NAT改变了一个包的第三层网络地址(当然也改变了相应的checksum值),而像IPSec或L2TP之类的隧道技术是将专用网的第三层网络地址用公网的第三层网络地址封装加密,在另一端除去封装和加密,这样NAT就会破坏隧道的通信。
两种NAT实现方法
虽然在VPN环境下使用NAT很困难,但有大量应用的确需要在VPN系统中使用NAT,现有两种方法供广大网络管理员参考。一是在路由器之外引入专用的NAT设备,如防火墙。由于是在路由器之外进行NAT转换,因而避免了上述的NAT/VPN难题。另一种方法则是采用Cisco的SLB技术。Server Load Balancing (SLB)是Cisco公司基于Cisco IOS的提供服务器负载均衡的解决方案,该方案允许管理员定义一个虚拟服务器来代表一组真实服务器。当一个客户端发起一个与虚拟服务器的连接时,IOS的SLB会根据配置的算法连接到某个真实服务器上去,从而实现负载均衡,当然也就实现了NAT。由于SLB是网络设备本身的功能,与具体接口无关,故在VPN环境下使用SLB没有问题。不过目前SLB技术只能用于Cisco 6000系列交换机和Cisco 7000系列路由器。
具体实现
在实现中,我们把SLB方案作为防火墙方案的替代方案,即当系统中除去防火墙时(如因故障等原因),通过在中心系统设定使用SLB方案,而使客户端不需要进行任何改动。这种替代方案对网络系统的设计提出了更高的要求。
1. 采用防火墙实现NAT
本系统使用VPDN建立企业专用网,Cisco 7120作为VPDN的LNS,系统采用若干个服务器处理远程客户端请求。为了在网络上隐藏内部地址,该系统采用了一个Netscreen硬件防火墙用于实现NAT和负载均衡,系统如图1所示(图中地址仅供参考,非系统真实地址)。
远程客户端采用虚拟地址192.168.1.10与中心系统的服务器发起TCP连接。该连接需经过防火墙,防火墙根据预设的负载均衡算法将虚拟地址变换为某个服务器的真实地址,从而实现了NAT以及负载均衡。
防火墙的设置步骤如下:
使用浏览器,用管理员口令进入防火墙管理界面,先在Interface菜单中设定Trusted和Untrusted接口的IP地址。在Service菜单中定义服务器提供的服务,系统服务器在8000端口提供自定义TCP服务,故应在Service/Custom栏中增加一个service SVC8000,Dst Port 选择为8000,Transport为TCP。为了限制客户端的源地址,在Address/Untrusted菜单中增加名为SRC172的172.16.0.0/24地址段。在Virtual IP菜单设置Virtual IP1,将Server Virtual IP 设为192.168.1.10,注意Virtual IP必须和Untrusted端口位于同一网段,Service选择为SVC8000,Virtual Port为8000,在Server Pool中将10.1.1.1等几个真实服务器地址加入,Load Balance算法可选择Least Conns,并可根据各服务器的处理能力选择各服务器的权重值。在Policy菜单中设置服务SVC8000的访问策略,在Policy/Incoming建立一个新策略,设Service为SVC8000,Destination为VIP(192.168.1.10), 设Source为SRC172用以限制客户端的地址。
设置完成后,客户端即可先拨号建立客户端与路由器的连接。然后使用192.168.1.10:8000与中心建立TCP Socket连接,经过防火墙负载均衡,即可与某一个服务器建立连接。
2. 采用SLB实现NAT
在上述方案中,如果除去防火墙,由于远端客户数量众多,而且也不方便做任何参数修改,就需要由路由器来实现NAT和负载均衡。由于在前文中所述原因,路由器无法实现VPN下的NAT。本文系统使用的是Cisco7000系列路由器,可以使用SLB功能来替代防火墙。网络结构修改如图2所示。
为了保证在不改动服务器IP地址和客户端目标地址的条件下保持通信畅通,路由器的SLB功能需要负责NAT和负载均衡。具体实施如下:
路由器的以太网口连接到可信任的内部网,与服务器处于相同网段,并将以太网地址改为原防火墙Trusted口的地址。路由器应启动SLB功能,配置如下:
  
  !
  
  ip slb serverfarm REAL_HOST # REAL_HOST是真实服务器族的名字。
  
  predictor leastconns #选用最小连接数均衡算法。
  
  !
  
  real 10.1.1.1 # 这里填入几个真实服务器的IP地址。
  
  real 10.1.1.2
  
  real 10.1.1.3
  
  inservice #启动该服务。
  
  !
  
  ip slb vserver VIRTUAL_HOST # VIRTUAL_HOST是虚拟服务器的名字。
  
  virtual 192.168.1.10 tcp 8000 # 虚拟服务器的IP地址,tcp 8000表示自定义服务。
  
  serverfarm REAL_HOST #表示该虚拟服务器使用的真实服务器族。
  
  client 172.16.0.0 255.255.255.0 #限制客户端源地址。
  
  inservice #启动该服务。
  
  !
  
  路由器设置完成后,由于SLB负载均衡是工作在Dispatched模式下的,要求每个真实服务器把虚拟服务器的地址作为本机回环地址。这个看似简单的要求实现起来相当困难。一般系统默认的Loopback地址为127.0.0.1/8。目前,我们还没找到在Windows操作系统下修改Loopback地址的方法,好在我们使用的是Linux系统,可以方便地修改Loopback地址,修改方法如下:
  
  #vi /etc/sysconfig/network-scripts/ifcfg.lo
  
  DEVICE=lo
  
  IPADDR=192.168.1.10
  
  NETMASK=255.255.255.0
  
  NETWORK=192.168.1.0
  ……
  修改后重新开机,Loopback地址就修改完成了。
  如上修改后,如客户端仍不能通过虚拟服务器连接到真实服务器,则是因为ARP缓存不能正确地自动更新网关10.1.1.10的MAC地址,造成IP通信不畅。为了通信稳定,最好在每个真实服务器中的ARP表中加入永久的网关MAC地址项目; 当然,同时要求不要轻易修改路由器以太网接口的位置(MAC地址)。
缓存 负载均衡 网络协议 算法 网络安全 网络虚拟化 数据安全/隐私保护 网络架构 iOS开发 Windows
分享到
取消 提交回答
全部回答(0)
+ 订阅

云安全开发者的大本营

推荐文章
相似问题