1. 对称型NAT
对称型NAT 将内网和外网的IP一一对应, 常用于电信系网关.
特征: 即使同一个设备的同一个进程向外网访问, 也会得到不同的IP和端口
2. 锥形NAT
2.1 完全锥形NAT
常见于家用路由器.
内网某{IP, 端口}会被映射成一个固定的{IP, 端口}地址. 即使是第三方外网程序访问之, 也可以成功.
2.2 限制锥形NAT
2.2.1 限制IP型NAT
相比于2.1的完全锥形NAT, 这里路由器会查询NAT表, 如果外网访问进来的数据包在自己的NAT表中没有记录, 则不能访问.
2.2.2 端口限制NAT
相比于IP限制型NAT, 端口限制NAT额外又限制了端口, 即, 对方的端口也要和我NAT表中记录的一样才能访问内网.
NAT 穿越技术
这里主要讨论的是完全锥形NAT
UDP最适合打洞, 只要服务器提前给路由器打出洞后, 其他设备/程序就可以直接利用这个"洞"
更高级的处理方式是利用UPnP技术, 提前向路由器告知要使用的映射端口. 即, 外网对这个{地址, 端口}的访问要交付给某个{地址 端口}.
不过当前应用前景不是很明亮, 因为其十分依赖于路由器是否支持UPnP
TCP也能够打洞, 不过过程比较繁琐.
假设两个节点A,B 分别位于自己的NAT_A和NAT_B之后,两者想直接建立关系, 都需要先访问中间服务器.
- 服务器收集NAT_A和NAT_B的{地址, 端口}信息,并告知节点A
- 节点A构造一个TTL很小的TCP数据包, 目的地址为NAT_B. 这个TTL使得数据包能够穿越NAT_A却到达不了NAT_B, 因此中间被丢弃(但是已经在NAT_A建立了NAT表项). 节点A还要记录这个TCP数据包的seq_num值, 通过中间服务器或者UDP打洞告诉节点B
- 节点B伪造一个TCP的SYN数据包 , 该包源地址为{NAT_A}, 目的地址为{节点B}
- 当自己收到这个SYN的时候, 会生成一个ACK返回
- NAT_B为这个ACK建立了NAT表, 成功打洞
网友评论