NAT穿越分为4种类型:完全锥型、IP 限制锥型、端口限制锥型和对称型。
完全锥型
当 host 主机通过 NAT 访问外网的 B 主机时,就会在 NAT 上打个“洞”,所谓的“打洞”就是在 NAT 上建立一个内外网的映射表。
四元组
内网IP, 内网端口, 映射的外网IP, 映射的外网端口
大多数打洞都是使用的 UDP 协议。之所以会这样,是因为 UDP 是无连接协议,它没有连接状态的判断,也就是说只要你发送数据给它,它就能收到。
IP 限制锥型 NAT
IP 限制锥型要比完全锥型 NAT 严格得多,它主要的特点是,host 主机在 NAT 上“打洞”后,NAT 会对穿越洞口的 IP 地址做限制。只有登记的 IP 地址才可以通过,也就是说,只有 host 主机访问过的外网主机才能穿越 NAT。
如果发现发来数据的 IP 地址没有登记,则直接将该数据包丢弃。
5 元组
内网IP, 内网端口, 映射的外网IP, 映射的外网端口, 被访问主机的IP
端口限制锥型
6 元组
内网IP, 内网端口, 映射的外网IP, 映射的外网端口, 被访问主机的IP, 被访问主机的端口
该 6 元组中,不光包括了 host 主机内外网的映射关系,还包括了要访问的主机的 IP 地址及提供服务的应用程序的端口地址。
host 主机访问 B 主机的 p1 端口时,只有 B 主机的 p1 端口发送的消息才能穿越 NAT 与 host 主机通信。而其他主机,甚至 B 主机的 p2 端口都无法穿越 NAT。
对称型 NAT
与端口限制型 NAT 最大的不同在于,如果 host 主机访问 A 时,它会在 NAT 上重新开一个“洞”,而不会使用之前访问 B 时打开的“洞”。也就是说对称型 NAT 对每个连接都使用不同的端口,甚至更换 IP 地址,而端口限制型 NAT 的多个连接则使用同一个端口,这对称型 NAT 与端口限制型 NAT 最大的不同。
判断是否有 NAT 防护
主机向服务器 #1 的某个 IP 和端口发送一个请求,服务器 #1 收到请求后,会通过同样的 IP 和端口返回一个响应消息。
如果能收到包,则判断返回的主机的外网 IP 地址是否与主机自身的 IP 地址一样。如果一样,说明主机就是一台拥有公网地址的主机.