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?
如上图所示:
- 内网机器P1向公网Coordinator的8080端口发送UDP报文
- 报文经过NAT1后源端口会映射为aaaa
- 公网Coordinator收到报文后可以看到其源端口为aaaa
- P1使用步骤1同样的源端口向Coordinator的另一个端口发送UDP报文
- NAT1收到报文后将源端口映射为bbbb
- 公网Coordinator收到报文后可以看到其源端口bbbb
- 比较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。
内网穿透步骤如下:
- P1和P2绑定任意本地端口(这里为1234),通过coordinator找到其对应的外网端口,并通知对方(这里P1的外网端口5678,P2的外网端口为4321)
- P1发送UDP报文至P2,其TTL设定一个较小的值,确保报文在到达NAT2之前被丢弃
- 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
穿透步骤如下:
- 通过coordinator确定NAT1为非对称型,NAT2为对称型,得到P1的外网端口(这里为5678)
- P1以固定端口(这里为1234)向P2的不同端口发送大量短TTL报文
- P2向P1的外网端口发送大量报文
- 直到P1收到P2发送的报文,此时穿透成功
原理: 由于对称NAT无法预知外网端口,所以此方法实际是从非对称端出发,去碰撞对称NAT映射的端口