NAT类型检测流程
客户端 通过stun服务器,探测Nat类型,mapping和filter
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中文版
更多推荐
所有评论(0)