michael9

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 映射的数量,也可分为两种:

  • 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.)

而源于外部的设备,想和内部网络的设备通信。就需要将外部网络的数据包中的源地址(Outside Global)和 目的地址(Inside Global)转换成内网的源地址(Outside Local)和目的地址(Inside Local.)

场景1:内网设备访问公网

内网主机 IP - 10.10.10.1 想要和公网主机 171.16.68.1 通信,该过程也称 SNAT。

数据包从内部网络发往外部网络时,经由 NAT 配置,将源 IP 由 Inside local - 10.10.10.1 替换为外网地址 171.16.68.5.

数据包从外网发往内部网络时,经由 NAT 配置,将目的 IP 由 Inside global - 171.16.68.5 替换为内网地址 10.10.10.1.

Outside 部分没有发生变化。

具体配置时,要将 Inside Local 转换为 Inside Global,需要使用 ip nat inside 命令。

场景2:外网设备访问内网中服务

如果外网设备想要和内网中服务进行通信,称为 DNAT.

数据包从外部发往内部时,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 命令。

同时设置 SNAT 和 DNAT

在同时配置,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 配置

配置流程:

  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
!
interface Loopback1
 ip address 192.168.2.1 255.255.255.0
!
interface Ethernet0/0
 ip address 12.1.1.1 255.255.255.0
# 默认路由
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
!
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
!
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
!
interface Ethernet0/0
 ip address 23.1.1.2 255.255.255.0
!
router eigrp 100
 network 3.3.3.0 0.0.0.255
 network 23.1.1.0 0.0.0.255
!

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 实际举例

分类:

技术点:

相关文章: