兩種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地址)。

