// //
//

Loading

NAT - 网络地址转换

NAT 出现的背景

我们知道,一般在公司内部都使用私有地址进行通信。但由于私有地址只能在局域网中传输,如果想要外网上传输就需要公有地址。通常来说采用如下的架构,在出口路由器上配置一个公有 IP 和 ISP 的入口相连。

如果公司内部的设备想要和外网进行通信,就通过 R1 将私有 IP 转换成公有 IP 进行访问。这个转换的技术就称为 NAT - 网络地址转换,让内部的网络共享一个或多个公网地址和互联网通信。

NAT 解决的问题:

  1. 通过 NAT 技术,可以让 LAN 中拥有私有 IP 的设备共享一个或多个公有 IP 进行通信,这就有效解决了 IP 地址不足的问题。

  2. 由于在内网中,一个公有 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 

数据包进入接口检查流程:

  1. 先检查 ACL
  2. 查路由表
  3. NAT 转换
  4. 查路由表(将 Outside Global 转换成 Outside Local,会有该步骤)

出接口过程:

  1. 先检查 ACL
  2. 查 NAT
  3. 查路由表

NAT Trade-off

优点:

  1. 节约了公网地址
  2. 为内部网络编制提供了一致性,在没有 NAT 和私有地址前,更改公有 IP 地址需要给现有网络所有主机重新编号,成本很高。NAT 允许保留现有方案,同时只会新的公有地址编址方案。
  3. 提供了安全性(因为在公网视角,并不知道公司局域网内部的 NAT 转换前的地址)

缺点:

  1. 有一定性能的损失,转换每个 IP 包头需要时间。
  2. 缺失了端到端的连接,很多应用依赖端到端功能,需要将未被修改的数据包从源发给目的。这时一些安全应用,由于内部的签名,会因为改变源 IP 而失败。
  3. 隧道技术变得更难配置,因为 NAT 改变了报头值,影响了隧道协议的完整性检测。
  4. TCP 内部可能中断(校验和可能不通过)

NAT 配置

inside 配置,使用内网 IP 访问外网数据

配置流程:

  1. 确定 inside 和 outside
  2. 确定 inside local 地址
  3. 确定 outside global 地址
  4. 配置

实现效果:

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

参考

NAT 基础

NAT 实际举例

posted @   来份锅包肉  阅读(1101)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示