目录

前言
基本概念
  Inside 与 Outside
  Local 与 Global Address
  NAT 与 Routing 的先後次序
Inside Source Translation
  Static Translation
  Dynamic Translation
  PAT (Port Address Translation)
Inside Destination Translation

前言

Network Address Translation (NAT) 的出现是为了解决 IPv4 Address 不足的问题。话说互联网络发展迅速,IPv4 Address 需求量超出预期 (详情请参考 IPv4 的文章),NAT 是当时发展出来的一个过渡性方案,以解燃眉之急。透过 Public IP Address 与 Private IP Address 之间的转换,NAT 有效地降低了企业对 Public IP Address 的需求,因而被广泛使用。本文将会介绍几款能在 Router 上应用的 NAT 设定。

基本概念

首先介绍一些 NAT 的基本概念。

Inside 与 Outside

NAT 通常被应用於企业的 Edge Router 上,即 Router 上一边是连接着 Internet,称为 Outside,另一边则连着企业的内联网,称为 Inside。以下图的网络为例,假设 R1 是执行 NAT 的 Router,A1 是位於 Inside 的 Host,而 B1 是位於 Outside 的 Host。在 R1 上使用 Public Address 那边为 Outside (e1/1),相反,使用 Private Address 的一边为 Inside (e1/0)。

nat

设定 Outside 和 Inside 的指令如下:

R1(config)#int ethernet 1/0
R1(config-if)#ip nat inside
R1(config-if)#int eth 1/1
R1(config-if)#ip nat outside

Local 与 Global Address

NAT 的用途是 IP Address 的转换,因此我们为 IP Address 转换前和後都定义一个名称来分辨,分别昰 Local 和 Global。如果 Host 的物理位置在 Inside 那边,那麽它转换前的 Address 就是 Inside Local,这个 Address 经过 NAT 转换後就会变成 Inside Global,留意转换的只是 Local 和 Global,它的物理位置 Inside 和 Outside 不会变动。文字上较难理解,以下我们用一个例子去说明。假设从 A1 192.168.1.10 经 R1 Ping B1 1.1.1.10,转换过程如下:

#事件Source Address (SA)Destination Address (DA)
1 ICMP Ping 从 A1 出发 192.168.1.10 (Inside Local) 1.1.1.10 (Outside Global)
2 ICMP Ping 到达 R1,SA 被转换,
然後送达 B1
1.1.1.1 (Inside Global) 1.1.1.10 (Outside Global)
3 B1 收到 SA=1.1.1.1 的 ICMP Ping,
因而发 ICMP Reply 到 1.1.1.1
1.1.1.10 (Outside Global) 1.1.1.1 (Inside Global)
4 R1 收到 ICMP Reply,DA 被转换,
然後送达 A1
1.1.1.10 (Outside Global) 192.168.1.10 (Inside Local)

以图像表示则如下图:

nat

NAT 与 Routing 的先後次序

关於 NAT 一个极重要的概念就是:究竟 Router 会先做 NAT 还是先做 Routing Decision?这问题必需搞清楚是因为当 Packet 的 IP Address 被转换时会影响 Router 查找 Route Table 的结果。答案是如果 Packet 从 Inside 进入 Router,会先做 Routing,然後做 NAT。相反,如果 Packet 从 Outside 进入则先做 NAT 才做 Routing。

Inside Source Translation

终於来第一个 NAT 范例:Inside Source Translation。这是十分常用的设定,透过 NAT 把 Private Address 转换成 Public Address 使内联 Host 能够与 Internet 沟通。从下图所见,当 A1 发 Packet 给 B1 时,Inside Loacal Address 192.168.1.10 经过 NAT 被转换成 Inside Global Address 1.1.1.1。

nat

Static Translation

现为 R1 做 NAT 设定,由於被转换的是 Inside Source Address,我们会用到 ip nat inside source static 指令。至於指令是先输入 Inside Local 还是 Inside Global?笔者也觉难记,不要紧,一直打问号看提示便可以了。

R1(config)#ip nat inside source static ?
  A.B.C.D  Inside local IP address
  esp      IPSec-ESP (Tunnel mode) support
  network  Subnet translation
  tcp      Transmission Control Protocol
  udp      User Datagram Protocol

R1(config)#ip nat inside source static 192.168.1.10 ?
  A.B.C.D    Inside global IP address
  interface  Specify interface for global address

R1(config)#ip nat inside source static 192.168.1.10 1.1.1.1

然後用 show ip nat translation 指令确认一下。

R1#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
--- 1.1.1.1            192.168.1.10       ---                ---

这种用 Static 设定的方法也称为 One to One NAT,需要手动输入每组 Inside Local 所对应的 Inside Global。由 A1 所发的 Packet 的 Source Address 192.168.1.10 经过 NAT 变成 1.1.1.1,B1 收到时便会以为 Packet 是由 1.1.1.1 送来的,所以回覆时就会把 Destination Address 设为 1.1.1.1,问题来了,我们需要设定 NAT 把 1.1.1.1 转回 192.168.1.10 吗?答案是不用的,因为当 NAT 执行时,会把转换过的 Protocol丶IP Address 和 Port 等资料记录下来,收到回覆时就会自动把 Packet 的 Destination Address 换回原本的 Inside Local Address。

R1#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 1.1.1.1:8         192.168.1.10:8     1.1.1.10:8         1.1.1.10:8
tcp 1.1.1.1:31925      192.168.1.10:31925 1.1.1.10:23        1.1.1.10:23
--- 1.1.1.1            192.168.1.10       ---                ---

Dynamic Translation

如果 Inside 那边有超过一台 Host,我们就要为每台 Host 分别建立 One to One NAT,较方便的方法是用 Dynamic 的方式来建立,让 Router 把 Public IP 自动分配给多於一台 Host。举例,现在为刚才的网络加一台 Host A2,并於 R1 的 Outside (e1/1) 加上 Secondary IP Address 1.1.1.2。

nat

R1(config)#int ethernet 1/1
R1(config-if)#ip address 1.1.1.2 255.255.255.0 secondary

然後,今次在 ip nat source 指令里不用 static,改为用 list,下面例子的意思是把所有符合 ACL 1 的 Traffic 的 Inside Local Address 换成 IN-SRC-POOL,而这个 IN-SRC-POOL 被定义为 1.1.1.1 至 1.1.1.2 之间的所有 IP。注意 Pool 的 IP Address 不应少於想要转换的 Inside Local Address 数量。

R1(config)#ip nat inside source list 1 pool IN-SRC-POOL
R1(config)#access-list 1 permit 192.168.1.0 0.0.0.255
R1(config)#ip nat pool IN-SRC-POOL 1.1.1.1 1.1.1.2 prefix-length 24

完成设定後,起初是没有任何 Translation 纪录的。

R1#show ip nat translations 
R1#

当有合资格的 Traffic 经过时,Translation 就自动产生了。

R1#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 1.1.1.1:11        192.168.1.10:11    1.1.1.10:11        1.1.1.10:11
tcp 1.1.1.1:44372      192.168.1.10:44372 1.1.1.10:23        1.1.1.10:23
--- 1.1.1.1            192.168.1.10       ---                ---
icmp 1.1.1.2:5         192.168.1.20:5     1.1.1.10:5         1.1.1.10:5
--- 1.1.1.2            192.168.1.20       ---                ---

如果此时 Inside 出现第 3 台 Host 想要做 NAT 的话,转换不会成功并出现以下错误讯息,因 Inside Global Address 不够用了。

R1#
*Sep 17 23:42:38.677: %IPNAT-4-ADDR_ALLOC_FAILURE: Address allocation failed for 192.168.1.10, pool IN-SRC-POOL might be exhausted

PAT (Port Address Translation)

但我们总不能为内联所有 Host 都准备一组 Public IP Address,这是无法减少 Public IP Address 使用数量的。用 Port Address Translation (PAT) 可以解决这个问题,也是现时最常使用的设定。PAT 又称为 Overload,原理是在转换时把 Source Port 和 Destination Port 也一并加进去,由於 TCP Port 的上限是 65,535,所以理论上一个 Public IP Address 就能最多为 65,535 条 Traffic Flow 服务了 (实际上并没那麽多,因 Router 会保留一些 Port 给自己使用)。例如:A1 想要 Telnet B1 (TCP Port 23),IP Address 及 Port 转换如下图。

nat

设定上只要加一个 keyword overload 便可以了。

R1(config)#ip nat inside source list 1 pool IN-SRC-POOL overload
R1(config)#access-list 1 permit 192.168.1.0 0.0.0.255
R1(config)#ip nat pool IN-SRC-POOL 1.1.1.1 1.1.1.1 prefix-length 24

再看看 show ip nat translatios 结果。

R1#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
tcp 1.1.1.1:4096       192.168.1.10:27642 1.1.1.10:23        1.1.1.10:23
tcp 1.1.1.1:4097       192.168.1.20:27418 1.1.1.10:23        1.1.1.10:23

Inside Destination Translation

另一个较常用的设定是 Inside Destination Translation,这是一个让 Router 充当成 Load Balancer 的设定,假设 Host 从 Outside 连到 Public IP Address 1.1.1.1,NAT Router 可把 Inside Global Address 1.1.1.1 转换成多於 1 个 Inside Local Address,把 Traffic 平均分配到不同的 Host。

nat

R1(config-if)#ip nat inside destination list 1 pool IN-DST-POOL
R1(config-if)#access-list 1 permit 1.1.1.1
R1(config-if)#ip nat pool IN-DST-POOL 192.168.1.10 192.168.1.11 prefix-length 24 type rotary

留意 type rotary 的意思是轮流使用 192.168.1.10 和 192.168.1.11 成为 Inside Local,如在 B1 Telnet 1.1.1.1,会发现 A1 和 A2 轮流回应。

B1#telnet 1.1.1.1
Trying 1.1.1.1 ... Open

User Access Verification

Password: 
A1>exit

[Connection to 1.1.1.1 closed by foreign host]
B1#telnet 1.1.1.1
Trying 1.1.1.1 ... Open

User Access Verification

Password: 
A2>exit

[Connection to 1.1.1.1 closed by foreign host]

在 R1 查看 NAT Table 则看到同一 Inside Global 被转换至不同的 Inside Local。

R1#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
tcp 1.1.1.1:23         192.168.1.10:23    1.1.1.10:57226     1.1.1.10:57226
tcp 1.1.1.1:23         192.168.1.11:23    1.1.1.10:32916     1.1.1.10:32916