1. 当前位置: 网站首页 >  路由器百科 >  远程访问为什么有时直连有时中继?速度差十倍,NAT打洞的原理我画了张图

远程访问为什么有时直连有时中继?速度差十倍,NAT打洞的原理我画了张图

NAT打洞原理图:STUN问路、交换纸条、对射凿洞全过程,对称NAT失败与中继兜底对照

写飞牛FN Connect那篇的时候我留了个尾巴:在公司WiFi下往家里NAS传文件,500KB/s,一个2G的素材包磨了一个多小时;晚上媳妇用手机流量翻家里NAS的相册,照片划得飞快,速度贴着我家上行50兆跑。同一个NAS,同一个账号,差出十倍。后来我把两边的连接状态对了一下才看明白——她那条是设备对设备的直连,我这条是绕服务器的中继。决定走哪条路的,是一件事:NAT打洞成没成。这事不光FN Connect有,腾讯会议、微信视频、Tailscale、游戏联机,底层全是同一套。

先把NAT这一关花一分钟复习了

家里设备用的都是192.168或者31.x这种内网地址,在公网上是不存在的。包出门的时候,路由器把源地址改成WAN口的公网IP,顺手在自己那张映射表上记一笔:内网的192.168.31.10:54321,出门之后对外是117.136.x.x:56789。回程的包按这张表转发回对应的设备。我在NAT类型那篇里从游戏联机的角度讲过一遍,这里只强调跟打洞有关的一件事:凿出去的这个口子,外面的人拿到的只是一个公网IP加端口号,至于谁能从这个口子进来,规矩是各家路由器自己定的。

有的路由器大方,口子凿开了谁来都放行;有的挑剔,必须是你主动联系过的人才行;还有的最鸡贼,每联系一个新目标就换一个新口子。这个脾气差异,直接决定了打洞的成败。

NAT分四种脾气,打洞成败先看它

教科书上把NAT分成四种,名字带"锥形"听着唬人,拿小区快递代收点打比方就清楚了:

类型规矩代收点比方
完全锥形凿开一个口,任何外网地址都能进来货架上贴你名字,谁放的都转交
限制锥形只放行你主动联系过的那个IP,端口不管只收你点过单的那家店寄的
端口限制锥形IP和端口都得对上你联系过的那个只认那家店的那个骑手
对称型每换一个目的地就换一个新口子每家店给你发新货架号,旧号作废

家用路由器绝大多数是前三种(统称锥形),口子一旦凿开,去往哪个目标都是同一个映射。公司出口的防火墙、一部分运营商的CGNAT,是对称型——这一点后面要命。两边的NAT只要都是锥形,打洞基本能成;只要有一方是对称,基本没戏。

打洞的全过程:问路、交换、对射

两台都在NAT后面的设备想直连,谁也不知道对方的公网门牌,得按三步走。

第一步问路。A和B各自向一台STUN服务器发个UDP包。STUN是干什么的?就是一面镜子——你冲它发包,它回话告诉你:「我从外面看你,是117.136.x.x:56789」。这个地址就是NAT映射后的门牌。STUN服务器标准端口是3478,公网上一堆免费的,谷歌、腾讯都有。

第二步交换。两边把自己问到的门牌,通过一条第三方通道互换。这条通道就是FN Connect、腾讯会议、Tailscale的登录服务器在干的活——它只递纸条,不碰数据。所以那类软件断网登录不上服务器时你连都连不了,纸条没处递。

第三步对射。A往B的门牌发包,B同时往A的门牌发包。妙就妙在时序上:B的包到达A的NAT之前,A刚好主动朝B发过包,A的NAT映射表上这条记录还热着,B的包一到,正好命中表项,放行。反过来也是一样。两个口子互相凿开,洞就通了。整个过程通常几百毫秒到几秒,你看到App上「连接中」转的那一下,多半就是它在射。

为什么视频会议、异地组网清一色先试UDP?因为UDP没有连接状态,包说走就走,最适合干这种「同时互射」的活。TCP和UDP那篇里讲过TCP要先握手,两边时序对不齐,打洞难度高一个量级,一般只当备胎。

对称NAT为什么没救,中继是怎么兜底的

对称NAT的死穴在这:A向STUN问路时用的是口子1,等它转头去联系B,NAT给它换成了口子2。B拿到的纸条上写的是口子1的地址,包发过去,A的NAT一查表——没这条记录,扔了。纸条上的门牌是过期的,怎么射都射不进。两边只要有一方是对称,直连这条路就基本封死。

这时候就轮到中继出场,行话叫TURN:两边都把数据交给一台服务器,服务器转交给对方。全程过服务器,你看到的速度上限就是「服务器分给你的带宽」和「它离你俩的距离」。FN Connect免费档中继实测500KB/s到1MB/s,傍晚高峰还要再打折;群晖QuickConnect的中继同款脾气,我在QuickConnect那篇里测过,也是几MB/s封顶。为什么普遍慢?服务器带宽是真金白银,免费档限速是常态,Tailscale的DERP、游戏加速器的「专线」,本质都是这东西。

怎么知道自己是直连还是中继

这事最坑的地方在于:打洞失败不会报错,软件会静默降级到中继。界面上什么都看不出来,你以为是自己网差、NAS不行,其实是路没走对。所以得自己当裁判。

第一个裁判是速度。贴着家里上行跑的(我家上行50兆,传文件5MB/s上下)就是直连;恒定卡在500KB/s到1MB/s这个量级、纹丝不动也不分时段的,八成是中继。中继的慢有个特点——稳定地慢,不像带宽拥塞那种晚上差白天好。

第二个裁判是软件自己交代。腾讯会议在设置里能看网络统计,发送接收速率上不去但延迟还行,是中继相;Tailscale更实在,后台管理页每个连接直接标着direct还是derp(它家中继的名字),一眼看穿,这也是我推荐拿它当测试工具的原因——连上后看一眼标注,你这条路的成色就清楚了。FN Connect这类没把状态露出来的,就用速度反推,1190那篇我就是这么判断的。

顺带一提,同一个人换个网络结果就不一样:我家WiFi是直连,公司WiFi是中继,手机流量又是直连。所以排查的时候别只盯着家里那头折腾,两头都要看。

家里的现实:CGNAT、IPv6和提速顺序

落到自家宽带上,两个现实最关键。一个是CGNAT:WAN口拿到100.64开头的地址,说明运营商把你和几百户塞在同一个公网IP后面,那就是一层巨大的NAT,不少地区还是对称脾气,打洞成功率雪上加霜。判断方法查公网IP那篇写过,看WAN口地址再拿手机流量对一下出口IP就清楚。另一个坏消息是移动和部分新装电信宽带默认就是这待遇,打电话能要回公网v4的尽量要。

另一个是IPv6,这是绕开整个打洞游戏的根治法。每台设备拿到全球唯一的v6地址之后,根本不存在「藏在内网后面」这回事,门就开在那,直接敲。两头都有v6,异地组网软件会自动改走v6直连,我媳妇手机流量能跑满就是沾的这个光——蜂窝网络v6覆盖早就是标配。家里这头要做的就是把v6理顺,路由器开关和光猫那层是两个关卡,小米路由器在31.1里一个开关的事,坑我之前踩过,光猫侧另有讲究,桥接和路由模式还不一样。

至于我在公司那条中继路,最后是怎么救的:访问端没v6、出口又是对称,软件层救不了,我干脆把家里那头配成公网IP加高位端口,走VPN回家或者直接端口映射。一方公网可达,等于对方不用凿洞直接登门,绕过了整个看运气的环节。

照例给个顺序,从免费到花钱:

步子动作代价
1两头查IPv6,手机流量先试(有v6大概率直连)0元
2家里侧打10000号要公网IP0元,看运气
3公网IP+端口映射或VPN回家0到几十块
4都不行,中继忍着或上付费档月租

下次远程访问卡成PPT,先别急着怪NAS不行——看看你走的是哪条路,再决定治哪头。

展开全文


版权说明 手机扫码阅读
版权所有:《数巢笔记》 => 《远程访问为什么有时直连有时中继?速度差十倍,NAT打洞的原理我画了张图》
本文地址:https://www.shunot.com/lybk/1207.html
除非注明,文章均为 《SHUNOT》 原创,欢迎转载!转载请注明本文地址,谢谢。

发表评论

联系我们

在线咨询:点击这里给我发消息

微信号:master_135

工作日:9:00-23:00,节假日休息

扫码关注