http://alexanderlaw.blog.hexun.com/31883661_d.html

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

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

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->端口限制锥形 NAT ( IP+Port 限制) :

只有 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 ->限制锥形 NAT (可以理解为 IP 限制)

只要是从 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 ,除了对网络安全和普遍的可穿透性的考虑外,有时还需要根据具体应用来决定。

Linux 与 CONE NAT 和 Symmetric NAT的更多相关文章

  1. CONE NAT 和 Symmetric NAT

    CONE NAT 和 Symmetric NAT 1. NAT 的划分 RFC3489 中将 NAT 的实现分为四大类: Full Cone NAT 完全锥形 NAT Restricted Cone ...

  2. NAT and Traversal NAT(TURN/STUN/ICE)

    http://www.cnblogs.com/whyandinside/archive/2010/12/08/1900492.html -------------------------------- ...

  3. 虚拟机Linux与本地虚拟网卡配置---NAT链接方式

    虚拟机Linux与本地虚拟网卡配置---NAT链接方式 **********这是我亲自尝试多次实践出来的结果,不是复制粘贴************************* 首先进行初始化,这样避免有 ...

  4. NAT原理与NAT穿越

    最近在看东西的时候发现很多网络程序中都需要NAT穿越,特意在此总结一下. 先做一个约定: 内网A中有:A1(192.168.0.8).A2(192.168.0.9)两用户 网关X1(一个NAT设备)有 ...

  5. 静态NAT、动态NAT

    静态NAT.动态NAT 实验拓扑: 实验目的:熟悉网络地址转换协议 掌握静态NAT 和动态NAT的配置 分析静态NAT 和动态NAT的区别 使用show命令来检查NAT的运行情况 实验要求:按拓扑图来 ...

  6. 运营商级NAT(Carrier-grade NAT)

    运营商级NAT(Carrier-grade NAT)   运营商级(Carrier-grade)NAT,是用于缓解是IPV4地址枯竭的一种方法,通过这种方法,原来被分配公网ip的端点.家庭网络等可以被 ...

  7. 什么叫NAT,设置NAT的两个方法

    NAT是网络地址翻译就是把公网IP翻译成私有地址, 又叫端口映射或端口转发. 采用路由方式是指ADSL拥有一个动态或固定的公网IP,ADSL直接接在HUB或交换机上,所有的电脑共享上网.这时ADSL的 ...

  8. 静态NAT、动态NAT、PAT(端口多路复用)的配置

    静态NAT.动态NAT.PAT(端口多路复用)的配置   NAT的实现方式有三种,即静态转换Static Nat.动态转换Dynamic Nat 和 端口多路复用OverLoad.    静态转换 ( ...

  9. linux网络连接--桥接bridge,NAT,host-only的区别

    linux网络连接主要分为三种:桥接,net,host_only 桥接使用的是真实网卡,电脑里面有两种真实网卡,有线网卡,无线网卡,当你使用的是无线连接, 则选择无线网卡,使用网线连接,则选择有线网卡 ...

随机推荐

  1. word2007中如何隐藏工具栏

    1.对于屏幕较小的用户来说,编辑时可能需要隐藏word上方的工具栏,具体操作如下:

  2. 评价正在使用输入法软件产品----QQ拼音输入法

    评价一下大家手头正在使用输入法或者搜索类的软件产品. 我现在使用的是系统自带的QQ拼音输入法,以前使用的是搜狗拼音输入法,后来发现可能由于我的系统重装过好几次,搜狗输入法也重装了好几次,而每次都删不干 ...

  3. Spring事务总结

    事务是什么? 事务就是用来解决类似问题,事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败,那么事务就会回滚到最开始的状态,仿佛什么都没有发生过.在企业级应 ...

  4. android 怎么动态设置button 的style

    网上找了很多,还是没有直接的解决办法,button没有setstyle这个方法.因此我的解决办法如下: 直接动态设置各个属性 Button themeBtn = new Button(this); t ...

  5. 使用 NIO.2 遍历目录下所有的Java文件

    package wellGrounded; import java.io.IOException; import java.nio.file.FileVisitResult; import java. ...

  6. vmware workstation 10.0

    2013.9.3 vmware workstation 10.0 build 1295980新增功能– 可以将windows 8.1物理pc转变为虚拟机:unity模式增强,与windows 8.1 ...

  7. Java Applet使用

    问题描述:       Java Applet使用   参考资料:      http://docs.oracle.com/javase/tutorial/deployment/applet/depl ...

  8. 【BZOJ】【2005】【NOI2010】能量采集

    欧拉函数 玛雅,我应该先看看JZP的论文的……贾志鹏<线性筛法与积性函数>例题一 这题的做法……仔细想下可以得到:$ans=2*\sum_{a=1}^n\sum_{b=1}^m gcd(a ...

  9. java 验证身份证号

  10. Winform跨线程操作界面的策略

    BeginInvoke(new ThreadStart(() => toolStripButton1.Text = "aaa")); 1.非跨线程操作和部分跨线程get不会引 ...