NAT 穿透

NAT 穿透

NAT可以分为

  • 对称型:外网端口由源IP,源port,目的IP,目的port共同决定。即同一源IP和源端口,不同的目的IP,端口会被NAT映射为不同的端口

  • 非对称型:外网端口由源IP,源端口决定。即同一源IP和源端口被NAT映射为同一端口。

穿透需要根据不同的NAT类型采取不同的策略。 判断NAT类型的方法如下:

sequenceDiagram
    P1->>NAT1: 192.168.1.2:1234-->3.3.3.3:8080
    NAT1->>Coordinator: 1.1.1.1:aaaa-->3.3.3.3:8080
    P1->>NAT1: 192.168.1.2:1234-->3.3.3.3:8081
    NAT1->>Coordinator: 1.1.1.1:bbbb-->3.3.3.38081
    Coordinator->>Coordinator: aaaa = bbbb?

如上图所示:

  1. 内网机器P1向公网Coordinator的8080端口发送UDP报文
  2. 报文经过NAT1后源端口会映射为aaaa
  3. 公网Coordinator收到报文后可以看到其源端口为aaaa
  4. P1使用步骤1同样的源端口向Coordinator的另一个端口发送UDP报文
  5. NAT1收到报文后将源端口映射为bbbb
  6. 公网Coordinator收到报文后可以看到其源端口bbbb
  7. 比较aaaa和bbbb,如果相同则为非对称型NAT,反正则为对称型

双非对称型NAT内网穿透

sequenceDiagram
    P1->>NAT1: 192.168.1.2:1234-->2.2.2.2:4321 ttl=5
    NAT1-->>NAT2: droped
    P2->>NAT2: 192.168.1.2:1234-->1.1.1.1:5678
    NAT2->>NAT1: 2.2.2.2:4321-->1.1.1.1:5678
    NAT1->>P1: 2.2.2.2:4321-->192.168.1.2:1234

如上图所示: P1和P2为两个内网机器,其内网地址都为192.168.1.2,NAT1和NAT2为非对称型NAT,其外网地址分别为1.1.1.1和2.2.2.2。

内网穿透步骤如下:

  1. P1和P2绑定任意本地端口(这里为1234),通过coordinator找到其对应的外网端口,并通知对方(这里P1的外网端口5678,P2的外网端口为4321)
  2. P1发送UDP报文至P2,其TTL设定一个较小的值,确保报文在到达NAT2之前被丢弃
  3. P2发送UDP报文至P1

对称-非对称内网穿透

sequenceDiagram
    P1->>P2: 192.168.1.2:1234-->2.2.2.2:2000 ttl=5
    P1->>P2: 192.168.1.2:1234-->2.2.2.2:2001 ttl=5
    P1->>P2: 192.168.1.2:1234-->2.2.2.2:2002 ttl=5
    P1->>P2: ...
    P2->>P1: 192.168.1.2:1234-->1.1.1.1:5678
    P2->>P1: 192.168.1.2:1234-->1.1.1.1:5678
    P2->>P1: 192.168.1.2:1234-->1.1.1.1:5678
    P2->>P1: ...
    P2->>P1: msg

如上图,图中省略了NAT1和NAT2

穿透步骤如下:

  1. 通过coordinator确定NAT1为非对称型,NAT2为对称型,得到P1的外网端口(这里为5678)
  2. P1以固定端口(这里为1234)向P2的不同端口发送大量短TTL报文
  3. P2向P1的外网端口发送大量报文
  4. 直到P1收到P2发送的报文,此时穿透成功

原理: 由于对称NAT无法预知外网端口,所以此方法实际是从非对称端出发,去碰撞对称NAT映射的端口

Licensed under CC BY-NC-SA 4.0
最后更新于 Apr 26, 2023 15:51 +0800
使用 Hugo 构建
主题 StackJimmy 设计