[转]NAT精华集锦

随着internet技术的不断以指数级速度增长,珍贵的网络地址分配给专用网络终于被视作是一种对宝贵的虚拟房地产的浪费。因此出现了网络地址转换(nat)标准,就是将某些ip地址留出来供专用网络重复使用。本文将详细告诉你如何正确应用网络地址转换nat技术。


 NAT技术概述


NAT英文全称是network address translation,称是网络地址转换,NAT是一个IETF标准,允许一个机构以一个地址出现在internet上,这项对于那些使用来自RFC1819的未注册地址空间的公司是必需的,或者对于那些为其他公司进行IP注册的组织也十分有用。

它也可以应用到防火墙技术里,把个别ip地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还帮助网络可以超越地址的限制,合理地安排网络中的公有internet地址和私有ip地址的使用。

□ NAT技术基本原理

NAT可以动态改变通过路由器的IP报文的内容,以便修改报文的源IP地址和目的地址(或)目的IP地址,使离开路由器的报文的源地址或目的地址会转换成与原来不同的地址。IP校验和由NAT处理过程自动进行修改。有些应用程序将源IP地址嵌入到了IP报文的数据部分中,所以需要对报文进行修改。对于这些应用程序,NAT进程也必须修改报文的数据部分,以匹配IP头中已修改过的源IP地址。NAT的Cisco版本可以处理许多的应用,这些应用的报文数据部分包含IP地址。Cisco版本也允许共享负载的TCP流量,这可以通过允许对单个IP地址的TCP请求来实现。

在诸如Internet,或不同组织互连的管理域边界上,NAT使用得十分普遍。某些组织虽然申请了一些地址空间,但上网主机的数目超过了IP地址的数目,此时NAT就十分有用。没有注册的地址可以在内部使用,而注册地址只用于报文与外部网络通信。NAT处理过程对于源端和目的端主机都是透明的。

最早,NAT技术帮助解决了令人头痛的ip地址紧缺的问题,而且能使得内外网络隔离,提供一定的网络安全保障。它解决问题的办法是:在内部网络中使用内部地址,通过nat把内部地址翻译成合法的ip地址在internet上使用,其具体的做法是把ip包内的地址域用合法的ip地址来替换。nat功能通常被集成到路由器、防火墙、isdn路由器或者单独的nat设备中。nat设备维护一个状态表,用来把非法的ip地址映射到合法的ip地址上去。每个包在nat设备中都被翻译成正确的ip地址,发往下一级,这意味着给处理器带来了一定的负担。但对于一般的网络来说,这种负担是微不足道的。

□ NAT技术的类型

nat有三种类型:静态nat(static nat)、动态地址nat(pooled nat)、网络地址端口转换napt(port-level nat)。其中静态nat设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。而动态地址nat则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。napt则是把内部地址映射到外部网络的一个ip地址的不同端口上。根据不同的需要,三种nat方案各有利弊。

动态地址nat只是转换ip地址,它为每一个内部的ip地址分配一个临时的外部ip地址,主要应用于拨号,对于频繁的远程联接也可以采用动态nat。当远程用户联接上之后,动态地址nat就会分配给他一个ip地址,用户断开时,这个ip地址就会被释放而留待以后使用。

网络地址端口转换napt(network address port translation)是人们比较熟悉的一种转换方式。napt普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的ip地址后面。napt与动态地址nat不同,它将内部连接映射到外部网络中的一个单独的ip地址上,同时在该地址上加上一个由nat设备选定的tcp端口号。

在internet中使用napt时,所有不同的tcp和udp信息流看起来好像来源于同一个ip地址。这个优点在小型办公室内非常实用,通过从isp处申请的一个ip地址,将多个连接通过napt接入internet。实际上,许多soho远程访问设备支持基于ppp的动态ip地址。这样,isp甚至不需要支持napt,就可以做到多个内部ip地址共用一个外部ip地址上internet,虽然这样会导致信道的一定拥塞,但考虑到节省的isp上网费用和易管理的特点,用napt还是很值得的。

值得说明的是:有时人们直接把NAPT改叫做PAT。

□ 在internet中使用nat技术

nat技术可以让你区域网路中的所有机器经由一台通往internet的server线出去,而且只需要注册该server的一个ip就够了。在以往没有nat技术以前,我们必须在server上安装sockd,并且所有的clients都必须要支援sockd,才能够经过server的sockd连线出去。这种方式最大的问题是,通常只有telnet/ftp/www-browser支援sockd,其它的程式都不能使用;而且使用sockd的速度稍慢。因此我们使用网络地址转换nat技术,这样client不需要做任何的更动,只需要把gateway设到该server上就可以了,而且所有的程式(例如kali/kahn等等)都可以使用。最简单的nat设备有两条网络连接:一条连接到internet,一条连接到专用网络。专用网络中使用私有ip地址(有时也被称做network 10地址,地址使用留做专用的从10.0.0.0开始的地址)的主机,通过直接向nat设备发送数据包连接到internet上。与普通路由器不同nat设备实际上对包头进行修改,将专用网络的源地址变为nat设备自己的internet地址,而普通路由器仅在将数据包转发到目的地前读取源地址和目的地址。

□  应用nat技术的安全策略

◇ 应用nat技术的安全问题

在使用nat时,internet上的主机表面上看起来直接与nat设备通信,而非与专用网络中实际的主机通信。输入的数据包被发送到nat设备的ip地址上,并且nat设备将目的包头地址由自己的internet地址变为真正的目的主机的专用网络地址。而结果是,理论上一个全球唯一ip地址后面可以连接几百台、几千台乃至几百万台拥有专用地址的主机。但是,这实际上存在着缺陷。例如,许多internet协议和应用依赖于真正的端到端网络,在这种网络上,数据包完全不加修改地从源地址发送到目的地址。比如,ip安全架构不能跨nat设备使用,因为包含原始ip源地址的原始包头采用了数字签名。如果改变源地址的话,数字签名将不再有效。nat还向我们提出了管理上的挑战。尽管nat对于一个缺少足够的全球唯一internet地址的组织、分支机构或者部门来说是一种不错的解决方案,但是当重组、合并或收购需要对两个或更多的专用网络进行整合时,它就变成了一种严重的问题。甚至在组织结构稳定的情况下,nat系统不能多层嵌套,从而造成路由噩梦。

◇ 应用nat技术的安全策略

当我们改变网络的ip地址时,都要仔细考虑这样做会给网络中已有的安全机制带来什么样的影响。如,防火墙根据ip报头中包含的tcp端口号、信宿地址、信源地址以及其它一些信息来决定是否让该数据包通过。可以依nat设备所处位置来改变防火墙过滤规则,这是因为nat改变了信源或信宿地址。如果一个nat设备,如一台内部路由器,被置于受防火墙保护的一侧,将不得不改变负责控制nat设备身后网络流量的所有安全规则。在许多网络中,nat机制都是在防火墙上实现的。它的目的是使防火墙能够提供对网络访问与地址转换的双重控制功能。除非可以严格地限定哪一种网络连接可以被进行nat转换,否则不要将nat设备置于防火墙之外。任何一个淘气的黑客,只要他能够使nat误以为他的连接请求是被允许的,都可以以一个授权用户的身份对你的网络进行访问。如果企业正在迈向网络技术的前沿,并正在使用ip安全协议(ipsec)来构造一个虚拟专用网(vpn)时,错误地放置nat设备会毁了计划。原则上,nat设备应该被置于vpn受保护的一侧,因为nat需要改动ip报头中的地址域,而在ipsec报头中该域是无法被改变的,这使可以准确地获知原始报文是发自哪一台工作站的。如果ip地址被改变了,那么ipsec的安全机制也就失效了,因为既然信源地址都可以被改动,那么报文内容就更不用说了。那么nat技术在系统中我们应采用以下几个策略:

①网络地址转换模块

nat技术模块是本系统核心部分,而且只有本模块与网络层有关,因此,这一部分应和unix系统本身的网络层处理部分紧密结合在一起,或对其直接进行修改。本模块进一步可细分为包交换子模块、数据包头替换子模块、规则处理子模块、连接记录子模块与真实地址分配子模块及传输层过滤子模块。

②集中访问控制模块

集中访问控制模块可进一步细分为请求认证子模块和连接中继子模块。请求认证子模块主要负责和认证与访问控制系统通过一种可信的安全机制交换各种身份鉴别信息,识别出合法的用户,并根据用户预先被赋予的权限决定后续的连接形式。连接中继子模块的主要功能是为用户建立起一条最终的无中继的连接通道,并在需要的情况下向内部服务器传送鉴别过的用户身份信息,以完成相关服务协议中所需的鉴别流程。

③临时访问端口表

为了区分数据包的服务对象和防止攻击者对内部主机发起的连接进行非授权的利用,网关把内部主机使用的临时端口、协议类型和内部主机地址登记在临时端口使用表中。由于网关不知道内部主机可能要使用的临时端口,故临时端口使用表是由网关根据接收的数据包动态生成的。对于入向的数据包,防火墙只让那些访问控制表许可的或者临时端口使用表登记的数据包通过。

④认证与访问控制系统

认证与访问控制系统包括用户鉴别模块和访问控制模块,实现用户的身份鉴别和安全策略的控制。其中用户鉴别模块采用一次性口令(one-time password)认证技术中challenge/response机制实现远程和当地用户的身份鉴别,保护合法用户的有效访问和限制非法用户的访问。它采用telnet和web两种实现方式,满足不同系统环境下用户的应用需求。访问控制模块是基于自主型访问控制策略(dac),采用acl的方式,按照用户(组)、地址(组)、服务类型、服务时间等访问控制因素决定对用户是否授权访问。

⑤网络安全监控系统

监控与入侵检测系统作为系统端的监控进程,负责接受进入系统的所有信息,并对信息包进行分析和归类,对可能出现的入侵及时发出报警信息;同时如发现有合法用户的非法访问和非法用户的访问,监控系统将及时断开访问连接,并进行追踪检查。

⑥基于web的防火墙管理系统

管理系统主要负责网络地址转换模块、集中访问控制模块、认证与访问控制系统、监控系统等模块的系统配置和监控。它采用基于web的管理模式,由于管理系统所涉及到的信息大部分是关于用户帐号等敏感数据信息,故应充分保证信息的安全性,我们采用java applet技术代替cgi技术,在信息传递过程中采用加密等安全技术保证用户信息的安全性。

结尾:

尽管nat技术可以给我们带来各种好处,例如无需为网络重分ip地址、减少isp帐号花费以及提供更完善的负载平衡功能等,nat技术对一些管理和安全机制的潜在威胁仍在,看你如何正确应用好网络地址转换nat技术.

□  局限性

尽管NAT是一个很有用的工具,它还是有一些缺陷。NAT所面临的最主要的困难在于:有些应用程序将源IP地址嵌入到了IP报文的数据部分中。这样,报文的源IP地址在经过NAT的转换之后,就与报文数据部分的IP地址不匹配。如果IP头中的源IP地址不匹配报文数据部分的源IP地址,则这些在报文的数据部分嵌入IP地址的应用程序不能正常工作。Cisco实现的NAT能够处理许多将IP地址包含在报文数据部分的应用程序。一个特别例子是NetBIOS会话服务。NetBIOS服务用于Windows NT,所以它在数据网络中应用得很普遍。Cisco可以支持全部的NetBIOS服务。

Cisco NAT所支持的应用如下:

任何非源和目的的TCP/UDP报文
在IP报文的数据部分中的IP地址
ICMP
FTP
TCP上的NetBIOS(除了会话服务)
RealAudio
White Pines CUSeeMe
Streamworks
DNS “A”和“PTR”查询
H.323①
NetMeeting①
VDOLive
Vxtreme
① 在IOS 12.0.1或更高版本中支持。
Cisco NAT 不支持表1-2中的应用。如果读者要使用这些应用,就要知道当路由器执行NAT时它们很可能工作不正常。

Cisco NAT不支持的应用如下:

IP组播
路由表更新
DNS域的迁移
BOOTP
Talk, ntalk
SNMP
NetShow

NAT的术语

讨论NAT时,要用到几个术语:

1) 内部本地地址( inside local address)——分配给内部网络上主机的IP地址。这些地址通常只有内部主机知道。

2) 内部全局地址(inside  global address)——分配给内部主机的以用于NAT处理的地址;这种内部主机的地址可以被外部主机看到。

3) 外部本地地址( outside local address)——分配给外部主机的以用于NAT处理的IP地址;这些外部主机的地址可以被内部主机看到。

4) 外部全局地址(outside global address)——分配给外部网络上主机的IP地址。这类地址可以被外部主机知道,但不能被内部主机知道。

内部地址被内部网络所使用,这些地址可能要进行转换。外部地址被外部网络所使用,也可能需要进行转换。术语“本地(local)”指的是其地址可以被内部主机看到。而术语“全局(global)”指的是地址可以被外部主机看到。注意,如果外部地址没有经过NAT转换的话,外部本地地址和外部全局地址可能是一样的。也就是说,外部主机地址在外部网络和内部网络上可能是相同的,而实际情况也是如此。

理解这些术语的简单方法是抓住其第一个词语:内部或外部,它反映了报文的来源。内部本地地址(inside local address)和内部全局地址(outside global address)这两个术语都表明报文是来自内部网络的。第二个词语,本地或全局,则表明地址的可见范围。本地地址是在本地网络中可见。全局地址则在外部网络上可见。这样,一个内部本地地址来自内部网络,并且只在内部网络中可见。由于这些地址是在内部网络中,并且只对内部设备可见,因此不需要进行NAT操作。相反地,内部全局地址来自内部网络,但却在外部网络中可见。这些地址一般都要进行NAT操作。

启用NAT

在路由器上启用NAT功能需要了解几个命令。首先,读者需要确定在哪个接口上启用NAT,以及该接口是内部接口还是外部接口。通常,连接到用户内部网络的接口是NAT内部接口,而连接到外部网络,例如Internet的接口,是NAT外部接口。这些约定很重要,因为在后面将要介绍的其他NAT命令配置过程中要参考这些约定。每种接口命令的语法如下:

 IP NAT {inside | outside}

示例:

 Interface Ethernet0
  Description internal network
  Ip nat inside
 Interface Serial0
  Description internal Ineternet
  Ip nat outside

在确定启用NAT的接口之后,接下来就要确定内部全局地址。根据已有的定义,具有这些地址的报文从内部网络流出到外部网络以后,报文的地址在外部网络上是可见的。这通常是转换地址。

地址转换可以是动态的或静态的。如果我们不关心哪些内部本地址应该转换为哪些内部全局地址,则可以允许路由器从地址缓冲池中选取一个可用的地址。使用ip nat pool命令来定义该地址缓冲池:

 ip nat pool <name> <start-ip> <end-ip> {netmask <netmask> | prefix-length < prefix-length >} [type {rotary}]

示例:

 ip nat pool test 171.100.1.1 171.100.1.50 netmask 255.255.255.0
 ip nat pool test 171.100.1.1 171.100.1.50 prefix-length 24

注意,上述这些命令是等价的。另外我们已定义了将从.1到.50的地址放在内部全局地址缓冲池中。即使我们指定将掩码用于整个子网,<start-IP>和<end-IP>将地址范围限制在.1到.50之间。

定义了NAT池之后,当需要将一个内部本地地址映射为内部全局地址时,路由器就从池中取出第一个地址项。用户不能事先指定取池中的哪个地址。如果需要指定映射的IP地址,则需要使用静态映射。我们在后面提供了相关的示例。

在ip nat pool命令的语法中, rotary关键字用于一个可用的内部本地IP地址池,以将其中的内部本地IP地址映射到相同的内部全局地址。该关键字是很有用的,例如,读者拥有一个繁忙的Web站点,并且希望多个服务器响应对同一IP地址的Web请求,就应该使用该关键字。我们将在后面给出示例。

一旦创建了内部全局地址池,读者就需要指定允许哪些报文获得池中的地址。这可以使用ip nat inside source命令来完成。读者也可以在内部本地和内部全局地址间指定静态映射。这两种方法都可用命令ip nat iside source来实现,如下所示:

 ip nat inside source {list <acl> pool <name> [overload] | static <local-ip> <globle-ip>}

示例:

 ip nat inside source list 101 pool test
 ip nat inside source static 10.1.1.100 171.100.1.1

当使用list关键字时,该命令允许那些匹配访问表list的报文可以从名为name的NAT池中获取地址。overload关键字启用端口地址转换(Port Address Translation, PAT)。通过在NAT转换表中维持TCP/UDP端口信息和IP地址信息,PAT允许将多个内部本地地址转换为一个单一的内部全局地址。当内部全局地址数目有限时,这种特性十分有用。单一的PAT地址可以与NAT外部接口的IP地址相同,这在公司只有一个来自ISP的可用地址时十分有用。在大多数的配置中,路由器所连接的Internet必须具有一个全局可路由的IP地址,因此使用与PAT相同的地址是有用的。这种情况下还可以使用一种语法格式:

 ip nat inside source list <acl> interface <interface> overload

读者也可以将外部全局地址转换为外部本地地址,这在相互连系的公司之间各自所使用
的外部地址存在重叠时是十分有用的。例如,如果两个公司使用RFC 1918中重叠的地址,例
如10.0.0.0/24网络,则转换外部全局地址的语法如下:

 ip nat outside source {list <acl> <name> | static <global-ip> <local-ip>}

示例:

 ip nat outside source list 102 pool outside
 ip nat outside source static 171.50.19.1 10.50.1.1

这些命令的示例,将在后面介绍。

其他命令

在路由器上配置NAT时,应该了解一些其他命令。首先,可以使用命令来配置几个超时值,用以节省地址和路由器内存空间。这里每个NAT转换都需要一定的内存空间。如果不使用端口地址转换,只使用如下的一个命令即可:
 ip nat translation timeout {<0-2147483647> | never}

超时时间的单位是秒,缺省值是24小时或者36400秒。在需要大量NAT转换的环境中,最好将此超时值设为1~2小时,或者更小,因为路由器可能没有足够的内存来使用。如果使用PAT,则还需要其他的命令,这时路由器要查看其NAT表中的端口号和IP地址(注意,如果不使用PAT,则不会查看NAT表中的端口号)。要启用PAT功能,可使用如下的定时器:

 ip nat translation udp-timeout {<0-2147483647> | never}
 ip nat translation tcp-timeout {<0-2147483647> | never}
 ip nat translation finrst-timeout {<0-2147483647> | never}
 ip nat translation icmp-timeout {<0-2147483647> | never}
 ip nat translation port-timeout {<0-2147483647> | never}
 ip nat translation syn-timeout {<0-2147483647> | never}
 ip nat translation dns-timeout {<0-2147483647> | never}

这些值大多数都是含义自明的。finrst-timeout表示在路由器看到FIN或RST TCP报文之后的超时值。port-timeout值用于TCP和UDP。syn-timeout值在看到SYN TCP报文时启用。这些超时值中绝大多数都很小,一般是几分钟,可以使用其缺省值。例外的是TCP,其超时值为24小时。如前面所述,我们希望TCP超时值是1~2小时,或者更低。
如果使用PAT,随着计数器的增值计数,NAT表中的不活跃表项只能存在很短一段时间。例如,即使TCP超时值为24小时,如果在NAT转换中出现了FIN或RST报文,则表项会在1分钟内被删除。由于正常终止的会话能看到一个FIN或RST报文,因此只有那些非正常结束的TCP连接才会在NAT表中保留一段时间。这就是我们建议使用较低的TCP超时值的原因。非正常结束的连接在NAT表中转换时使用较小的超时值。

除了超时命令外,还有其他一些有用的命令。下面给出每个的简短描述和示例输出:

1、 Show ip nat translations verbose

2621# sh ip nat trans ver
pro Inside global      Inside local    Outside local     outside global
tcp 171.0.200.21:1030  10.1.1.2:1030  171.0.200.1:23   171.0.200.1:23
 creat 00:00:46 use 00:00:25. left 00:00:34.
Extended,timing-out,use_count:0
Icmp 171.0.200.21:768  10.1.1.2:768   171.0.200.1:768  171.0.200.1:768
 creat 00:00:54 use 00:00:51. left 00:00:08.
 Flags;
Extended,use_count:0

2、 Show ip nat statistics

2621# sh ip nat statistics
Total active translations:2(0 static,2 dynamic;2 extended)
Outside interfaces:
 fastEthernet0/1
Inside interface:
 FastEthernet0/0
Hits:84 Misses:12
Expired translation:8
Dynamic mapping:
-Inside Source
access-list 1 pool test refcount 2
 pool test: netmask 255.255.255.0
  start 171.0.200.21 end 171.0.200.24
  type generic, total addresses 4, allocated 1 (25%).misses

3、 Debug ip nat [<list>] [detailed]

2621# debug ip nat detail
ip nat detailed debugging is on
02:00:24: nat : installing alias for address 171.0.200.21
02:00:24: nat : ipnat_allocate_port: wanted 768 got 768
02:00:24: nat*: o: icmp(171.0.200.1, 768)->(171.0.200.21, 768)[14337]

02:00:25: nat*: i: icmp(10.1.1.2, 768)->(171.0.200.1, 768)[14593]
02:00:25: nat*: o: icmp(171.0.200.1, 768)->(171.0.200.21, 768)[14593]

02:00:26: nat*: i: icmp(10.1.1.2, 768)->(171.0.200.1, 768)[14849]
02:00:26: nat*: o: icmp(171.0.200.1, 768)->(171.0.200.21, 768)[14849]

02:00:27: nat*: i: icmp(10.1.1.2, 768)->(171.0.200.1, 768)[15105]
02:00:27: nat*: o: icmp(171.0.200.1, 768)->(171.0.200.21, 768)[15105]

02:00:25: nat: i: tcp(10.1.1.2, 1033)->(171.0.200.1, 23)[15361]
02:00:25: nat: o: ipnat_allocate_port: wanted 1033 got 1033
02:00:25: nat*: o: tcp(171.0.200.1, 23)->(171.0.200.21, 1033)[0]
02:00:25: nat*: i: tcp(10.1.1.2, 1033)->(171.0.200.1, 23)[15617]

另一个极有用的其他NAT命令是:

 Clear ip nat translation {* | <global-ip> | <global-ip> <local-ip> <prototol> <global-port> <local-port>}
该命令用于消除NAT表中的转换,这对于调试诊断有用。在后面的示例中,将不再提及这睦命令,以免重复,但读者最好熟悉它们并在自己的应用中查看其输出。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值