学习NAT类型与实战各类型打洞可行性
学习NAT类型与实战各类型打洞可行性
Lynx Frost参考:https://tailscale.com/blog/how-nat-traversal-works
一、相关工具(含使用场景)
- 在线检测NAT类型:NAT Checker(核心功能:检测映射/过滤行为,精准判定NAT1-9类型,建议打洞前必测)
- 通用打洞工具:Tailscale(适配EasyNAT全场景,HardNAT需依赖UPnP,操作简单,适合新手)
- 复杂NAT适配工具:Easytier(支持端口扫描/预测,可尝试HardNAT组合,适合进阶用户)
- 辅助排查工具:Wireshark(抓包分析流量走向,定位打洞失败原因,如端口过滤、映射端口变化)
二、必备知识(打洞原理基础)
路由器通过两张核心表实现NAT管控,这是打洞能否成功的关键:
- NAT映射表:记录内部主机(内网IP:端口)与公网(公网IP:端口)的映射关系,仅当内部主机向外发起请求时生成/更新;
- 状态表:记录内部主机的对外请求状态(如请求目标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(全锥型)
核心原理
双方均为端点无关映射(公网端口固定)+ 端点无关过滤(任意外部流量放行),无需触发状态表更新,交换公网信息后可直接通信。
实战步骤
- 双方启动Tailscale,自动连接中转服务器,完成身份认证;
- 中转服务器同步双方的公网IP和映射端口(因端点无关映射,此端口固定不变);
- 双方获取对方公网信息后,直接向对方的「公网IP:映射端口」发起TCP/UDP连接;
- 由于双方过滤规则宽松,流量直接放行,打洞成功,后续通信脱离中转服务器。
可行性结论
✅ 100%稳定可行,无特殊条件限制,是打洞最理想的场景。
问题排查
若失败,优先排查:① 防火墙是否拦截对应端口(如Tailscale默认使用41641端口,需放行);② 公网IP是否为运营商内网IP(极少数情况,可通过IP138查询公网IP是否一致)。
3.2 NAT1(全锥型) ↔ NAT3(端口受限锥型)
核心原理
NAT1公网端口固定+过滤宽松,NAT3公网端口固定但过滤严格(仅放行「之前请求过的IP+端口」的响应)。关键是让NAT3先向NAT1发起请求,更新NAT3的状态表,从而放行NAT1的后续请求。
实战步骤
- 双方启动Tailscale,连接中转服务器,同步对方公网IP:端口(记为NAT1:A:PortA;NAT3:B:PortB);
- 关键操作:让NAT3主机主动向NAT1的A:PortA发起请求(Tailscale会自动触发此步骤,无需手动操作);
- NAT3的状态表更新:记录「请求目标A:PortA」,此时允许A:PortA的流量进入内网;
- NAT1主机向NAT3的B:PortB发起请求,由于NAT3状态表已记录A:PortA,此请求被放行;
- 双方建立双向连接,打洞成功。
可行性结论
✅ 可行性95%以上,核心依赖「NAT3先发起请求」的顺序,Tailscale等工具会自动协调此顺序,无需手动干预。
问题排查
若失败,排查:① NAT3主机是否被路由器限制“主动对外发起连接”;② 双方是否同时启动工具(若NAT1先发起请求,会被NAT3过滤,可重启双方Tailscale重试)。
3.3 NAT3(端口受限锥型) ↔ NAT3(端口受限锥型)
核心原理
双方均为“端口固定+地址和端口相关过滤”,仅放行「自身之前请求过的IP:端口」的流量。需让双方在极短时间内同时向对方发起请求,互相更新对方的状态表,实现流量双向放行。
实战步骤
- 双方启动Tailscale,连接中转服务器,同步对方公网IP:端口(NAT3-1:C:PortC;NAT3-2:D:PortD);
- 工具协调:Tailscale会通过中转服务器向双方发送“同步发起请求”的指令,确保双方在1秒内同时行动;
- 双方同时向对方公网地址发起请求:NAT3-1→D:PortD;NAT3-2→C:PortC;
- 双方状态表同时更新:NAT3-1记录D:PortD,允许其流量进入;NAT3-2记录C:PortC,允许其流量进入;
- 双方请求均被对方放行,建立双向连接,打洞成功。
可行性结论
✅ 可行性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,重新发起请求。
实战步骤
- 双方启动Tailscale,连接中转服务器,同步的NAT4公网信息为「E:Port4-1」(NAT4与中转服务器通信的端口);
- NAT1先向E:Port4-1发起请求,因Port4-1仅对应“NAT4→中转服务器”的状态,此请求被NAT4的映射表匹配失败,直接过滤;
- 中转服务器触发NAT4向NAT1的A:PortA发起请求,此时NAT4因目标IP变为A,生成新映射端口Port4-2;
- NAT1接收到NAT4的请求(源地址E:Port4-2),自动更新NAT4的公网信息为「E:Port4-2」;
- NAT1向E:Port4-2重新发起请求,此时NAT4的状态表已记录「请求目标A:PortA」,且Port4-2为当前映射端口,请求被放行;
- 双方建立连接,打洞成功。
可行性结论
⚠️ 可行性70%左右,需依赖工具支持“动态端口识别与二次请求”(Tailscale、Easytier均支持)。若NAT4的映射端口变化频繁(如部分运营商每30秒刷新一次),可能导致连接不稳定。
问题排查
若失败,排查:① 工具是否支持动态端口更新(老旧版本可能不支持,需升级);② NAT4的映射端口刷新周期是否过短(可通过Wireshark抓包观察端口变化频率)。
3.5 NAT3(端口受限锥型) ↔ NAT4(地址相关映射+端点无关过滤)
核心原理
双方均有严格限制:NAT3仅放行「自身请求过的IP:端口」,NAT4映射端口随目标IP变化。常规情况下,NAT3请求NAT4的“中转端口”会被过滤,NAT4请求NAT3时,因NAT3未记录其新端口,也会被过滤。需通过辅助方案突破限制。
实战步骤(分两种辅助方案)
方案1:开启UPnP/NAT-PNP(推荐,成功率高)
- 登录NAT4所在的路由器管理后台,找到「UPnP」或「NAT-PNP」功能(通常在“高级设置-端口映射”中),开启该功能;
- 双方启动Tailscale,工具会通过UPnP向路由器申请“固定映射端口”(强制NAT4使用固定端口,而非动态变化);
- 后续步骤与「NAT3↔NAT3」一致:双方通过中转服务器同步固定端口,同时发起请求,互相更新状态表;
- 流量双向放行,打洞成功。
方案2:使用Easytier(无UPnP时备选,成功率低)
- 双方启动Easytier,工具自动检测到NAT类型组合,触发“端口扫描+预测”模式;
- NAT4主机向NAT3的C:PortC连续发送100-500条请求(目标端口固定,源端口动态生成,形成多个映射端口:Port4-3、Port4-4…);
- NAT3主机同时向NAT4的E:Port4-3~Port4-500依次发起扫描请求;
- 当NAT3扫描到NAT4正在向自己发起请求的端口(如Port4-10)时,双方状态表同时记录对方信息,请求被放行,建立连接。
可行性结论
❌ 常规不可行;✅ 开启UPnP后可行性85%;⚠️ 用Easytier可行性30%-50%(依赖端口扫描命中率,且易被运营商判定为网络攻击,不推荐公网使用)。
问题排查
若UPnP方案失败,排查:① 路由器是否支持UPnP(部分老旧路由器无此功能);② 工具是否有权限调用UPnP(需以管理员身份运行);若Easytier方案失败,排查:① 网络是否限制高频端口扫描(如企业内网可能拦截);② 双方网络延迟是否过高(延迟越高,扫描命中率越低)。
3.6 NAT4(地址相关映射) ↔ NAT4(地址相关映射)
核心原理
双方均为HardNAT,映射端口随目标IP动态变化,且过滤规则严格。打洞需满足“双方同时扫描到对方当前的动态端口”,而每个动态端口的有效期通常仅几十秒,命中率极低;同时高频扫描易触发运营商的DDoS防护机制,导致IP被临时封禁。
实战尝试(不推荐)
- 双方启动Easytier,开启“深度端口扫描”模式(需手动设置扫描范围,如1000-65535);
- 双方同时向对方公网IP的全端口范围发起扫描请求,试图匹配对方的动态映射端口;
- 若运气极佳,双方扫描到对方当前的动态端口,可建立连接;否则扫描持续数分钟后失败。
可行性结论
❌ 强烈不建议尝试,可行性低于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通信:
- 核心优势:IPv6为每个设备分配独立公网地址,无需NAT转换,直接通过IPv6地址建立连接,稳定性100%,延迟低于NAT打洞;
- 实战步骤:
- 双方开启设备IPv6功能(电脑:设置-网络-属性,勾选IPv6;路由器:开启IPv6拨号,获取前缀);
- 通过命令行获取自身IPv6地址(Windows:ipconfig;Linux:ifconfig);
- 使用支持IPv6的工具(如Tailscale、SSH、FTP),直接输入对方IPv6地址建立连接,无需中转和打洞。
- 注意事项:部分运营商IPv6地址为动态分配(重启路由器会变化),可在路由器中设置“IPv6地址绑定”,固定设备的IPv6后缀。
六、打洞核心规律与建议
- EasyNAT之间(Type1-3):打洞成功率高,优先使用Tailscale,操作简单且稳定,适合大多数个人/家庭场景;
- EasyNAT↔HardNAT:优先尝试开启UPnP,其次使用Easytier,避免手动操作,减少风险;
- HardNAT之间(Type4+):放弃打洞,选择中转服务器或IPv6,既保证稳定性,又避免IP被封禁;
- 实战优先级:检测NAT类型 → 尝试EasyNAT打洞 → 开启UPnP重试 → 切换IPv6 → 使用中转服务器。


