NAT - 网络地址转换
NAT 出现的背景
我们知道,一般在公司内部都使用私有地址进行通信。但由于私有地址只能在局域网中传输,如果想要外网上传输就需要公有地址。通常来说采用如下的架构,在出口路由器上配置一个公有 IP 和 ISP 的入口相连。
如果公司内部的设备想要和外网进行通信,就通过 R1 将私有 IP 转换成公有 IP 进行访问。这个转换的技术就称为 NAT - 网络地址转换,让内部的网络共享一个或多个公网地址和互联网通信。
NAT 解决的问题:
-
通过 NAT 技术,可以让 LAN 中拥有私有 IP 的设备共享一个或多个公有 IP 进行通信,这就有效解决了 IP 地址不足的问题。
-
由于在内网中,一个公有 IP 可以对应多个私有 IP。相当于把内网的设备很好的隐藏起来,起到一定安全防护的作用。
NAT 类型
NAT 按照 IP 映射模式,可分为两种:
-
基础 NAT:映射时仅转化 IP,不映射端口。
-
PAT:在映射 IP 同时,还映射端口。
- 用于节省公有 IP 的数量,可以将多个私有地址,对应一个公有地址使用。
按照 IP 映射的数量,也可分为两种:
-
Static NAT:一对一地址转换,一个私有对一个公有
-
Dynamic NAT:
- 多对多地址转换,一组私有对一组公有。
- 多对一地址转换,如 PAT.
NAT 原理
Local 地址:转换前的私有地址
Global 地址:转换后的公有地址
如果以出口路由器为视角,和内部相连的称为 Inside 区域,和 ISP 相连称为 Outside 区域。
则目前看共有四个 IP:
类型 | 描述 |
---|---|
Inside Local | 内部转换前的私有地址,一般配置在内部网络中 |
Inside Global | 内部转换后的公有地址 |
Outside Local | 在内部网络中表示外部公有地址的内部地址,不一定是公有地址,可是内部网络被路由就行 |
Outside Global | 外部网络中定义的公有地址 |
简单来说,Local 地址指的就是内部网络中(局域网)出现的地址,而 Global 地址指的就是在公网中出现的地址。
至于为什么要分成四种情况,这是因为想实现的场景不同。
源于内部网络的设备想和公有网络的设备通信。就需要内部网络的数据包中的源地址(Inside Local)和 目的地址(Outside Local)转换成公网的源地址(Inside Global)和目的地址(Outside Global.)
同样某些情况下,比如内网不支持访问公有 ip. 源于外部的设备想和内部网络的设备通信。就需要将外部网络的数据包中的源地址(Outside Global)和 目的地址(Inside Global)转换成内网的源地址(Outside Local)和目的地址(Inside Local.)
场景1:改变 inside 地址,实现内网和外网之间的通信。
内网主机 IP - 10.10.10.1 想要和公网主机 171.16.68.1 通信。
数据包从内部网络发往外部网络时,经由 NAT 配置,将源 IP 由 Inside local - 10.10.10.1 替换为外网地址 171.16.68.5. 改过程也被称为 SNAT.
数据包从外网发往内部网络时,经由 NAT 配置,将目的 IP 由 Inside global - 171.16.68.5 替换为内网地址 10.10.10.1. 也被称为 DNAT.
Outside 部分没有发生变化。
具体配置时,要将 Inside Local 转换为 Inside Global,需要使用 ip nat inside
命令。
场景2:改变 outside,内网设备访问外网的服务,但是使用内网 iP.
数据包从外部发往内部时,Outside global - 171.16.68.1 变为内网 10.10.10.5.
数据包从内部发往外部时,Outside local - 10.10.10.5 变为外网 171.16.68.1.
想要将 Outside Global 转换为 Inside Global 需要使用 ip nat outside
命令。
场景3,同时设置 inside 和 outside
在同时配置,inside 和 outside 的情况下:
源和目的地址全由私有地址转换为公有地址进行通信。
以 Inside 的过程举例:
数据包始发方向:是将 Inside Local 转换为 Inside Global 地址。
数据包接受方向:将 Inside Global 装换为 Inside Local.
转换方式:
Inside Local -> Inside Global: 从内部到外部
ip nat inside source
Inside Global -> Inside Local: 从外部到内部
ip nat inside destination
数据包进入接口检查流程:
- 先检查 ACL
- 查路由表
- NAT 转换
- 查路由表(将 Outside Global 转换成 Outside Local,会有该步骤)
出接口过程:
- 先检查 ACL
- 查 NAT
- 查路由表
NAT Trade-off
优点:
- 节约了公网地址
- 为内部网络编制提供了一致性,在没有 NAT 和私有地址前,更改公有 IP 地址需要给现有网络所有主机重新编号,成本很高。NAT 允许保留现有方案,同时只会新的公有地址编址方案。
- 提供了安全性(因为在公网视角,并不知道公司局域网内部的 NAT 转换前的地址)
缺点:
- 有一定性能的损失,转换每个 IP 包头需要时间。
- 缺失了端到端的连接,很多应用依赖端到端功能,需要将未被修改的数据包从源发给目的。这时一些安全应用,由于内部的签名,会因为改变源 IP 而失败。
- 隧道技术变得更难配置,因为 NAT 改变了报头值,影响了隧道协议的完整性检测。
- TCP 内部可能中断(校验和可能不通过)
NAT 配置
inside 配置,使用内网 IP 访问外网数据
配置流程:
- 确定 inside 和 outside
- 确定 inside local 地址
- 确定 outside global 地址
- 配置
实现效果:
R1 表示内网,有 192.168.1.0 和 2.0 网段,配置默认路由将其数据包发给 R2.
R2 上开启静态路由到 192.168.1.0 和 2.0 网段,模拟内网情况。另外开启 EIGRP 表示和外网通信,注意这里仅仅宣告 e0/1 23.1.1.0 所在网络。
R3 表示外网,配置 3.3.3.0 和 23.1.1.0 网络,纳入 EIGRP.
目前看 R1 ping 3.3.3.3 网络并不能通信(因为在 R3 没有去往 192.168.1.0 和 2.0 的路由),但可在 R2 上配置 NAT 进行转换。
Static 配置:一对一转换
# R1
interface Loopback0
ip address 192.168.1.1 255.255.255.0
no shutdown
!
interface Loopback1
ip address 192.168.2.1 255.255.255.0
no shutdown
!
interface Ethernet0/0
ip address 12.1.1.1 255.255.255.0
no shutdown
# 默认路由
ip route 0.0.0.0 0.0.0.0 12.1.1.2
# R2
# 给公网网段配置一个接口,用于 EIGRP 传递
interface Loopback0
ip address 2.2.2.2 255.255.255.0
no shutdown
!
interface Ethernet0/0
ip address 12.1.1.2 255.255.255.0
no shutdown
ip nat inside
!
interface Ethernet0/1
ip address 23.1.1.1 255.255.255.0
no shutdown
ip nat outside
!
router eigrp 100
network 2.2.2.0 0.0.0.255
network 23.1.1.0 0.0.0.255
!
ip nat inside source static 192.168.1.1 2.2.2.10
ip nat inside source static 192.168.2.1 2.2.2.20
ip route 192.168.1.0 255.255.255.0 12.1.1.1
ip route 192.168.2.0 255.255.255.0 12.1.1.1
!
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- 2.2.2.10 192.168.1.1 --- ---
--- 2.2.2.20 192.168.2.1 --- ---
# R3
!
interface Loopback0
ip address 3.3.3.3 255.255.255.0
no shutdown
!
interface Ethernet0/0
ip address 23.1.1.2 255.255.255.0
no shutdown
!
router eigrp 100
network 3.3.3.0 0.0.0.255
network 23.1.1.0 0.0.0.255
!
在配置后在 R1 的 192.168.1.1 接口 ping R3 的 3.3.3.3 接口,可以发现如下的报文:
R1 eth0 接口:使用 192 作为源地址
R2 eth1 接口:使用 2.2.2.10 作为源地址:
动态 Dynamic 配置:
# R2
!
interface Ethernet0/0
ip address 12.1.1.2 255.255.255.0
ip nat inside
!
interface Ethernet0/1
ip address 23.1.1.1 255.255.255.0
ip nat outside
!
# 声明 local 范围
Router(config)#access-list 10 permit 192.168.1.0 0.0.0.255
Router(config)#access-list 10 permit 192.168.2.0 0.0.0.255
# 声明外网地址范围
Router(config)#ip nat pool dynamic 2.2.2.1 2.2.2.254 netmask 255.255.255.0
# 应用 nat
Router(config)#ip nat inside source list 10 pool dynamic
Router(config)#end
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 2.2.2.1:14 192.168.1.1:14 3.3.3.3:14 3.3.3.3:14
--- 2.2.2.1 192.168.1.1 ---
可见这里由于没有配置 outside,Outside local 和 Outside global 的是一致的。
PAT 配置, 通过端口号区分:
# 声明 local 范围
Router(config)#access-list 10 permit 192.168.1.0 0.0.0.255
Router(config)#access-list 10 permit 192.168.2.0 0.0.0.255
# 应用 nat
Router(config)#ip nat inside source list 10 interface ethernet 0/1 overload
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了