网络地址翻译与策略路由应该注意的问题


1.引言
随着Internet数据业务的飞速发展,丰富的网络资源对越来越多的用户产生了巨大的吸引力,越来越多的企业和用户需要接入Internet 。但由于受到IPv4地址资源的限制,其可用的IP地址越来越少,要想在ISP处申请一个新的IP地址已不是很轻易的事了 。这不仅是费用的问题,而是由IP地址的现行标准IPv4决定的 。当然,随着IPv6标准的出台,这个问题应当能够得到解决 。但从IPv4到IPv6的升级不是一两天就能完成的 。因此,目前大多数用户无法获得合法地址,而利用NAT是目前一个很好的解决方法 。NAT的解决方法是:在用户内部网络中使用内部私有空间地址,通过NAT把内部私有地址翻译成合法的全局IP地址 。

2.网络地址翻译及其实现方法以及应该注重的问题
目前NAT功能通常被集成到路由器、防火墙等设备中 。NAT设备维护一个NAT表,用它来实现全局到本地和本地到全局地址的映射 。路由器或防火墙等设备利用NAT表把非法的私有IP地址映射到合法的全局IP地址上去 。每个私有地址包通过NAT设备都被翻译成合法的全局IP地址发往下一级设备,这意味着给NAT设备的处理器带来了一定的负担 。但这对于一般的网络来说是微不足道的,除非是有许多主机的大型网络 。
NAT有三种类型:静态NAT(static NAT)、NAT池(pooled NAT)和端口NAT(PAT) 。其中静态NAT设置起来最为简单,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址 。而NAT池则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络 。PAT则是把内部地址映射到外部网络的一个IP地址的不同端口上 。当建立内部网的时候,建议使用以下地址组用于主机,这些地址是由Network Working Group(RFC 1918)保留用于私有网络地址分配的 。
Class A:10.1.1.1 to 10.254.254.254
Class B:172.16.1.1 to 172.31.254.254
Class C:192.168.1.1 to 192.168.254.254
下面是一个利用NAT功能实现内部私有地址来访问Internet的案例和可能碰到的问题 。
在图1的拓扑结构试验条件下,Router-A配置为用来实现NAT功能,来自Inside Router地址全都被翻译为“test”地址池中 。Router-A的配置如下,其它路由器利用静态路由来实现各路由器之间互通 。
hostname Router-A
!
ip nat pool test 172.16.47.161 172.16.47.165 prefix-length 28
ip nat inside source list 7 pool test
!
interface Ethernet0
ip address 135.135.1.2 255.255.255.0
shutdown
!
interface Serial0
ip address 171.68.200.49 255.255.255.0
ip nat inside
no ip mroute-cache
no ip route-cache
no fair-queue
!
interface Serial1
ip address 172.16.47.146 255.255.255.240
ip nat outside
no ip mroute-cache
no ip route-cache
!
ip classless
ip route 0.0.0.0 0.0.0.0 172.16.47.145
Access-list 7 permit 192.168.0.0 0.0.255.255
!
line con 0
exec-timeout 0 0
line aux 0
line vty 0 4
login
!
end
通过使用Debug命令,从Inside Router发出一些源地址为171.68.200.48,目的地址为171.68.191.1的ICMP包,我们可以发现,从Inside Router可以Ping通任何外部合法的全局地址 。用Show ip nat translations命令可以看出,内部私有地址与外部全局合法地址之间翻译的NAT表 。
Router-A#show ip nat translations
ProInside globalInside localOutside local Outside global
---172.16.47.161171.68.200.48------
然而,当我们用Clear ip nat translation命令后,从Outer Router发出一些源地址为171.68.191.1,目的地址为172.16.47.161(或者为NAT池test中任何一个地址)的ICMP包,发现它们之间不能Ping通 。这是由于NAT翻译表中没有任何翻译记录,所以Router-A只能将这些ICMP包路由按照缺省路径向Router-B转发该包,而Router-B认为目的地址为172.16.47.161包应该发向Router-A转发,这样在Router-A和Router-B形成了一个路由环,严重的情况可能引起线路中断 。为了避免类似的问题发生,我们可以在Router-A中增加一条静态路由 。

推荐阅读