IPv4 NAT（含Cisco配置）IPv4私有空间地址类RFC 1918 内部地址范围前缀A10.0.0.0 - 10.255.255.25510.0.0.0/8B172.16.0.0 - 172.31.255.255172.16.0.0/12C192.168.0.0 - 192.168.255.255192.168.0.0/16这些私有地址可在企业或站点内使用，允许设备进行本地通信。但是，由于这些地址并不代表任何公司或组织机构，因此私有IPv4地址不能在互联网上路由。为了使具有私有 IPv4 地址的设备能够访问本地网络之外的设备和资源，必须首先将私有地址转换为公有地址。NAT 提供了私有地址到公有地址的转换，NAT的类型。这样做可以使拥有私有IPv4地址的设备可以访问私有网络外部的资源，比如互联网上的资源。NAT的概念NAT 有很多作用，但其主要作用是节省了公有 IPv4 地址。它通过允许网络在内部使用私有 IPv4地址，而只在需要时提供到公有地址的转换，从而实现这一作用。NAT还在一定程度上增加了网络的隐私性和安全性，因为它对外部网络隐藏了内部IPv4地址。可以为启用 NAT 的路由器配置一个或多个有效的公有 IPv4 地址。这些公有地址称为 NAT 地址池。当内部设备将流量发送到网络外部时，启用 NAT 的路由器会将设备的内部 IPv4 地址转换为NAT 池中的一个公有地址。对外部设备而言，所有进出网络的流量好像都有一个取自所提供地址池中的公有 IPv4 地址。NAT 路由器通常工作在末端网络边界。末节网络是指这一个或多个网络与它的邻居网络之间只有单条连接，网络流量只有单条路入、单条路出。在图中的示例中，R2 为边界路由器。对 ISP 来说，R2 构成末端网络。当末端网络内的设备想要与其网络外部的设备通信时，会将数据包转发到边界路由器。边界路由器会执行 NAT 过程，将设备的内部私有地址转换为公有的外部可路由地址。NAT术语由于本文主要讲IPv4的NAT，“地址”一词如果没有特殊说明默认指IPv4地址。内部本地地址：内部网络设备看到的源IPv4地址。内部全局地址：网络外部看到的源IPv4地址。当发至外部的数据包经过NAT网关时，源IPv4地址会变成内部全局IPv4地址。外部本地地址：外部设备看到的目的IPv4地址。这通常是分配给互联网主机的全局可路由地址。大多数情况，外部本地地址与外部全局地址是一样的。外部全局地址：网络内部设备看到的目的IPv4地址。在决定使用哪一种地址时，重要的是记住NAT术语始终是从具有转换后地址的设备的角度来应用的：内部地址：经过NAT转换的设备IP地址外部地址：目的设备的IP地址关于地址，NAT还会使用全局或本地的概念：本地地址：出现在网络内部的IP地址全局地址：出现在网络外部的IP地址静态NAT静态NAT使用本地地址和全局地址一对一映射，由管理员进行配置，保持不变。在图中，R2 上配置了 Svr1、PC2 和 PC3 的内部本地地址的静态映射。这些设备在向互联网发送流量时，它们的内部本地地址会转换为管理员配置的内部全局地址。对外部网络的设备而言，这些设备使用的是公有IPv4地址。如果Web服务器或设备必须拥有固定的地址，以便能够让其他设备从互联网发起访问的话 比如公司的Web服务器），静态NAT就尤为有用。静态NAT也适用于这种情况：只有拥有授权的人员才能够从互联网对设备进行访问，发起访问的并不是互联网上一般的公有设备。举例来说，网络管理员可以从PC4上使用SSH来访问SRV1的内部全局地址 209.165.200.226）。R2会把这个内部全局地址转换为内部本地地址192.168.10.10，然后把会话连接到SRV1。为了满足所有同时发生的用户会话需要，静态 NAT 要求有足够的公有地址可用。动态NAT动态 NAT 使用公有地址池，并以先到先得的原则分配这些地址。内部设备请求访问外部网络时，动态 NAT 分配该池中的可用公共 IPv4 地址。如图所示，PC3使用的是动态NAT池中第5个可用地址连接的互联网。而其他地址仍可供使用。与静态 NAT 类似，为了满足所有同时发生的用户会话需要，动态 NAT 要求有足够的公有地址可用。端口地址转换PAT端口地址转换（PAT），也称为NAT过载，可以可以将多个地址映射到一个或少数几个地址，因为每个私有地址也会用端口号加以跟踪。当设备发起 TCP/IP 会话时，它会生成一个 TCP 或 UDP源端口号，或专门为 ICMP 分配的查询 ID，用来唯一地标识这个会话。当 NAT 路由器收到来自客户端的数据包时，将使用其源端口号来唯一确定特定的 NAT 转换。当 R2 处理各数据包时，它使用端口号 本例中为 1331 和 1555）来识别发起数据包的设备。源地址（ SA）为内部本地地址，再加上TCP/UDP分配的端口号。目的地址 （DA）为外部全局地址，再加上服务器端口号。在本示例中，HTTP 服务端口为 80。对于源地址，R2会将内部本地地址转换为内部全局地址，并添加端口号。当Web服务器回复的时候，路径相反。下一可用端口上图中，启用NAT的路由器上客户端的端口号没有改变，这种情况不太常见。因为这些端口可能被其他服务所占用。PAT会尝试保留原始的源端口，但是端口若被占用，PAT就会从相应的端口组（0-511、512-1023或1024-65535）中分配第一个可用的端口号。如果地址池外部地址多于一个，则PAT会进入下一地址并尝试重新分配原始端口号。不包含传输层数据段的数据包如果IPv4数据包不包含传输层数据段，这些数据包将不包含传输层端口号。PAT 可以转换 IPv4 承载的大多数常用协议，这些协议不会将 TCP 或 UDP 用作传输层协议。其中最常见的一种就是 ICMPv4。对于每种类型的协议，PAT 会以不同方式进行处理。例如，ICMPv4 查询消息、响应请求和响应应答会包含一个查询 ID。ICMPv4 使用查询 ID 来识别响应请求及其相应的响应应答。每发送一个响应请求，查询 ID 都会增加。PAT 将会使用查询 ID 而不是传输层端口号。Cisco配置命令静态NAT配置以上图为例，内部网络中包含一台Web服务器，它使用了私有IPv4地址。路由器R2上配置了静态NAT，允许外部网络上的设备能够访问这台Web服务器。外部网络中的客户端使用公网IPv4访问Web服务器。首先，建立内部本地地址与内部全局地址的映射关系。我们使用下面的命令，在R2上将192.168.10.254这个内部本地地址映射到209.165.201.5上。R2(config)# ip nat inside source static 192.168.10.254 209.165.201.5接下来，将参与转换的接口配置为内部或外部接口（对于NAT而言）。上图中的R2的S0/1/0就是内部接口，而S0/1/1为外部接口。R2(config)# interface serial 0/1/0 R2(config-if)# ip address 192.168.1.2 255.255.255.252 R2(config-if)# ip nat inside R2(config-if)# exit R2(config)# interface serial 0/1/1 R2(config-if)# ip address 209.165.200.1 255.255.255.252 R2(config-if)# ip nat outside在PC上访问Web服务器资源，其过程如下图所示：此外，我们可以在R2路由器上特权模式下使用命令，来显示活动的NAT转换。R2# show ip nat translations由于该示例是静态NAT配置，因此无论是何种配置，转换都会在NAT表里Pro Inside global Inside local Outside local Outside global --- 209.165.201.5 192.168.10.254 --- --- Total number of translations: 1如果在活跃会话过程中执行了上述命令，命令输出中就会显示外部设备的地址：Pro Inside global Inside local Outside local Outside global tcp 209.165.201.5 192.168.10.254 209.165.200.254 209.165.200.254 --- 209.165.201.5 192.168.10.254 --- --- Total number of translations: 2如果想要查看活动转换总数、NAT配置参数、地址池地址数量、已分配地址数量，可用以下命令：R2# show ip nat statistics动态NAT图中描述了一对一的 NAT 转换。内部网络中有两台 PC 连接到路由器 R1，两台 PC 分别位于192.168.10.0/24和192.168.11.0/24网络中。其中一台PC的IP地址是192.168.10.10，另一台PC的IP地址是192.168.11.10。R1通过S0/1/0接口连接路由器R2。R2通过S0/1/1接口连接互联网，互联网上有一台服务器IP地址为209.165.200.254。R2通过动态NAT来实现内部网络和外部网络之间的转换。这个公有 IPv4 地址池（内部全局地址池）根据先到先得的原则，分配这些地址给内部网络中的任何设备。使用动态 NAT 时，单个内部地址将转换为单个外部地址。在使用这种类型的转换时，地址池中必须有足够的地址，才能满足所有内部设备访问外部网络的需求。如果地址池中的所有地址都被使用了，其他设备必须等到有可用地址时，才能访问外部网络。注意：在公有和私有IPv4地址之间执行转换，是当前NAT最常见的用途。不过，我们也可以使用NAT在任意一对IPv4地址之间执行转换。首先，定义用于转换的地址池。该地址池通常是一组公有地址。这些地址是通过指明池中的起始 IPv4 地址和结束 IPv4 地址而定义的。netmask 或 prefix-length 关键字指示出哪些地址位属于网络部分，哪些地址位属于这个地址范围中的主机部分。R2(config)# ip nat pool NAT-POOL1 209.165.200.226 209.165.200.240 netmask 255.255.255.224然后配置一个标准 ACL，用于仅标识（允许）那些将要进行转换的地址。范围太宽的 ACL 可能会导致意料之外的后果。要记住在每个ACL的末尾都有一条隐式 deny all 语句。R2(config)# access-list 1 permit 192.168.0.0 0.0.255.255把ACL绑定到地址池：R2(config-if)# ip nat inside source list 1 pool NAT-POOL1指定NAT转换接口R2(config)# interface serial 0/1/0 R2(config-if)# ip nat inside R2(config)# interface serial 0/1/1 R2(config-if)# ip nat outsidePAT单个PAT要在配置PAT时只使用单个IPv4地址，只需要把关键字 overload 添加到ip nat inside source命令中即可。其他配置与静态或动态NAT配置类似，只是在PAT配置中，多台主机可以使用相同的公有IPv4地址来访问互联网。在本例中，网络192.168.0.0/16中的所有主机（匹配ACL 1）在通过路由器R2向互联网发送流量时，数据包的源地址会被转换为IPv4地址209.165.200.225 （S0/1/1接口的IPv4地址）。由于配置了 overload 关键字，路由器会使用NAT表中的端口号来识别通信流量。R2(config)# ip nat inside source list 1 interface serial 0/1/1 overload R2(config)# access-list 1 permit 192.168.0.0 0.0.255.255 R2(config)# interface serial0/1/0 R2(config-if)# ip nat inside R2(config-if)# exit R2(config)# interface Serial0/1/1 R2(config-if)# ip nat outside配置PAT来使用地址池ISP 可以向组织机构分配多个公有 IPv4 地址。在这种场景中，组织机构可以配置PAT来使用一个IPv4公有地址池进行转换。如果某个站点发出了多个公有 IPv4 地址，这些地址可能是 PAT 使用的地址池的一部分。如果让较多的设备共享一个较小的地址池，那么就会有多台设备使用相同的公有IPv4地址访问互联网。要在配置PAT时使用动态NAT地址池，只需要把关键字 overload 添加到ip nat inside source 命令中即可。在本例中，NAT-POOL2中绑定了一个ACL，其中限定了要转换的地址是192.168.0.0/16。因为命令中使用关键字 overload 启用了PAT，因此这些主机可以共享地址池中的IPv4地址。R2(config)# ip nat pool NAT-POOL2 209.165.200.226 209.165.200.240 netmask 255.255.255.224 R2(config)# access-list 1 permit 192.168.0.0 0.0.255.255 R2(config)# ip nat inside source list 1 pool NAT-POOL2 overload R2(config)# R2(config)# interface serial0/1/0 R2(config-if)# ip nat inside R2(config-if)# exit R2(config)# interface serial0/1/1 R2(config-if)# ip nat outside关于IPv6的NAT简要说明由于很多网络同时使用了IPv4和IPv6，因此需要有一种方法能够在IPv6环境中使用NAT。在 IPv6环境中集成 NAT。具有 128 位地址的 IPv6 可以提供 340 涧 10 的 36 次方）个地址。因此，不会出现地址空间耗尽问题。IPv6的开发初衷，就是为了免除公有和私有IPv4地址之间的IPv4 NAT转换。但IPv6中也确实有自己的IPv6私有地址空间，也就是唯一本地地址 ULA）。IPv6中的唯一本地地址 ULA）与RFC 1918规范中的IPv4私有地址类似，但它们的用途不同。ULA地址只用于一个站点内部的本地通信。ULA地址并没有提供额外的IPv6地址空间，也没有提供安全性。IPv6在IPv4和IPv6之间提供的协议转换称为NAT64。用于 IPv6 的 NAT 与用于 IPv4 的 NAT 使用背景大不相同。用于IPv6的NAT是为了在纯IPv6和纯IPv4网络之间提供透明传输，如图所示。而不是用作一种私有 IPv6 到全局 IPv6 的转换。图中描述了 NAT64 或 IPv6 NAT 转换。名为NAT64的路由器连接着IPv4互联网、IPv6互联网和纯IPv6网络。原生的IPv6流量显示在IPv6网络中，NAT64转换后的流量显示在IPv4网络中。理想情况下，只要有可能，IPv6 就应当在本地运行。这意味着 IPv6 设备将通过 IPv6 网络相互通信。但是，为了帮助实现从 IPv4 到 IPv6 的转移，IETF 已经开发了多项过渡技术以满足各种IPv4 到 IPv6 的转移情景，包括双堆栈、隧道和转换。双栈是指设备上同时运行与IPv4和IPv6相关联的协议。IPV6 隧道是指将 IPv6 数据包封装到IPv4 数据包中的过程。这将使 IPv6 数据包能够通过仅支持 IPv4 的网络传输。我们不应该把IPv6 NAT作为一种长期策略使用，但它可以作为临时机制来协助从IPv4到IPv6的迁移。多年来，已经开发了多个用于 IPv6 的 NAT 的类型，包括网络地址转换-协议转换 (NAT-PT)。IETF 已弃用 NAT-PT，开始倾向于其替代者 NAT64。