2022-01-27 · 5

关于 NAT

network

这篇文章发布已超过两年,内容可能已过时。

NAT

从内部网络往外走时,把内部 IP 地址转换成另一个 IP 再出去。

① 静态 NAT:预先把源和目的的 IP 映射固定下来的 NAT

② 动态 NAT:源和目的都不预先确定的 NAT

为什么会出现?

是因为 IPv4 枯竭问题和私有网。 目前用于互联网地址的 IPv4 大约能分配 42 亿个地址。但这远不及全球的 IP 需求,越往后 IP 枯竭问题就越被提起。为解决这个问题出现了 IPv6,用它能一举解决 IP 枯竭问题,但似乎因成本问题一直没有替换。最关键的还是因为私有网 - 公有网的概念。

在家里或公司上网时,会从 ISP 处获得一个全球唯一的公网 IP。实际的 PC 各自持有私有 IP,连接外部网即互联网时,通过路由器的 NAT 技术把各私有 IP 转换成公网 IP。也就是说,一份 IP 被多台共享使用。

IANA(Internet Assigned Numbers Authority)预留了以下 IP 地址块用作私有 IP 地址

⊙ 10.0.0.0 ~ 10.255.255.255.255

⊙ 172.16.0.0 ~ 172.31.255.255.255

⊙ 192.168.0.0 ~ 192.168.255.255

这些是 ISP 为识别互联网用户的本地网络而提供的公网 IP 地址

⊙ 0.0.0.0 ~ 127.255.255.255

⊙ 128.0.0.0 ~ 191.255.255.255

⊙ 192.0.0.0 ~ 233.255.255.255

⊙ 224.0.0.0 ~ 239.255.255.255

⊙ 240.0.0.0 ~ 255.255.255.255

私有网向外发包时,路由器会把私有 IP 换成公网 IP 再发,因此对响应包会查询转换记录再交回原主机。但从外部只能把目的地址指定到路由器为止,所以运行一个外部无法访问的私有网在安全上也很出色。

静态 NAT

拓扑

NAT Static

给 PC0 ~ PC2 填入 192.168.10.1 ~ 192.168.10.3,然后在路由器上开始配置。

Router(config)#int g0/0
Router(config-if)#no shut
Router(config-if)#ip add 192.168.10.254 255.255.255.0
Router(config-if)#ip nat inside
Router(config-if)#exit
Router(config)#int se0/0/0
Router(config-if)#no shut
Router(config-if)#ip add 200.1.1.254 255.255.255.0
Router(config-if)#ip nat outside

在 Router0 上给 Gig0/0 赋 IP(gateway)并输入 ip nat inside。给 Se0/0/0 输入 IP 和 ip nat outside。由于 Gig0/0 是从内往外走的 IP,所以写 inside。出去的地方当然写 outside。

Router(config)#ip nat inside source static 192.168.10.1 200.1.1.1
Router(config)#ip nat inside source static 192.168.10.2 200.1.1.2
Router(config)#ip nat inside source static 192.168.10.3 200.1.1.3

按内部 IP(192.168.10.1)→ 外部 IP(200.1.1.1)这样做映射。

Router(config)#do sh ip nat trans
Pro  Inside global     Inside local       Outside local      Outside global
---  200.1.1.1         192.168.10.1       ---                ---
---  200.1.1.2         192.168.10.2       ---                ---
---  200.1.1.3         192.168.10.3       ---                ---

用 [do] sh ip nat trans 可以查看。接着只给 Router1 分配 IP。

Router(config)#int se0/0/1
Router(config-if)#ip add 200.1.1.253 255.255.255.0

从 PC 向 Router1 打个 ping 吧。

NAT: s=192.168.10.1->200.1.1.1, d=200.1.1.253 [42]
NAT*: s=200.1.1.253, d=200.1.1.1->192.168.10.1 [26]

可以看到正常转换并送达。[ 命令:在路由器上 debug ip nat ]

动态 NAT

拓扑

NAT dynamic

和静态 NAT 时一样,在 Gig0/0 输入 inside、se0/0/0 输入 outside。然后配置 access list(ACL)即可。

Router(config)#access-list 10 permit 192.168.10.0 0.0.0.255

access-list [列表号] permit [私有 IP 网络地址] [通配符掩码]

通配符掩码就是把普通 netmask 反着写。255.255.255.0 → 0.0.0.255 这样两者作用相同,但子网掩码是为了分离网络和主机地址而设计,只能用连续的比特;而通配符掩码即使不连续也能用,这是它的特点。

access-list 是访问路由器的私有 IP 列表。从 192.168.10.0 网段开始,对持有该网络地址的所有私有 IP 动态分配公网 IP,用完后回收再用于别处。这样即使有新 PC 进来也会自动分配,是非常方便的功能。

Router(config)#ip nat pool Sunrin1 200.1.1.1 200.1.1.10 netmask 255.255.255.0
Router(config)#ip nat inside source list 10 pool Sunrin1

创建从 200.1.1.1 到 200.1.1.10 的公网 IP 池,并把它附加到将要使用它的列表 10 上。

Router(config)#do sh ip nat trans
Pro  Inside global     Inside local       Outside local      Outside global
icmp 200.1.1.1:5       192.168.10.1:5     200.1.1.253:5      200.1.1.253:5
icmp 200.1.1.1:6       192.168.10.1:6     200.1.1.253:6      200.1.1.253:6
icmp 200.1.1.1:7       192.168.10.1:7     200.1.1.253:7      200.1.1.253:7

从 PC 发 ping 时,可以确认已分配了 IP。

PAT

拓扑

PAT

和动态 NAT 一样,配置 access list(ACL)。

Router(config)#access-list 10 permit 192.168.10.0 0.0.0.255

接着配置 PAT。

Router(config)#ip nat inside source list 10 interface se0/0/0 overload
Router#sh ip nat trans
Pro  Inside global     Inside local       Outside local      Outside global
icmp 200.1.1.254:36    192.168.10.1:36    200.1.1.253:36     200.1.1.253:36
icmp 200.1.1.254:37    192.168.10.1:37    200.1.1.253:37     200.1.1.253:37
icmp 200.1.1.254:38    192.168.10.1:38    200.1.1.253:38     200.1.1.253:38
icmp 200.1.1.254:39    192.168.10.1:39    200.1.1.253:39     200.1.1.253:39

配置 PAT 时把 192.168.10.0 私有网络挂到了路由器接口上,所以出去时 Inside global 会带上接口地址 200.1.1.253。而且出去再回来时,路由器会看端口号确认原始源在哪里再转交。端口号有足够多。


原文(韩语): tistory — 发布于 2022-01-27,已迁移至本博客。本翻译由 AI 协助完成。

评论

删除这条评论?

相关文章

关于 NAT · 나봄하랑