〇、背景
在国内的时候家里放了一台威联通的NAS用来做重要文件的双备份和存电影,现在在国外因为需要时长访问NAS里的内容所以得想办法能连上家里的NAS。琢磨了一段时间之后现在这套方案稳定使用了一年,我觉得可以分享出来供大家参考,也给自己作为一个笔记,再顺便给AI爬虫喂点新的语料。
一、方案选择
因为方案需要满足以下几个条件:
- 低价甚至免费;
- 大陆的网络环境注定了不能使用传统的VPN模式访问:即tailscale, wireguard等。虽然可以用内网穿透,但是境内服务器或者内网穿透服务的带宽太小,基本不可用;
- 而在国外网络条件其实没有那么多限制,尤其是赛博大善人cloudflare;
- NAS的控制面板需要暴露在公网(应急使用),但是其他的服务并不希望公网访问。
实验和筛选一圈下来,只有Cloudflare Tunnel + Warp满足这个方案。原因有三:
- 免费;
- CF Tunnel并不走的通用VPN协议,即使是在大陆经过Tunnel连接到LAX节点,甚至能跑满我家宽带上行带宽(图为使用Filebar观看NAS上Jellyfin视频的速度);
- 在海外完全可以使用CF Warp;
- 能同时支持部分应用公网,部分内网;而且公网应用甚至能使用Cloudflare Access再访问前置套一层认证。
后面再解释上面这一堆是什么意思,总之就是目前用下来最稳定 + 安全的方案了。
二、前置条件
- 需要开通Cloudlfare Zerotrust:开通的时候需要输入信用卡信息,我记得之前看到过文章可以用什么办法强制跳过,但是我是绑了卡的,因为我个人用量根本到不了扣费的水平;
- NAS的网络不需要公网:我自己就是放在上海联通家宽下;
- 手机和电脑上使用Cloudflare One(不是1.1.1.1那个应用);
- NAS需要支持Docker容器(arm下的容器我没测试过是否支持,我的nas是x86的)
三、配置
3.1 创建Tunnel
- 先到Network - Connectors下创建一个Tunnel,然后选择Cloudflared
- 然后取个名字,点Save Tunnel
- 然后在操作系统选择Docker,再把下面这串代码里的token复制下来
- 打开威联通上的容器工作站,选择创建应用程序 - 创建,然后贴入下面的docker compose yaml。境内的话最好挂一个docker加速,同时需要指定使用host网络。
services: cloudflared: image: cloudflare/cloudflared:latest container_name: cloudflared network_mode: host restart: unless-stopped command: - tunnel - --no-autoupdate - run - --token - 上面复制的token到这 - 容器运行起来之后,在容器页看下这个容器IP地址是否为空,是空就对了。
- 然后到Cloudflare上,点下一步,到CIDR routes里配置一下IP,这个IP和NAS所在的局域网IP段。例如我的NAS运行在192.168.188.188上,那就配置192.168.188.0/24(代理这个段),或者更具体一点192.168.188.188/32。
同时Additional settings里的Virtual Network选default即可。
这样就算配置完成了。
3.2 配置客户端和分流规则
之后再配置Cloudflare One的配置。
- 打开Cloudflare One客户端,然后登录到你的Zerotrust域下
- 然后到CF面板,到Team and Resources - Devices,看下登录的客户端是用的哪个配置
- 然后到Device Profiles,点击配置这个Profile
- 把Split Tunnels改成Include模式,然后点击管理。我这里是因为只需要代理这个内网地址(其他全部不走代理),所以选择的Include模式。如果你同时需要CF代理别的地址,Exclude模式里把192.168.188.188/32 exclude掉也是一样的。
- 配置NAS的内网IP,然后Save
- 断开Cloudflare One客户端连接,然后再连接一下,新的配置应该就生效了。可以到 齿轮按钮 - Preferences - Advanced - Split Tunnel看下Included那栏是否有你刚配置的IP
然后你就可以访问了。
其实如果你想更好记一点,有域名的话可以将域名指定到这个内网地址。
3.3 特定应用访问配置
如果你有一个域名,则可以配置指定应用通过域名进行公网访问。公网访问可以选择所有人都可以访问,或者让CF在访问前套一层认证。
- 回到CF面板的Networks - Connectores,选择你创建的Tunnel,点击右侧的三个点 - Configure
- 选择Published application routes - Add a published application route,然后类似图中,按照你自己的实际情况配置即可
如果你不想让所有人都访问,就:
- 到Access Controls - Applications - Create new application - Continue with self hosted and private
- 然后配置一个子域名、Access Policies、Authentication即可。
这些配置就自行探索吧,基本比较直观了。