我的公网访问老掉线?原来是运营商偷偷上了 CGNAT 这辆破车
大家好,我是 33blog 的站长。最近在折腾家庭服务器的时候,发现一个特别诡异的现象:明明配置好的公网访问,隔三差五就会莫名其妙断开连接。作为一个老网工,这简直是在挑战我的职业尊严!经过一周的排查,终于揪出了罪魁祸首——运营商偷偷部署的 CGNAT。
症状:像得了间歇性失忆的网络
最开始我以为是路由器的问题,毕竟我的华硕 AC86U 已经服役三年了。但换了新路由器后问题依旧:
- SSH 连接平均 30 分钟必断
- Web 服务访问时灵时不灵
- Ping 测试出现规律性丢包
最气人的是,每次断连后等个 5-10 分钟又自动恢复,活像网络得了阿尔茨海默症。
破案:traceroute 暴露的蛛丝马迹
当我用 traceroute 追踪路由时,发现了个奇怪现象:
$ traceroute example.com
1 192.168.1.1 (我的路由器)
2 100.64.23.17 (嗯?这个 IP 不对劲!)
3 218.85.152.1 (运营商网关)
看到那个 100.64 开头的 IP 了吗?这就是 CGNAT 的典型特征!运营商为了节省 IPv4 地址,偷偷把用户塞进了 Carrier-Grade NAT 的大池子里。
CGNAT 的七宗罪
简单来说,CGNAT 就是运营商级的 NAT 转换:
- 多个用户共享少量公网 IP
- 运营商中间又多了一层 NAT
- 会话超时时间被强制缩短
这就好比把 10 户人家塞进一个三室一厅,厕所还要排队用,能不经常出问题吗?
我的自救方案(亲测有效)
经过和运营商斗智斗勇,总结出几个解决方案:
方案一:死磕客服要公网 IP
我直接打电话给运营商:”我是做网络直播的,需要固定公网 IP”。客服开始装傻,我就搬出《电信条例》第二十一条,最后成功要到了静态公网 IP。
方案二:IPv6 曲线救国
如果运营商支持 IPv6(现在基本都支持了),可以:
# 路由器开启 IPv6 穿透
sysctl -w net.ipv6.conf.all.forwarding=1
实测 IPv6 基本不受 CGNAT 影响,速度还更快。
方案三:内网穿透工具
作为备选方案,我测试了几个工具:
- frp:配置稍复杂但性能最好
- ZeroTier:适合组虚拟局域网
- Tailscale:基于 WireGuard 的超简方案
血的教训
这次踩坑让我明白:现在的家庭宽带已经不再是”给个光猫就能用”的时代了。建议各位:
- 新装宽带时一定要问清楚是否 CGNAT
- 定期检查自己的公网 IP 是否真实
- 重要服务尽量上云或者用 IPv6
如果你也遇到类似问题,欢迎在评论区交流。下次我准备写写《如何用树莓派搭建 CGNAT 检测器》,感兴趣的话记得订阅哦!
原来如此!我说怎么最近远程访问家里NAS老是断连,看来也得找运营商撕逼去了 😤
IPv6确实是个好办法,我们公司内网现在都用IPv6了,速度比IPv4稳定多了
哈哈哈这个比喻太形象了!”10户人家塞进三室一厅”,运营商也太抠门了吧