学习NAT类型与实战各类型打洞可行性

参考:https://tailscale.com/blog/how-nat-traversal-works

一、相关工具(含使用场景)

  • 在线检测NAT类型:NAT Checker(核心功能:检测映射/过滤行为,精准判定NAT1-9类型,建议打洞前必测)
  • 通用打洞工具:Tailscale(适配EasyNAT全场景,HardNAT需依赖UPnP,操作简单,适合新手)
  • 复杂NAT适配工具:Easytier(支持端口扫描/预测,可尝试HardNAT组合,适合进阶用户)
  • 辅助排查工具:Wireshark(抓包分析流量走向,定位打洞失败原因,如端口过滤、映射端口变化)

二、必备知识(打洞原理基础)

路由器通过两张核心表实现NAT管控,这是打洞能否成功的关键:

  1. NAT映射表:记录内部主机(内网IP:端口)与公网(公网IP:端口)的映射关系,仅当内部主机向外发起请求时生成/更新;
  2. 状态表:记录内部主机的对外请求状态(如请求目标IP:端口、连接状态),仅当外部流量与状态表匹配时,才允许穿透NAT进入内网。

打洞的核心逻辑:通过中转服务器交换双方公网映射信息,再主动发起请求触发对方状态表更新,让后续流量能被放行。

2.1 NAT映射行为(决定公网端口是否固定)

  • 地址和端口相关映射(HardNAT特征):仅当请求的「目标IP+目标端口」与历史请求完全一致时,才复用原公网映射端口;只要有一项不同,就生成新的公网端口(如内网主机先访问中转服务器A:8080,再访问主机B:80,会生成两个不同公网端口)。
  • 地址相关映射(HardNAT特征):只要请求的「目标IP」与历史一致,即使目标端口不同,也复用原公网端口;若目标IP不同,则生成新端口(如内网主机访问A:8080和A:80,共用一个公网端口;访问A:8080和B:80,生成两个端口)。
  • 端点无关映射(EasyNAT特征):无论请求的目标IP、目标端口如何变化,始终复用同一个公网映射端口(如内网主机访问A:8080、B:80、C:443,均使用同一个公网端口)。

2.2 NAT过滤行为(决定外部流量能否放行)

  • 地址和端口相关过滤:仅当外部响应的「源IP+源端口」与内部主机之前的请求目标完全一致时,才放行流量;否则直接过滤。
  • 地址相关过滤:只要外部响应的「源IP」与内部请求的目标IP一致,即使源端口不同,也放行流量;源IP不同则过滤。
  • 端点无关过滤:无论外部响应的源IP、源端口是什么,均直接放行(最宽松的过滤规则)。

2.3 NAT类型对照表(含打洞难度标注)

NAT类型 RFC 5780映射方式 RFC 5780过滤方式 RFC 3489对应类型 分类 打洞难度
NAT Type 1 端点无关映射 端点无关过滤 全锥型(Full Cone) EasyNAT ⭐ 极低
NAT Type 2 端点无关映射 地址相关过滤 受限锥型(Restricted Cone) EasyNAT ⭐ 低
NAT Type 3 端点无关映射 地址和端口相关过滤 端口受限锥型(Port Restricted Cone) EasyNAT ⭐⭐ 中低
NAT Type 4 地址相关映射 端点无关过滤 - HardNAT ⭐⭐⭐⭐ 高
NAT Type 5 地址相关映射 地址相关过滤 - HardNAT ⭐⭐⭐⭐ 高
NAT Type 6 地址相关映射 地址和端口相关过滤 - HardNAT ⭐⭐⭐⭐⭐ 极高
NAT Type 7 地址和端口相关映射 端点无关过滤 - HardNAT ⭐⭐⭐⭐ 高
NAT Type 8 地址和端口相关映射 地址相关过滤 - HardNAT ⭐⭐⭐⭐⭐ 极高
NAT Type 9 地址和端口相关映射 地址和端口相关过滤 对称型(Symmetric) HardNAT ⭐⭐⭐⭐⭐ 极高

三、各NAT类型打洞可行性(详细拆解)

前置操作:双方均通过NAT Checker确认自身NAT类型,安装Tailscale(基础场景)或Easytier(复杂场景),确保双方网络能访问中转服务器(Tailscale/Easytier官方服务器)。

3.1 NAT1(全锥型) ↔ NAT1(全锥型)

核心原理

双方均为端点无关映射(公网端口固定)+ 端点无关过滤(任意外部流量放行),无需触发状态表更新,交换公网信息后可直接通信。

实战步骤

  1. 双方启动Tailscale,自动连接中转服务器,完成身份认证;
  2. 中转服务器同步双方的公网IP和映射端口(因端点无关映射,此端口固定不变);
  3. 双方获取对方公网信息后,直接向对方的「公网IP:映射端口」发起TCP/UDP连接;
  4. 由于双方过滤规则宽松,流量直接放行,打洞成功,后续通信脱离中转服务器。

可行性结论

✅ 100%稳定可行,无特殊条件限制,是打洞最理想的场景。

问题排查

若失败,优先排查:① 防火墙是否拦截对应端口(如Tailscale默认使用41641端口,需放行);② 公网IP是否为运营商内网IP(极少数情况,可通过IP138查询公网IP是否一致)。

3.2 NAT1(全锥型) ↔ NAT3(端口受限锥型)

核心原理

NAT1公网端口固定+过滤宽松,NAT3公网端口固定但过滤严格(仅放行「之前请求过的IP+端口」的响应)。关键是让NAT3先向NAT1发起请求,更新NAT3的状态表,从而放行NAT1的后续请求。

实战步骤

  1. 双方启动Tailscale,连接中转服务器,同步对方公网IP:端口(记为NAT1:A:PortA;NAT3:B:PortB);
  2. 关键操作:让NAT3主机主动向NAT1的A:PortA发起请求(Tailscale会自动触发此步骤,无需手动操作);
  3. NAT3的状态表更新:记录「请求目标A:PortA」,此时允许A:PortA的流量进入内网;
  4. NAT1主机向NAT3的B:PortB发起请求,由于NAT3状态表已记录A:PortA,此请求被放行;
  5. 双方建立双向连接,打洞成功。

可行性结论

✅ 可行性95%以上,核心依赖「NAT3先发起请求」的顺序,Tailscale等工具会自动协调此顺序,无需手动干预。

问题排查

若失败,排查:① NAT3主机是否被路由器限制“主动对外发起连接”;② 双方是否同时启动工具(若NAT1先发起请求,会被NAT3过滤,可重启双方Tailscale重试)。

3.3 NAT3(端口受限锥型) ↔ NAT3(端口受限锥型)

核心原理

双方均为“端口固定+地址和端口相关过滤”,仅放行「自身之前请求过的IP:端口」的流量。需让双方在极短时间内同时向对方发起请求,互相更新对方的状态表,实现流量双向放行。

实战步骤

  1. 双方启动Tailscale,连接中转服务器,同步对方公网IP:端口(NAT3-1:C:PortC;NAT3-2:D:PortD);
  2. 工具协调:Tailscale会通过中转服务器向双方发送“同步发起请求”的指令,确保双方在1秒内同时行动;
  3. 双方同时向对方公网地址发起请求:NAT3-1→D:PortD;NAT3-2→C:PortC;
  4. 双方状态表同时更新:NAT3-1记录D:PortD,允许其流量进入;NAT3-2记录C:PortC,允许其流量进入;
  5. 双方请求均被对方放行,建立双向连接,打洞成功。

可行性结论

✅ 可行性90%以上,核心依赖「双方同时发起请求」的时间同步。若网络延迟过高(如跨运营商、跨地域),同步难度增加,成功率会略降。

问题排查

若失败,排查:① 双方网络延迟是否过高(可通过ping中转服务器判断,延迟>200ms建议换同运营商网络);② 工具是否未正常协调同步请求(重启工具或切换网络重试)。

3.4 NAT1(全锥型) ↔ NAT4(地址相关映射+端点无关过滤)

核心原理

NAT1公网端口固定,NAT4为HardNAT(映射端口随目标IP变化):NAT4向中转服务器发起请求时,生成映射端口Port4-1;当NAT4向NAT1发起请求时,因目标IP变化,会生成新的映射端口Port4-2(与Port4-1不同)。打洞关键是让NAT1识别到NAT4的新端口Port4-2,重新发起请求。

实战步骤

  1. 双方启动Tailscale,连接中转服务器,同步的NAT4公网信息为「E:Port4-1」(NAT4与中转服务器通信的端口);
  2. NAT1先向E:Port4-1发起请求,因Port4-1仅对应“NAT4→中转服务器”的状态,此请求被NAT4的映射表匹配失败,直接过滤;
  3. 中转服务器触发NAT4向NAT1的A:PortA发起请求,此时NAT4因目标IP变为A,生成新映射端口Port4-2;
  4. NAT1接收到NAT4的请求(源地址E:Port4-2),自动更新NAT4的公网信息为「E:Port4-2」;
  5. NAT1向E:Port4-2重新发起请求,此时NAT4的状态表已记录「请求目标A:PortA」,且Port4-2为当前映射端口,请求被放行;
  6. 双方建立连接,打洞成功。

可行性结论

⚠️ 可行性70%左右,需依赖工具支持“动态端口识别与二次请求”(Tailscale、Easytier均支持)。若NAT4的映射端口变化频繁(如部分运营商每30秒刷新一次),可能导致连接不稳定。

问题排查

若失败,排查:① 工具是否支持动态端口更新(老旧版本可能不支持,需升级);② NAT4的映射端口刷新周期是否过短(可通过Wireshark抓包观察端口变化频率)。

3.5 NAT3(端口受限锥型) ↔ NAT4(地址相关映射+端点无关过滤)

核心原理

双方均有严格限制:NAT3仅放行「自身请求过的IP:端口」,NAT4映射端口随目标IP变化。常规情况下,NAT3请求NAT4的“中转端口”会被过滤,NAT4请求NAT3时,因NAT3未记录其新端口,也会被过滤。需通过辅助方案突破限制。

实战步骤(分两种辅助方案)

方案1:开启UPnP/NAT-PNP(推荐,成功率高)
  1. 登录NAT4所在的路由器管理后台,找到「UPnP」或「NAT-PNP」功能(通常在“高级设置-端口映射”中),开启该功能;
  2. 双方启动Tailscale,工具会通过UPnP向路由器申请“固定映射端口”(强制NAT4使用固定端口,而非动态变化);
  3. 后续步骤与「NAT3↔NAT3」一致:双方通过中转服务器同步固定端口,同时发起请求,互相更新状态表;
  4. 流量双向放行,打洞成功。
方案2:使用Easytier(无UPnP时备选,成功率低)
  1. 双方启动Easytier,工具自动检测到NAT类型组合,触发“端口扫描+预测”模式;
  2. NAT4主机向NAT3的C:PortC连续发送100-500条请求(目标端口固定,源端口动态生成,形成多个映射端口:Port4-3、Port4-4…);
  3. NAT3主机同时向NAT4的E:Port4-3~Port4-500依次发起扫描请求;
  4. 当NAT3扫描到NAT4正在向自己发起请求的端口(如Port4-10)时,双方状态表同时记录对方信息,请求被放行,建立连接。

可行性结论

❌ 常规不可行;✅ 开启UPnP后可行性85%;⚠️ 用Easytier可行性30%-50%(依赖端口扫描命中率,且易被运营商判定为网络攻击,不推荐公网使用)。

问题排查

若UPnP方案失败,排查:① 路由器是否支持UPnP(部分老旧路由器无此功能);② 工具是否有权限调用UPnP(需以管理员身份运行);若Easytier方案失败,排查:① 网络是否限制高频端口扫描(如企业内网可能拦截);② 双方网络延迟是否过高(延迟越高,扫描命中率越低)。

3.6 NAT4(地址相关映射) ↔ NAT4(地址相关映射)

核心原理

双方均为HardNAT,映射端口随目标IP动态变化,且过滤规则严格。打洞需满足“双方同时扫描到对方当前的动态端口”,而每个动态端口的有效期通常仅几十秒,命中率极低;同时高频扫描易触发运营商的DDoS防护机制,导致IP被临时封禁。

实战尝试(不推荐)

  1. 双方启动Easytier,开启“深度端口扫描”模式(需手动设置扫描范围,如1000-65535);
  2. 双方同时向对方公网IP的全端口范围发起扫描请求,试图匹配对方的动态映射端口;
  3. 若运气极佳,双方扫描到对方当前的动态端口,可建立连接;否则扫描持续数分钟后失败。

可行性结论

❌ 强烈不建议尝试,可行性低于10%,且存在IP被封禁的风险。推荐替代方案:① 让一方切换到EasyNAT网络(如连接手机热点);② 使用中转服务器转发流量(Tailscale默认支持中转,稳定性高但延迟略高);③ 升级IPv6网络。

四、打洞可行性总结表(详细版)

通信组合 打洞结果 核心条件 推荐工具 风险/注意事项
NAT1↔NAT1 ✅ 100%稳定 无需特殊条件,交换公网信息即可 Tailscale、Easytier 低风险,仅需放行工具端口
NAT1↔NAT3 ✅ 95%可行 NAT3先向NAT1发起请求 Tailscale(自动协调顺序) 低风险,跨地域延迟高时成功率略降
NAT3↔NAT3 ✅ 90%可行 双方同时发起请求,时间同步 Tailscale(自动同步) 中低风险,延迟>200ms需重试
NAT1↔NAT4 ⚠️ 70%可行 工具支持动态端口识别与二次请求 Tailscale、Easytier 中风险,NAT4端口刷新频繁可能导致连接不稳定
NAT3↔NAT4 ❌ 常规不可行;✅ UPnP后85%可行;⚠️ 扫描后30%-50%可行 开启UPnP(推荐)或工具端口扫描(备选) Tailscale(UPnP)、Easytier(扫描) 高风险,扫描模式易被判定为攻击
NAT4↔NAT4 ❌ 可行性<10% 双方同时扫描到对方动态端口(极难) Easytier(不推荐) 极高风险,易导致IP被封禁

五、补充:IPv6替代方案(最优解)

若双方网络支持IPv6(可通过test-ipv6.com检测),优先放弃NAT打洞,直接使用IPv6通信:

  1. 核心优势:IPv6为每个设备分配独立公网地址,无需NAT转换,直接通过IPv6地址建立连接,稳定性100%,延迟低于NAT打洞;
  2. 实战步骤
    1. 双方开启设备IPv6功能(电脑:设置-网络-属性,勾选IPv6;路由器:开启IPv6拨号,获取前缀);
    2. 通过命令行获取自身IPv6地址(Windows:ipconfig;Linux:ifconfig);
    3. 使用支持IPv6的工具(如Tailscale、SSH、FTP),直接输入对方IPv6地址建立连接,无需中转和打洞。
  3. 注意事项:部分运营商IPv6地址为动态分配(重启路由器会变化),可在路由器中设置“IPv6地址绑定”,固定设备的IPv6后缀。

六、打洞核心规律与建议

  1. EasyNAT之间(Type1-3):打洞成功率高,优先使用Tailscale,操作简单且稳定,适合大多数个人/家庭场景;
  2. EasyNAT↔HardNAT:优先尝试开启UPnP,其次使用Easytier,避免手动操作,减少风险;
  3. HardNAT之间(Type4+):放弃打洞,选择中转服务器或IPv6,既保证稳定性,又避免IP被封禁;
  4. 实战优先级:检测NAT类型 → 尝试EasyNAT打洞 → 开启UPnP重试 → 切换IPv6 → 使用中转服务器。