现在的位置: 首页 > 综合 > 正文

Linux 与 CONE NAT 和 Symmetric NAT .

2012年07月24日 ⁄ 综合 ⁄ 共 3075字 ⁄ 字号 评论关闭

转自: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:

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

 

抱歉!评论已关闭.