Network Address Translation (NAT) 网路位址转换

前言

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

相關主題

发表回复

2021-07-22

Posted In: 网络服务 Services

Leave a Comment