距离上一次把NAS装好也过去了一段时间,基础的服务都跑起来了,局域网内的体验没什么问题,Docker上部署的几个服务也一直很稳。
但有一件事从装机第一天就让我很不爽——外网访问。
外网访问
装NAS的初衷之一就是在外地也能随时访问家里的文件,但事实证明,这个需求比我想象中难搞得多。
我最初的方案是IPv6 + Zerotier打洞,听起来很美好:两边都有公网IPv6,如果遇到不支持IPv6的网络环境,也可以使用Zerotier负责穿透,理论上P2P直连,速度应该杠杠的。
实际上跟shit一样。
首先我家的NAS接的是电信宽带,现在手机流量套餐基本上都支持IPv6了,但路由器的IPv6适配良莠不齐。公司WiFi、商场热点、甚至连一些朋友家的路由器,要么没开IPv6,要么防火墙策略直接把入站流量全拦了。
说白了就是能不能连上完全看命。
更让人绷不住的是跨运营商的IPv6带宽。有一次坐车回家的路上,想看看NAS里的番打发时间,结果一个720p低码率的视频愣是加载了半天。移动的热点连电信的宽带,中间那点带宽全被跨网QoS吃干净了,卡得像在用什么上古拨号上网。
Zerotier打洞成功率也不稳定,有时候直连确实能跑起来,但更多时候莫名其妙就走的转发服务器,延迟直接飙到几百毫秒。
这条路走到头了,结论很明确:IPv6 + Zerotier在国内这种复杂的网络环境下根本不靠谱。跨运营商的带宽、路由器的适配、防火墙策略,每一个环节都可能卡你一下。
既然P2P打洞走不通,那就只能老老实实走中转——用frp内网穿透。
frp内网穿透
思路很简单:租一台有公网IP的服务器跑frp服务端(frps),NAS上跑客户端(frpc)把内网端口映射出去。外网访问的时候直接连服务器的公网IP+端口,请求会通过frp隧道转发到NAS上。
不走P2P,不走IPv6,就是最传统的C/S转发,稳如老狗。
方案选择
市面上提供frp穿透服务的商家不少,比较常见的有:
- 樱花frp:老牌服务商,免费额度够轻度使用,但带宽和流量限制比较紧
- 雨云frp:按量付费,灵活度高,适合不想自己搭服务端的人
但这些第三方服务的机房大多在国内,想用80和443端口的话必须域名备案。说到备案,我这个幽灵域名的情况实在是一言难尽,走国内服务器这条路基本不用想了。
所以我选了一家支持香港节点的服务商,服务器就定在香港。
为什么选香港
就一个原因:不需要备案。
香港的服务器不在大陆的ICP备案管辖范围内,80和443端口可以直接用。这意味着我可以用自己的域名直接访问NAS上的Web服务,不用在后面加一串奇怪的端口号。
虽然香港到大陆的延迟比国内BGP高一点,但带宽稳定性没问题。而且frp本身是TCP长连接,那点延迟在实际使用中几乎无感。
部署过程比预想的顺利,frp隧道成功打通。
frpc的配置文件大致如下:
# frpc.toml
serverAddr = "你的服务器IP"
serverPort = 7000
auth.method = "token"
auth.token = "你的认证token"
user = "你的用户标识"
[transport]
protocol = "tcp"
[transport.tls]
enable = true
[[proxies]]
name = "影视"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5139
remotePort = 8091
[[proxies]]
name = "图床"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080
每个 [[proxies]] 块就是一条穿透规则:把NAS本地 localPort 映射到服务器的 remotePort,外网访问 服务器IP:remotePort 就能直达内网服务。
服务端frps的配置则简单得多:
# frps.toml
bindAddr = "0.0.0.0"
bindPort = 7000
auth.method = "token"
auth.token = "你的认证token"
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "你的仪表盘密码"
# TLS 可选,生产环境建议开启
# transport.tls.force = true
# transport.tls.certFile = "/etc/frp/ssl/server.crt"
# transport.tls.keyFile = "/etc/frp/ssl/server.key"
# transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"
webServer 是frp自带的管理仪表盘,端口7500,打开就能看到各客户端的连接状态和流量统计。
测了一下速度,和之前Zerotier那个720p都要转半天的体验比起来,简直一个天一个地。
图床部署
frp通了之后,我顺手在NAS上搭了一个图床。
说实话,被图床服务商牵着鼻子走的感觉憋屈太久了。这两年写博客,图床换了又换,从imgdb再换到路过图床,每次迁移图片都是一场灾难。不是限速就是删图,要不就是哪天突然关站跑路,一堆文章图片全变成裂开的链接。
现在好了,图床直接跑在自己的NAS上,通过frp暴露到公网。图片在自己硬盘里躺着,谁也删不掉,谁也限不了速。唯一的上限就是服务器的带宽,但日常写博客完全够用了。
回头看看这个博客里那几百张散落在各个图床的图片,有一种终于翻身做主人的感觉。
总结
搞了这么一圈,最大的收获不是一个能用的外网方案,而是一种”我的数据我做主”的踏实感。
从Zerotier翻车到frp打通,再到部署自己的图床,每一步都在把主动权从各种服务商手里拿回来。网盘靠不住,图床靠不住,P2P打洞也靠不住——但有台NAS加一台香港服务器,很多事就不用再看别人脸色了。
有些东西看着简单,实际做起来全是细节,折腾无止境。
