记一次 NAT3 环境下的 NAS 远程访问踩坑之旅
我在安徽家里部署了 NAS(飞牛 OS),想着江苏那边也能随时看下载好的电影。家里的上传带宽很高,理论上应该挺顺畅的。
结果折腾了一整天,才发现这事儿远没那么简单。
一开始的想法
我想法很简单:安徽有 IPv6,理论上直接访问不就行了吗?
我用的是飞牛 OS,装了 ZeroTier 和 Tailscale,想着打洞成功就能点对点直连。但现实很骨感——这两个工具都无法打洞成功,只能走慢得要死的中继模式。
IPv6 直连的坑
首先确认了家里确实有 IPv6 地址,格式大概是这样:
240e:b67:3d9e:9600:eaff:1eff:fedf:a813
但在江苏这边访问的时候遇到了一堆问题。
坑一:光猫的 IPv6 防火墙
我一开始用 Mac 的 ping6 测试,一直显示 Unknown host。后来才发现江苏这边虽然没 IPv6,但手机热点是有的。
真正的问题是安徽家里的光猫默认开启了 IPv6 SPI 防火墙,允许内网访问外网,但严禁外网主动发起连接。这就是为什么我用浏览器打不开 http://[IPv6]:18080 的原因。
用 nc -6 -vz 测试端口的时候发现能连上(succeeded),但浏览器就是打不开,这种"能打通电话但一开口说话就挂断"的感觉很诡异。
坑二:Clash Verge 的干扰
我电脑上装了 Clash Verge,这个是个大坑。
Clash 的日志一直报 ip version error 或者 i/o timeout。后来发现是 Clash 的 DNS 模块在处理 IPv6 请求时出问题了。
在 Clash 的配置文件里加上这些就好了:
yaml
ipv6: true
prepend-rules:
- IP-CIDR6,240e:b67:3d9e:9600::/64,DIRECT,no-resolve
- IP-CIDR6,240e::/16,DIRECT,no-resolve
tun:
skip-proxy:
- "240e:b67:3d9e:9600::/64"
- "240e::/16"
但即使这样,curl 能返回 200 OK,浏览器还是打不开,显示 Empty reply from server。
真相大白:NAT3
折腾到最后,我装了 Lucky 工具来检测网络环境,结果显示:
NAT类型检测:NAT3(Port-Restricted Cone,端口受限锥形)
这就解释了所有问题。
什么是 NAT123?
简单来说,NAT 是你家路由器把"私有局域网 IP"转换成"公网 IP"的技术。数字越大,这道门就越"死板",外网想连进你就越难。
- NAT1:完全开放型。任何人都能连回来,打洞 100% 成功。
- NAT2:受限锥形。看"熟脸",但换个端口也行。
- NAT3:端口受限型。不仅看"熟脸",还得看"对应的窗户"。这就是我的情况。
- NAT4:对称型。基本是死路一条。
NAT3 的规则是:你必须先主动给某个 IP 的某个端口发过包,只有那个 IP 的那个特定端口才能连回你。换个端口都进不来。
这也解释了为什么 ZeroTier 和 Tailscale 都无法打洞成功——在 NAT3 环境下,它们只能走慢速的中继服务器。
桥接模式是什么?
有人建议我把光猫改成"桥接模式"。
简单来说,桥接模式就是把光猫从一个"管得宽的管家"变成一个"透明的传声筒"。光猫只负责光电转换,拨号上网的任务交给自己的路由器。
改成桥接后,NAT 等级通常会从 NAT3 提升到 NAT1 或 NAT2,打洞成功率会大幅提升。
但我在江苏,没法物理接触安徽的光猫。远程操作改桥接风险太大,一旦断网就彻底失联了。
最终方案:云盘中转
既然 NAT3 环境下打洞这么难,我决定换个思路。
飞牛 OS 自带了网盘备份与同步功能。我的方案是这样:
- 在飞牛后台绑定阿里云盘
- 设置自动同步规则,把下载文件夹同步到云盘
- 在江苏直接用阿里云盘 App 看
这样完全避开了 NAT3 的限制,因为 NAS 扮演的是"客户端",主动把数据推出去,这在任何 NAT 环境下都是畅通无阻的。
一些技术细节
Lucky STUN 打洞 vs ZeroTier/Tailscale
两者都是为了让外网能访问内网,但原理不同:
- Lucky STUN:探测光猫分配的公网端口,建立 1:1 的访问通道
- ZeroTier/Tailscale:建立加密隧道,把两台设备放在同一个"虚拟局域网"
在 NAT3 环境下,Lucky STUN 需要的是"安徽端"能穿透,而 ZeroTier/Tailscale 追求的是双向对称打洞,所以后者更难成功。
那些有用的命令
bash
# 测试 IPv6 连通性(需要加引号)
curl -v -g -6 "http://[240e:b67:3d9e:9600:eaff:1eff:fedf:a813]:5666/"
# 测试端口是否开放
nc -6 -vz 240e:b67:3d9e:9600:eaff:1eff:fedf:a813 16601
# Ping 测试(带大包测试 MTU)
ping6 -s 1400 240e:b67:3d9e:9600:eaff:1eff:fedf:a813
# 查看 IPv6 地址
ifconfig | grep inet6
总结
这次折腾让我明白了几件事:
- IPv6 虽好,但光猫的防火墙是个大坑
- Clash 这类代理软件会干扰 IPv6 访问,需要配置绕过规则
- NAT 类型决定了你能否成功打洞,NAT3 是个硬伤
- 如果人在异地无法改桥接,云盘中转是最稳妥的方案
最后我选择了飞牛 OS + 阿里云盘的方案。虽然不是直接访问 NAS,但胜在稳定可靠,不用再跟各种网络协议死磕了。
有时候曲线救国,比直线撞墙要实用得多。