CONE NAT 和 Symmetric NAT


1. NAT 的划分

RFC3489 中将 NAT 的实现分为四大类:

1. Full Cone NAT                          完全锥形 NAT

2. Restricted Cone NAT                 限制锥形 NAT (可以理解为 IP 限制)

3. Port Restricted Cone NAT          端口限制锥形 NAT  IP+Port 限制)

4. Symmetric NAT                        对称 NAT

其中完全锥形的穿透性最好,而对称形的安全性最高


******概念******

Full cone NAT,亦即著名的一对一(one-to-one)NAT

  • 一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。任意外部主机都能通过给eAddr:port2发包到达iAddr:port1

Address-Restricted cone NAT,受限锥形NAT

  • 一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。任意外部主机(hostAddr:any)都能通过给eAddr:port2发包到达iAddr:port1的前提是:iAddr:port1之前发送过包到hostAddr:any. "any"也就是说端口不受限制

Port-Restricted cone NAT,端口受限锥形NAT

类似受限制锥形NAT(Restricted cone NAT),但是还有端口限制。

  • 一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。一个外部主机(hostAddr:port3)能够发包到达iAddr:port1的前提是:iAddr:port1之前发送过包到hostAddr:port3.

Symmetric NAT(对称NAT)

  • 每一个来自相同内部IP与端口,到一个特定目的地地址和端口的请求,都映射到一个独特的外部IP地址和端口。

同一内部IP与端口发到不同的目的地和端口的信息包,都使用不同的映射

  • 只有曾经收到过内部主机数据包的外部主机,才能够把数据包发回

 


 

1.1 锥形NAT与对称NAT的区别

所谓锥形NAT 是指:只要是从同一个内部地址和端口出来的包,无论目的地址是否相同,NAT 都将它转换成同一个外部地址和端口。

 

“同一个外部地址和端口”与“无论目的地址是否相同”形成了一个类似锥形的网络结构,也是这一名称的由来。

 

反过来,不满足这一条件的即为对称NAT 。

 

1.2 举例说明

假设:

  1. NAT 内的主机 A  IP 记为 A ,使用端口 1000
  2. NAT 网关     :   IP 记为 NAT ,用于 NAT 的端口池假设为( 5001-5999 
  3. 公网上的主机 B  IP 记为B ,开放端口 2000
  4. 公网上的主机 C    IP 记为C ,开放端口 3000

假设主机 A 先后访问主机 B  C

 

1 )如果是锥形 NAT 


那么成功连接后,状态必然如下:

A  1000  —— >  NAT  5001 )—— >  B  2000 

A  1000  —— >  NAT  5001 )—— >  C  3000 

也就是说,只要是从 A 主机的 1000 端口发出的包,经过地址转换后的源端口一定相同。

2 )如果是对称形 NAT 

连接后,状态有可能(注意是可能,不是一定)如下:

A  1000  —— >  NAT  5001 )—— >  B  2000 

A  1000  —— >  NAT  5002 )—— >  C  3000 

两者的区别显而易见。

 

1.3 三种CONE NAT之间的区别

仍然以上面的网络环境为例, 假设 A 先与 B 建立了连接:

A  1000  —— >  NAT  5001 )——— >  B  2000 

 

1) Port Restricted Cone NAT:

只有 B  2000 )发往 NAT  5001 )的数据包可以到达 A  1000 

===========================================================

B  2000  —— >  NAT  5001  ——— >   A  1000 

B  3000  —— >  NAT  5001   X  >   A  1000 

C  2000  —— >  NAT  5001   X  >   A  1000 

 

2) Restricted Cone NAT

只要是从 B 主机发往 NAT  5001 )的数据包都可以到达 A  1000 

==========================================================

B  2000  —— >  NAT  5001  ——— >   A  1000 

B  3000  —— >  NAT  5001  ——— >   A  1000 

C  2000  —— >  NAT  5001   X  >   A  1000 

 

3) Full Cone NAT

任意地址发往 NAT  5001 )的数据包都可以到达 A  1000 

==========================================================

B  2000  —— >  NAT  5001  ——— >   A  1000 

B  3000  —— >  NAT  5001  ——— >   A  1000 

C  3000  —— >  NAT  5001  ——— >   A  1000 

 

2. Linux的NAT

Linux的NAT“MASQUERADE”属于对称形NAT。

 

说明这一点只需要否定 MASQUERADE 为锥形 NAT 即可。

 

Linux 在进行地址转换时,会遵循两个原则:

  1. 尽量不去修改源端口,也就是说,ip 伪装后的源端口尽可能保持不变。
  2. 更为重要的是,ip 伪装后必须 保证伪装后的源地址/ 端口与目标地址/ 端口(即所谓的socket )唯一。

假设如下的情况( 内网有主机 A  D ,公网有主机 B  C ):

先后 建立如下三条连接:

  1. A  1000  —— >  NAT  1000 )—— >  B  2000 
  2. D  1000  —— >  NAT  1000 )—— >  C  2000 
  3. A  1000  —— >  NAT  1001 )—— >  C  2000 

可以看到,前两条连接遵循了原则 1 ,并且不违背原则 2

而第三条连接为了避免与第二条产生相同的 socket 而改变了源端口

比较第一和第三条连接,同样来自 A(1000) 的数据包在经过 NAT 后源端口分别变为了 1000  1001。说明 Linux  NAT 是对称 NAT 

 

3. 对协议的支持

CONENAT 要求原始源地址端口相同的数据包经过地址转换后,新源地址和端口也相同,换句话说,原始源地址端口不同的数据包,转换后的源地址和端口也一定不同。

 

那么,是不是 Full Cone NAT 的可穿透性一定比 Symmetric NAT 要好呢,或者说,通过 Symmetric NAT 可以建立的连接,如果换成 Full Cone NAT 是不是也一定能成功呢?

 

假设如下的情况:

内网有主机A和D,公网有主机B和C,某 UDP 协议服务端口为 2000 ,并且要求客户端的源端口一定为 1000  

1)如果A使用该协议访问B:

A  1000  —— >  NAT  1000 )——— >  B  2000 

由于 Linux 有尽量不改变源端口的规则,因此在 1000 端口未被占用时,连接是可以正常建立的

如果此时D也需要访问B:

D  1000  —— >  NAT  1001 )—X— >   B  2000 

端口必须要改变了,否则将出现两个相同的 socket ,后续由 B(2000) 发往NAT( 1000 )的包将不知道是转发给A还是D。

 

于是B将因为客户端的源端口错误而拒绝连接。

 

在这种情况下, MASQUERADE  CONENAT 的表现相同。

 

2)如果A连接B后,D也像C发起连接,而在此之后,A又向C发起连接

              A  1000  —— >  NAT  1000 )——— >  B  2000 

如果是 MASQUERADE 

              D  1000  —— >  NAT  1000 )——— >  C  2000 

              A  1000  —— >  NAT  1001 )—X— >  C  2000 

如果是 CONENAT 

              D  1000  —— >   NAT  1001 )—X— >  C  2000 

              A  1000  —— >  NAT  1000 )——— >  C  2000 

对于 MASQUERADE 来说,只要在没有重复的 socket 的情况下,总是坚持尽量不改变源端口的原则,因此第二条连接仍然采用源端口 1000 ,而第三条连接为了避免重复的 socket 而改变了端口。

 

对于 CONENAT ,为了保证所有来自 A(1000) 的数据包均被转换为 NAT(1000) ,因此 D 在向 C 发起连接时,即使不会产生重复的 socket ,但因为 NAT  1000 端口已经被 A(1000) “占用”了,只好使用新的端口。

 

可以看出,不同的 target 产生不同的结果。我们也不能绝对的说,在任何时候,全锥形 NAT 的可穿透性都比对称 NAT 要好,比如上面的例子,如果只存在连接①和②,显然是对称形 NAT 要更适用。

 

因此,选择哪种 NAT ,除了对网络安全和普遍的可穿透性的考虑外,有时还需要根据具体应用来决定。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值