网络地址翻译与策略路由应该注意的问题
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
Pro Inside global Inside local Outside local Outside global
--- 172.16.47.161 171.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中增加一条静态路由。
ip route 172.16.47.160 255.255.255.252 null0
这样所有的到NAT翻译地址池的路由都指向这个虚拟的null0接口。
3.利用NAT和Access-list实现策略路由
在路由器进行包转发决策过程中,通常是根据所接受的包的目的地址进行的。路由器根据包的目的地址查找路由表,从而作出相应的路由转发决策。然而,有时我们需要按照自己的规则来进行数据包的路由,而不仅仅由包的目的地址来决定数据包的路由,这就是路由策略问题。基于策略路由通常有以下几种方式:
☆ 基于源IP地址的策略路由
☆ 基于数据包大小的策略路由
☆ 基于应用的策略路由
☆ 通过缺省路由平衡负载
以下我们通过一个实例来学习如何使用基于策略的路由方法,网络拓扑如图2。
在该实例中,我们所采用的策略路由方法是基于源IP地址的策略路由。该用户同时连着两个不同ISP,而且每个ISP都为用户提供不同的合法地址空间。我们采用策略路由和网络地址翻译的方法,将不同的源IP地址沿不同的ISP接入到Internet。如图2,源地址为10.1.0.0/2的数据包沿ISP1路由,源地址为10.2.0.0/2的数据包沿ISP1路由。路由器具体大概配置方法如下:
hostname WAN-Router
ip nat pool provider1-space 211.111.11.1 211.111.11.254 prefix-length 24
ip nat pool provider2-space 222.122.22.1 222.122.22.254 prefix-length 24
ip nat inside source route-map provider1-map pool provider1-space
ip nat inside source route-map provider2-map pool provider2-space
!
interface Serial0/0
ip address 222.102.7.5 255.255.255.252
ip nat outside
!
interface Serial0/1
ip address 211.109.5.5 255.255.255.252
ip nat outside
!
interface FastEthernet1/0
ip address 10.1.1.1 255.255.0.0
ip nat inside
ip policy route-map provider1-map
!
interface FastEthernet1/1
ip address 10.2.1.1 255.255.0.0
ip nat inside
ip policy route-map provider2-map
!
route-map provider1-map permit 10
match ip address 1
match interface Serial0/0
!
route-map provider2-map permit 10
match ip address 2
match interface Serial0/1
!
accesss-list 1 permit ip 10.1.0.0 0.0.255.255
accesss-list 2 permit ip 10.2.0.0 0.0.255.255
!
ip route 211.111.11.0 255.255.255.0 null0
ip route 222.122.22.0 255.255.255.0 null0
4.结束语
虽然使用网络地址翻译可以带来许多优点,例如可以帮助网络治理员向互联网隐藏内部网络地址,并把内部网络地址转换为合法的公有地址;使现有网络不必重新编址、减少了ISP接入费用,还可以起平衡负载的作用。但NAT也潜在地影响到一些网络性能和安全设施,这就需要网络治理员谨慎地使用它。