CONE NAT 和 Symmetric NAT
CONE NAT 和 Symmetric NAT
1. NAT 的划分
- RFC3489 中将 NAT 的实现分为四大类:
- Full Cone NAT 完全锥形 NAT
- Restricted Cone NAT 限制锥形 NAT (可以理解为 IP 限制)
- Port Restricted Cone NAT 端口限制锥形 NAT ( IP+Port 限制)
- Symmetric NAT 对称 NAT
其中完全锥形的穿透性最好,而对称形的安全性最高
1.1 锥形NAT与对称NAT的区别
所谓锥形NAT 是指:只要是从同一个内部地址和端口出来的包,无论目的地址是否相同,NAT 都将它转换成同一个外部地址和端口。
“同一个外部地址和端口”与“无论目的地址是否相同”形成了一个类似锥形的网络结构,也是这一名称的由来。反过来,不满足这一条件的即为对称NAT 。
1.2 举例说明
假设:
NAT 内的主机 A : IP 记为 A ,使用端口 1000
NAT 网关 : IP 记为 NAT ,用于 NAT 的端口池假设为( 5001-5999 )
公网上的主机 B : IP 记为B ,开放端口 2000
公网上的主机 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 在进行地址转换时,会遵循两个原则:
- 尽量不去修改源端口,也就是说,ip 伪装后的源端口尽可能保持不变。
- 更为重要的是,ip 伪装后必须 保证伪装后的源地址/ 端口与目标地址/ 端口(即所谓的socket )唯一。
假设如下的情况( 内网有主机 A 和 D ,公网有主机 B 和 C ):
先后 建立如下三条连接:
A ( 1000 ) —— > NAT ( 1000 )—— > B ( 2000 )
D ( 1000 ) —— > NAT ( 1000 )—— > C ( 2000 )
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 ,除了对网络安全和普遍的可穿透性的考虑外,有时还需要根据具体应用来决定。
原文出处:http://blog.csdn.net/ojhsky/article/details/6011232
Nat的类型——Cone Nat、Symmetic Nat
Nat共分为四种类型:
- 1.Full Cone Nat
- 2.Restriced Cone Nat
- 3.Port Restriced Cone Nat
- 4.Symmetric Nat
Symmetric Nat 与 Cone Nat的区别
- 1.三种Cone Nat同一主机,同一端口会被映射为相同的公网IP和端口
- 2.Symmetric Nat只有来自同一主机,同一端口发送到同一目的主机、端口,映射的公网IP和端口才会一致
一、Full Cone Nat
该nat 将内网中一台主机的IP和端口映射到公网IP和一个指定端口,外网的任何主机都可以通过映射后的IP和端口发送消息
例如:主机A(192.168.0.123:4000)访问主机B,A的IP将会被映射为(222.123.12.23:50000);
当主机A使用4000端口访问主机C时,同样会被映射为(222.123.12.23:50000);而且此时任何主机C 、D·····(包含主机A未访问过的主机)都可以使用(222.123.12.23:50000)访问到主机A(192.168.0.123:4000)。
二、Restriced Cone Nat
该nat 将内网中一台主机的IP和端口映射到公网IP和一个指定端口,只有访问过的IP可以通过映射后的IP和端口连接主机A
例如:主机A(192.168.0.123:4000)访问主机B(223.124.34.23:9000),A的IP将会被映射为(222.123.12.23:50000);
此时只有Ip为(223.124.34.23)才能通过(222.123.12.23:50000)连接主机A。
三、Port Restriced Cone Nat
该nat 将内网中一台主机的IP和端口映射到公网IP和一个指定端口,只有访问过的IP和端口可以通过映射后的IP和端口连接主机A
例如:主机A(192.168.0.123:4000)访问主机B(223.124.34.23:9000),A的IP将会被映射为(222.123.12.23:50000);
此时只有Ip为(223.124.34.23:9000)才能通过(222.123.12.23:50000)连接主机A。
四、Symmetric Nat
当主机A(192.168.0.123:4000)访问主机B(223.124.34.23:9000),A的IP被映射为(222.123.12.23:50000)后,并将这三个IP、端口进行绑定;
等到主机A(192.168.0.123:4000)访问主机C时,可能(注意是可能,也有可能会不变)会被映射为(222.123.12.23:60010),然后又会将这三个IP、端口绑定;
CONE NAT 和 Symmetric NAT的更多相关文章
- Linux 与 CONE NAT 和 Symmetric NAT
http://alexanderlaw.blog.hexun.com/31883661_d.html 1. NAT 的划分 RFC3489 中将 NAT 的实现分为四大类: 1. Full Cone ...
- NAT and Traversal NAT(TURN/STUN/ICE)
http://www.cnblogs.com/whyandinside/archive/2010/12/08/1900492.html -------------------------------- ...
- NAT原理与NAT穿越
最近在看东西的时候发现很多网络程序中都需要NAT穿越,特意在此总结一下. 先做一个约定: 内网A中有:A1(192.168.0.8).A2(192.168.0.9)两用户 网关X1(一个NAT设备)有 ...
- 静态NAT、动态NAT
静态NAT.动态NAT 实验拓扑: 实验目的:熟悉网络地址转换协议 掌握静态NAT 和动态NAT的配置 分析静态NAT 和动态NAT的区别 使用show命令来检查NAT的运行情况 实验要求:按拓扑图来 ...
- 运营商级NAT(Carrier-grade NAT)
运营商级NAT(Carrier-grade NAT) 运营商级(Carrier-grade)NAT,是用于缓解是IPV4地址枯竭的一种方法,通过这种方法,原来被分配公网ip的端点.家庭网络等可以被 ...
- 什么叫NAT,设置NAT的两个方法
NAT是网络地址翻译就是把公网IP翻译成私有地址, 又叫端口映射或端口转发. 采用路由方式是指ADSL拥有一个动态或固定的公网IP,ADSL直接接在HUB或交换机上,所有的电脑共享上网.这时ADSL的 ...
- 静态NAT、动态NAT、PAT(端口多路复用)的配置
静态NAT.动态NAT.PAT(端口多路复用)的配置 NAT的实现方式有三种,即静态转换Static Nat.动态转换Dynamic Nat 和 端口多路复用OverLoad. 静态转换 ( ...
- NAT与FULL NAT的区别
LVS 当前应用主要采用 DR 和 NAT 模式,但这 2 种模式要求 RealServer 和 LVS在同一个 vlan中,导致部署成本过高:TUNNEL 模式虽然可以跨 vlan,但RealSer ...
- iptables nat 外网nat到内网在只限制外网访问的单一ip地址
166 /etc/init.d/iptables start 167 iptables -I INPUT -s 192.168.10.0/24 -p tcp -j ACCEPT 168 /etc/in ...
随机推荐
- scala分析数据作图
参考网址:https://stackoverflow.com/questions/36984780/spark-shell-how-to-use-breeze-viz 刚开始按照网上的教程只导入了 两 ...
- 【WP8】扩展CM的INavigationService方法
CM支持通过ViewModel进行导航,并通过支持参数传递,但是内部只是通过反射的方式构造Uri的参数进行导航,所以只支持简单类型的参数传递,下面对其进行扩展,在页面导航时支持复杂类型的参数传递,并扩 ...
- Alcatraz插件管理器
下载地址:https://github.com/supermarin/Alcatraz 虽然能用Alcatraz插件管理器进行管理,但它有时有些插件并不是最新版本,特别是在Xcode更新版本时.这里有 ...
- UNIX环境编程学习笔记(27)——多线程编程(二):控制线程属性
lienhua342014-11-09 1 线程属性概括 POSIX 线程的主要属性包括 scope 属性.detach 属性.堆栈地址.堆栈大小.优先级.在头文件 pthread.h 中定义了结构体 ...
- springboot+mybatis集成多数据源MySQL/Oracle/SqlServer
日常开发中可能时常会遇到一些这样的需求,业务数据库和第三方数据库,两个或多个数据库属于不同数据库厂商,这时候就需要通过配置来实现对数据库实现多源处理.大致说一下我的业务场景,框架本身是配置的sprin ...
- Fedora 安装oracle11g 之最简洁方式
最新的Fedora 24已经释出. 赶紧尝试安装oracle11g一把.很简单,很方便. 此处以最最简洁方式来安装一把! 环境: windows xp + virtualbox ,安装 fedora ...
- mysql初始化时报错bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory的处理
问题描述: 今天新安装了一个linux虚拟机,然后安装mysql 5.7.21,在进行初始化的时候,报错 bin/mysqld: error : cannot open shared object f ...
- Ognl_JSTL_学习笔记
控制标签 使用Struts2标签必须先导入标签库,在页面使用如下代码导入Struts2标签:<%@taglib prefix="s" uri="/struts-ta ...
- mysql 查询锁表
1)使用情景“判断通过后写入数据库”,这个一般是不会有问题的, 但并发访问的时候就不太好搞.因为写入(insert)是需要时间的,假设现在有两个并发请求,(假设第一个访问是最后一个符合条件的写入请求, ...
- 我的WAF Bypass实战系列
梳理了一下自己写过的WAF Bypass相关的文章,按照编写时间顺序,整理成了一个WAF Bypass实战系列,如果你准备了解WAF攻防这一块的内容,可以来了解一下. 第一篇:<Bypass ...