Linux 与 CONE NAT 和 Symmetric NAT
2015-08-21 16:07
267 查看
http://alexanderlaw.blog.hexun.com/31883661_d.html
1. Full Cone NAT 完全锥形 NAT
2. Restricted Cone NAT 限制锥形 NAT (可以理解为 IP 限制)
3. Port Restricted Cone NAT 端口限制锥形 NAT ( IP+Port 限制)
4. Symmetric NAT 对称 NAT
其中完全锥形的穿透性最好,而对称形的安全性最高
“同一个外部地址和端口”与“无论目的地址是否相同”形成了一个类似锥形的网络结构,也是这一名称的由来。
反过来,不满足这一条件的即为对称NAT 。
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
,除了对网络安全和普遍的可穿透性的考虑外,有时还需要根据具体应用来决定。
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 举例说明
假设: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
,除了对网络安全和普遍的可穿透性的考虑外,有时还需要根据具体应用来决定。
相关文章推荐
- 到目前为止,Linux下最完整的Samba服务器配置攻略 (转)
- CentOS6.5下RPM方式安装MySQL5.6
- Linux 查看文件和文件夹大小
- Linux 安装python爬虫框架 scrapy
- Linux 安装python爬虫框架 scrapy
- 大话Linux内核中锁机制之原子操作、自旋锁
- linux下rsync增量同步方法
- Linux 错误:fatal error: uuid/uuid.h: No such file or directory
- CentOS 6.5 Git源码安装
- CentOS 打开mysql 3306端口
- centos如何给用户提权到root
- Note For Linux By Jes(4)-文件的压缩与打包
- 【转载】Linux下SVN 检出windows SVN服务器上的项目出错:SSL handshake failed
- Linux常用命令
- linux 统计 程序运行时间
- Note For Linux By Jes(3)-Linux文件与目录管理
- Linux安装SVN服务器
- CentOS yum 源的配置与使用
- Linux 的./configure,make,make install的作用
- linux 获取bitbucket代码