端口转发在家测不通、出门用流量就通?NAT回流的锅,规则一行都不用改

先把怪现象摆出来:人在家怎么都不通,出了门反倒活了
场景你大概率见过。DDNS配好了,端口转发也加上了,规则一板一眼:外部端口18080,指向内网192.168.31.10的5244,那是我那台飞牛NAS的网盘口。人在公司,手机切流量,敲域名加端口,唰就进去了,速度还顶格。晚上回到家往沙发一躺,连着家里WiFi再敲同一个域名——转圈,转到最后弹一句「无法访问此网站」。
第一反应肯定是配置坏了。回后台翻端口转发规则,没填错啊;重启路由器,还是不通;甚至开始怀疑是不是要上DMZ才管用。帮大刘配光猫DMZ那次一模一样,他人在家里测NAS远程桌面,死活不通,差点把当天配的东西全推倒重来,最后切了手机流量一测——绿的,通得好好的,当晚就跑到5兆多每秒。
记住这个签名:外面通,家里不通,规则一行都不用动。撞上它,九成就是NAT回流。
包是怎么走的:出了门,回来的路却被抄了近道
把包一步一步摆开看就明白了。我家的实际参数是这样:手机连WiFi拿到192.168.31.50,路由器LAN口192.168.31.1,WAN口挂着公网IP(前阵子从117.136漂到了111.72),NAS钉死在192.168.31.10。
手机在家的第一步,先把域名解析成111.72这个公网IP。这一步没毛病,DNS给的就是真门牌,DDNS负责追着它更新。然后手机往「111.72:18080」发了一个TCP握手包。注意,虽然NAS就坐在三米外的书架上,但这个包的目标地址写的是公网IP,不属于本网段,手机只能把它交给网关路由器,往门外送。
路由器收到一看:这不就是我的WAN口地址吗?查转发表,18080映射到31.10:5244,于是把目标地址改写成192.168.31.10——这步叫DNAT,是端口转发的本职工作,干得没毛病。包被转头送进内网,NAS稳稳收到。
坑出在回程。NAS回包时瞄了一眼来源:192.168.31.50,自己人,内网直送。这个回包压根不再经过路由器,走交换芯片二层直接甩回手机。手机拆开包一看就懵了:我明明在等111.72:18080的回话,你给我来个192.168.31.10:5244,查无此人,丢。握手走不完——三次握手的账在TCP那篇里算过——连接就吊死在转圈上。
病根一句话:去的包被路由器改了地址,回来的包没人把地址改回去。去程做了转换,回程被抄了近道,两头对不上账。
路由器做不做回流,决定了三种结果
解决的路子不神秘:路由器在做DNAT的同时,再顺手做一次源地址转换,把手机的31.50也改成路由器自己的31.1。这样NAS的回包就只能老老实实交回路由器,由它把两头的地址都还原了再递给手机。这个额外多做一次源NAT的动作,就是NAT回流。
麻烦在于,这事做不做全看固件脸色,而且大多数家用后台压根不给你一个带「回流」字样的开关。结果就分三种:
| 表现 | 背后原因 | 处置 |
| 在家敲公网IP直接通 | 固件默默做了回流,你感知不到它存在 | 不用管,偷着乐 |
| 在家死活不通、流量秒通 | 固件没做回流,回包被近道截胡 | 本文的土办法绕过去 |
| 时通时不通 | 多半是双栈插一杠:域名有时被解析成IPv6地址,服务却只听IPv4 | 先关设备IPv6试一把再下结论 |
补个十秒检测法,不用翻资料就知道自家机器做没做回流:人在家、手机连着WiFi,浏览器直接敲WAN口那个公网IP加端口——注意敲IP别敲域名,先把DNS解析这环摘出去,免得查错方向。通了,说明固件默默给你做了回流;不通,切流量再敲一遍,流量通就是坐实了。我那台AX3000T测出来就是不通的那一档,所以才养成了在家直接敲31.10的习惯。
具体到阵营:华硕原厂固件一般默认就带回流,梅林固件还在Firewall页签里给了个显式的NAT Loopback选项;OpenWrt的端口转发规则里reflection默认是开着的,刷机党反而少踩这个坑。倒是原厂家用固件鱼龙混杂,腾达水星之流的后台我翻遍了,没这字眼——腾达那篇端口映射里写过「家里WiFi测公网IP不通是假象」,说的就是它。
想在家的也通,三个办法按省事程度排
排第一的最省事:人在家就别绕公网。手机连着家里WiFi的时候,直接敲内网地址192.168.31.10:5244就完了,包连门都不用出。嫌两套地址难记,给常用的电脑改一行hosts,把DDNS域名直接指到31.10,域名照敲,走的却是内网近道。手机不方便改hosts,所以这招主要伺候电脑和NAS自己。
排第二的是升级版,叫内网DNS分置:让路由器下发的DNS把你的DDNS域名在内网里解析成内网IP。设置一次,全家所有设备都生效,比挨台改hosts干净。家用固件支持得参差不齐,OpenWrt上拿dnsmasq做是最顺的。
排第三的才是正面硬解:让路由器自己开回流。梅林在Firewall的NAT Loopback里点开;OpenWrt确认转发规则里reflection没被关;原厂固件后台连这选项都没有的,就别死磕了——它不给你做,你绕着走就行,前两个办法本来就更快。
顺带提醒,这个坑对监控App、家庭助理这类讲究内外网自动切换的软件最不友好:它们有时拿着公网地址在内网里硬连,连不上还不肯降级,卡在那儿干等。真遇到App在家转圈出门正常的,优先查回流。
别把几种病混成一锅炖
「在家测不通」这个症状底下压着好几种病,回流只是其一,动手前先分诊:
| 症状细节 | 病根 | 往哪篇走 |
| 外面通,家里不通 | NAT回流没做 | 本文 |
| 里外都不通 | 压根没公网IP,WAN口100.64开头,白配 | 公网IP自查 |
| 别的端口通,就80和443不通 | 运营商封家宽web口,换高位端口 | 同上 |
| 外面偶尔通时灵时不灵 | 双层NAT叠加或IP漂移,先拆层 | 双重NAT |
| 端口通了但服务报错 | 服务自身防火墙或账号问题 | NAS连接排查 |
大刘那次好在最后切了流量验证,要是闷头在家改一下午,规则改烂了也白搭。所以测试纪律就一条:验证端口转发,人要出门——手机关掉WiFi用流量,是唯一可信的测试姿势。华硕官方FAQ教端口转发时也这么写,让人拿外网设备测。家里通了不代表外面通;外面通了家里不通,先想回流。
收尾:把顺序捋直
人在外,先拿流量测一把定生死;不通就查公网IP,100.64开头判死;通了回家再测,家里不通就是回流,内网IP或者hosts绕过去完事。原厂固件别指望后台翻出回流开关,OpenWrt和梅林用户顺手确认一下选项。真想内外一套地址一劳永逸,上内网DNS分置。
那位问我「包为什么出不了门」的读者,答案现在有了:不是出不了门,是出了门、回来的路被人抄了近道,两头对不上账。路由器这活儿看着憨,地址账本比谁都记得清。
