• P2P内网穿透之Nat类型介绍及Nat类型检测穿透操作方法整理


    目录

    根据RFC 3489规定 Nat共分以下类型:

    第一部分: NAT类型介绍 

    Full Cone NAT: 

    Restricted Cone NAT: 

    Port Restricted Cone NAT: 

    Symmetric NAT: 

    特殊情况:

    第二部分:STUN NAT类型检测

    ​​​​​​​前提条件:

    第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?

    第二步:检测客户端NAT是否是Full Cone NAT?

    第三步:检测客户端NAT是否是Symmetric NAT?

    第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?

    第三部分:双方Nat组合可穿透性介绍

    穿透关系:上述4种类型,如果定义他们的值为序列号,N为序列号相加。

     第四部分:一些参考连接传送门

    第五部分:P2P内网穿透操作指南


    根据RFC 3489规定 Nat共分以下类型:

    1. ///
    2. /// UDP is always blocked.
    3. ///
    4. UdpBlocked,
    5. ///
    6. /// No NAT, public IP, no firewall.
    7. ///
    8. OpenInternet,
    9. ///
    10. /// No NAT, public IP, but symmetric UDP firewall.
    11. ///
    12. SymmetricUdpFirewall,
    13. ///
    14. /// A full cone NAT is one where all requests from the same internal
    15. /// IP address and port are mapped to the same external IP address and port.
    16. /// Furthermore, any external host can send a packet to the internal host,
    17. /// by sending a packet to the mapped external address.
    18. ///
    19. FullCone,
    20. ///
    21. /// A restricted cone NAT is one where all requests from the same
    22. /// internal IP address and port are mapped to the same external IP address and port.
    23. /// Unlike a full cone NAT, an external host (with IP address X)
    24. /// can send a packet to the internal host only if the internal host
    25. /// had previously sent a packet to IP address X.
    26. ///
    27. RestrictedCone,
    28. ///
    29. /// A port restricted cone NAT is like a restricted cone NAT, but the restriction
    30. /// includes port numbers. Specifically, an external host can send a packet,
    31. /// with source IP address X and source port P, to the internal host only if
    32. /// the internal host had previously sent a packet to IP address X and port P.
    33. ///
    34. PortRestrictedCone,
    35. ///
    36. /// A symmetric NAT is one where all requests
    37. /// from the same internal IP address and port,
    38. /// to a specific destination IP address and port, are mapped to the same external
    39. /// IP address and port. If the same host sends a packet with the same source address
    40. /// and port, but to a different destination, a different mapping is used.
    41. /// Furthermore, only the external host that
    42. /// receives a packet can send a UDP packet back to the internal host.
    43. ///
    44. Symmetric

    第一部分: NAT类型介绍 

    常规情况下。NAT共分以下4大类:

    • Full Cone NAT: 

       内网主机建立一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,任何外部主机只要知道这个(PublicIP:PublicPort)就可以发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包 

    • Restricted Cone NAT: 

       内网主机建立一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(PublicIP:PublicPort)并且内网主机之前用这个socket曾向这个外部主机IP发送过数据。只要满足这两个条件,这个外部主机就可以用自己的(IP,任何端口)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包 

    • Port Restricted Cone NAT: 

        内网主机建立一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(PublicIP:PublicPort)并且内网主机之前用这个socket曾向这个外部主机(IP,Port)发送过数据。只要满足这两个条件,这个外部主机就可以用自己的(IP,Port)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包 

    • Symmetric NAT: 

        内网主机建立一个UDP socket(LocalIP,LocalPort),当用这个socket第一次发数据给外部主机1时,NAT为其映射一个(PublicIP-1,Port-1),以后内网主机发送给外部主机1的所有数据都是用这个(PublicIP-1,Port-1); 如果内网主机同时用这个socket给外部主机2发送数据,第一次发送时,NAT会为其分配一个(PublicIP-2,Port-2), 以后内网主机发送给外部主机2的所有数据都是用这个(PublicIP-2,Port-2).

    特殊情况:

    如果NAT有多于一个公网IP,则PublicIP-1和PublicIP-2可能不同,如果NAT只有一个公网IP,则Port-1和Port-2肯定不同,也就是说一定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2。

    此外,如果任何外部主机想要发送数据给这个内网主机,那么它首先应该收到内网主机发给他的数据,然后才能往回发送,否则即使他知道内网主机的一个(PublicIP,Port)也不能发送数据给内网主机,这种NAT无法实现UDP-P2P通信。

    第二部分:STUN NAT类型检测

    • ​​​​​​​​​​​​​​前提条件:

       有一个公网的服务器并且绑定了两个公网IP(IP-1,IP-2)。这个服务器做UDP监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。
       

    • 第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?

    操作:
    客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端无法进行UDP通信,可能是防火墙或NAT阻止UDP通信,这样的客户端也就 不能P2P了(检测停止)。
    当客户端能够接收到服务器的回应时,需要把服务器返回的客户端(IP,Port)和这个客户端socket的 (LocalIP,LocalPort)比较。如果完全相同则客户端不在NAT后,这样的客户端具有公网IP可以直接监听UDP端口接收数据进行通信(检 测停止)。否则客户端在NAT后要做进一步的NAT类型检测(继续)。

    • 第二步:检测客户端NAT是否是Full Cone NAT?

    操作:
    客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回 发一个数据包,客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信(检测停止)。

    • 第三步:检测客户端NAT是否是Symmetric NAT?

    操作:
    客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。
    用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。
    比 较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止)。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。

    • 第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?

    操作:
    客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。
    注:以上检测过程中只说明了可否进行UDP-P2P的打洞通信,具体怎么通信一般要借助于Rendezvous Server。另外对于Symmetric NAT不是说完全不能进行UDP-P2P达洞通信,可以进行端口预测打洞,不过不能保证成功。

    第三部分:双方Nat组合可穿透性介绍

    上面这张图是转的别人空间的,下面是我整理的:

    实际情况是双方NAT组合是有16种可能性的。如何穿透方法将在下面详细描述:

    1. NAT类型:把4种NAT类型分别标为1,2,3,4
    2. 1,FullCone,
    3. 2,RestrictedCone,
    4. 3,PortRestrictedCone,
    5. 4,Symmetric
    6. A1 vs B1,
    7. A1 vs B2,
    8. A1 vs B3,
    9. A1 vs B4,
    10. A2 vs B1,
    11. A2 vs B2,
    12. A2 vs B3,
    13. A2 vs B4,(特殊处理:A2先向B4发包,在本地Nat打洞等待,然后B4向A2发送数据,A2收到即通)
    14. A3 vs B1,
    15. A3 vs B2,
    16. A3 vs B3,
    17. A3 vs B4,(特殊处理:A3猜测B4的端口+1方式尝试)
    18. A4 vs B1,
    19. A4 vs B2,(特殊处理:B2先向A4发包,在本地Nat打洞等待,然后A4向B2发送数据,B2收到即通)
    20. A4 vs B3,(特殊处理:B3猜测A4的端口+1方式尝试)
    21. A4 vs B4,(特殊处理:TURN转发或双方互相猜测,成功概率极小)

    对称nat无法穿透,这个说法不正确,对称nat与全椎full cone nat、对称nat 与 ip受限椎型cone,是可以穿透的,对称nat与 端口受限、对称nat与对称nat,不可穿透。
    类型:

    1. 1、full cone 全椎
    2. 2、Restricted Cone ip受限
    3. 3、port Restricted Cone 端口受限
    4. 4、Symmetric 对称。

    穿透关系:上述4种类型,如果定义他们的值为序列号,N为序列号相加。

    1. 则N<=6可穿透。24 序列相加 = 6 则可穿透。
    2. 3(端口受限)和4(对称)= 7 不可穿透。

     第四部分:一些参考连接传送门

    P2P学习(一)NAT的四种类型以及类型探测 - 山上有风景 - 博客园

    NAT的四种类型及类型检测【很好】 - bw_0927 - 博客园

    RFC3489协议英文版:

    http://www.ietf.org/rfc/rfc3489.txt

    第五部分:P2P内网穿透操作指南

    以下穿透指南是我自行分析整理的。如有不妥之处还望指出。谢谢

    1. NAT类型:把4种NAT类型分别标为1,2,3,4
    2. 1,FullCone,
    3. 2,RestrictedCone,
    4. 3,PortRestrictedCone,
    5. 4,Symmetric
    6. 场景:有两台主机A:portA和B:portB(port都为外网端口,是与打洞服务器通信的端口,通过客户端发送心跳包维持打开),以及打洞服务器S,
    7. 需求:A拿到了B:portB的信息,要与B通信。
    8. 1)B为类型1
    9. 无论A为哪种类型,都可以直接与B:portB udp通信
    10. 2)B为类型2
    11. 无论A为哪种类型,在B知道A之前都无法直接连接,A给S发一个打洞请求,S转发该请求到B。 若A为类型1,则A:portA可直接与B:portB udp通信; 若A为类型23,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打洞,从此A:portA和B:portB可进行udp通信; 若A为类型4,则portA在与不同的ip:port通信时会不一样,所以B:portB先向A发送一个一字节的udp包,在路由器上打洞,然后等待A:portA先发送数据,B:portB接收到A:portA的数据后,即知道portA,也可互通数据了;
    12. 3)B为类型3
    13. 无论A为哪种类型,在B知道A之前都无法直接连接,A给S发一个打洞请求,S转发该请求到B。 若A为类型1,则A:portA可直接与B:portB udp通信; 若A为类型23,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打洞,从此A:portA和B:portB可进行udp通信; 若A为类型4,则portA在与不同的ip:port通信时会不一样,而B又要求知道portA才可让A:portA连进来,所以这种情况B只能猜测与B:portB通信的portA,通信概率小;
    14. 4)B为类型4
    15. 无论A为哪种类型,在B知道A之前都无法直接连接,A给S发一个打洞请求,S转发该请求到B。 若A为类型1,则A:portA可直接与B:portB udp通信; 若A为类型2, 则A:portA先向B发送一个一字节的udp包,在路由器上打洞,然后等待B:portB先发送数据,A:portA接收到B:portB的数据后,即知道portB,也可互通数据了;若B的类型为3,见(3)中A为类型4的描述;若A为4,双方无法知道对方的端口,无法通信。
    16. 分析可以得出:
    17. 1,无论双方是何类型:[在B知道A之前都无法直接连接,A给S发一个打洞请求,S转发该请求到B] 这步都是必须,后续则可根据不同的类型分别判断处理
    18. 具体操作:
    19. IF not (B4 and A3) OR (B3 and A4) then
    20. begin
    21. 1,A先从S查询到B的对公信息
    22. 2,A收到B信息后向S发一个打洞请求,请求连接B
    23. 3,S转发A的请求到B(要包含A的信息)
    24. 4, A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打洞,从此A:portA和B:portB可进行udp通信(
    25. 可以解决以下8种组合的NAT穿透:
    26. A1 vs B1,
    27. A1 vs B2,
    28. A1 vs B3,
    29. A1 vs B4,
    30. A2 vs B1,
    31. A2 vs B2,
    32. A2 vs B3,
    33. A2 vs B4,(特殊处理:A2先向B4发包,在本地Nat打洞等待,然后B4向A2发送数据,A2收到即通)
    34. A3 vs B1,
    35. A3 vs B2,
    36. A3 vs B3,
    37. A3 vs B4,(特殊处理:A3猜测B4的端口+1方式尝试)
    38. A4 vs B1,
    39. A4 vs B2,(特殊处理:B2先向A4发包,在本地Nat打洞等待,然后A4向B2发送数据,B2收到即通)
    40. A4 vs B3,(特殊处理:B3猜测A4的端口+1方式尝试)
    41. A4 vs B4,(特殊处理:TURN转发或双方互相猜测,成功概率极小)
    42. )
    43. end;
    44. 5 ,B4 vs A2 [若B为类型4,则portB在与不同的ip:port通信时会不一样,所以A:portA先向B发送一个一字节的udp包,在路由器上打洞,然后等待B:portB先发送数据,A:portA接收到B:portB的数据后,即知道portB,也可互通数据了;]
    45. 6 ,A4 vs B2 [若A为类型4,则portA在与不同的ip:port通信时会不一样,所以B:portB先向A发送一个一字节的udp包,在路由器上打洞,然后等待A:portA先发送数据,B:portB接收到A:portA的数据后,即知道portA,也可互通数据了;]
    46. 54 vs 4,3 vs 4单独处理[转发]

    参考:udp协议怎么穿透Symmetric NAT? - 知乎

  • 相关阅读:
    Python自动化小技巧10——excel文件批量多sheet表合并
    什么是自动做市商?
    关于react与vue的一些对比
    代码随想录算法训练营第四十八天| LeetCode198. 打家劫舍、LeetCode213. 打家劫舍 II、LeetCode337. 打家劫舍 III
    5-3 批处理作业调度(回溯)
    idea文件及方法注释
    Linux(Ubuntu)系统如何安装Python
    ASP.Core3.1 WebAPI 发布到IIS
    [MyBatisPlus]标准数据层开发(CRUD、分页)
    C++ 通过 #include 了解 Compiler 和 Linker
  • 原文地址:https://blog.csdn.net/wh445306/article/details/127831832