目錄
前言
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)。
设定 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 与 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。
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。
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 转换如下图。
设定上只要加一个 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。
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
相關主題
Jan Ho 2021-07-22
Posted In: 网络服务 Services
发表回复