1.Nat类型说明:

3种Mapping Behavior (映射规则)和 Filtering Behavior(过滤规则)如下。

Mapping Behavior:

1)Endpoint-Independent Mapping:

对于一个内网的EndpointP,其映射的外网EndpointG是基本固定的,不会随着通信外部主机的不同而变化。

2)Address and Port-Dependent Mapping:

对于一个内网的EndpointP,如果与之通信的外部为EndpointGB1,那么EndpointP就会被NAT映射成EndpointG1;如果与之通信的外部为EndpointGB2,那么EndpointP就会被NAT映射成EndpointG2。也就是只要之通信的外部为EndpointGB发生变化,那么映射的外网EndpointG就会变化。

3)Address-Dependent Mapping:

对于一个内网的EndpointP,如果与之通信的外部为EndpointGB1,那么EndpointP就会被NAT映射成EndpointG1;如果与之通信的外部为EndpointGB2(如果EndpointGB2的IP和EndpointGB1的相同),那么EndpointP同样会被NAT映射成EndpointG1,否则就会被NAT映射成EndpointG2。也就是只要之通信的外部为EndpointGB的IP发生变化,那么映射的外网EndpointG就会变化。

Filtering Behavior:

1)Endpoint-Independent Filtering:

对于这种过滤类型,NAT在在自己的一个外网EndpointG1收到数据包,只要找到与之对应的内网EndpointP1,NAT就会转发这个数据包给相应的内网EndpointP1,不管这个数据包的来源是那里。(一般来说,这样过滤规则的NAT是比较少的,因为这样的安全系数比较低)

2)Address and Port-Dependent Filtering:

对于这种过滤类型,NAT在自己的一个外网EndpointG1收到来源是EndpointGA1数据包,这个时候NAT要判断自己是否曾经通过自己的EndpointG1给EndpointGA1发送过数据包,如果曾经发过,那么NAT就允许该数据包通过NAT并路由给内网与之对于的内网EndpointP1;如果没发过,那么NAT会不允许该数据包通过NAT。

3)Address-Dependent Filtering:

对于这种过滤类型,NAT在自己的一个外网EndpointG1收到来源是EndpointGA1数据包,这个时候NAT要判断自己是否曾经通过自己的EndpointG1给和EndpointGA1的IP相同的机器发送过数据包(这里会忽略端口),如果曾经发过,那么NAT就允许该数据包通过NAT并路由给内网与之对于的内网EndpointP1;如果没发过,那么NAT会不允许该数据包通过NAT。

RFC5389只是定义了协议的相关属性、机制、报文结构以及一些相关的安全注意点等等,并有没对怎么进行完整的NAT类型侦测做介绍。而对完整NAT类型侦测过程主要由RFC5780这个文档来描述。完整的NAT类型侦测的过程主要在RFC5780文档的4.3和4.4节,主要分为NAT映射规则(Determining NAT Mapping Behavior)和NAT过滤规则(Determining NAT Filtering Behavior)。

2.探测流程:

2.1 Mapping 探测流程:

1)步骤1:向stun服务发送正常消息,此时如果不能返回数据,属于udpblocked。如果能返回数据,则继续判断;

1.1)如果步骤1返回的本地地址和通过路由器的公网地址相等,则继续发送消息(changeIp:true,changePort:true),如果能返回数据,则表示是开放网络。如果不能,则表示属于对称防火墙网络(到这里就可以返回mapping测试结果);

1.2)如果步骤1返回的地址不相等,则表示有NAT存在,继续执行步骤2;

(注意,如果步骤1没有返回changedAddress则表示stun服务器,不支持该探测方法)

2)步骤2:向步骤1返回的changedAddress发送bindRequest:

2.1)返回的公网地址和步骤1公网地址相等,则表示该网络为Endpoint-Independent Mapping;

2.2)返回的公网地址和步骤1公网地址不相等,继续测试执行步骤3;

3) 步骤3:向步骤2返回的changedAddress,发送bindRequest:
3.1)返回的公网地址和步骤2的公网地址相等,则表示为Address-Dependent Mapping;

3.2)返回的公网地址和步骤2的公网地址不相等,则表示为Address and Port-Dependent Mapping;

流程图如下:

2.2 Filtering 探测流程:

1)步骤1:向stun服务发送正常消息,此时如果不能返回数据,属于udpblocked。如果能返回数据,则继续判断;

1.1)如果步骤1返回的本地地址和通过路由器的公网地址相等,则继续发送消息(changeIp:true,changePort:true),如果能返回数据,则表示是开放网络。如果不能,则表示属于对称防火墙网络(到这里就可以返回mapping测试结果);

1.2)如果步骤1返回的地址不相等,则表示有NAT存在,继续执行步骤2;

2)步骤2:使用步骤一返回的地址,发送消息(changeIp:false,changePort:true)

2.1)如果不能返回数据,则表示filter类型为Address and Port-Dependent Filtering;

2.2)如果能返回数据,则继续执行步骤3;

3)步骤3:向步骤一发送消息的地址,发送消息(changeIp:true,ChangePort:true)

3.1)如果能返回数据则表示为:Endpoint-Independent Filtering;

3.2)不能则表示为:Address-Dependent Filtering;

流程图如下:

引用:

rfc5780协议中文翻译:RFC5780 中文翻译 中文RFC RFC文档 RFC翻译 RFC中文版

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐