Post

在国外访问国内NAS的最佳实践

〇、背景

在国内的时候家里放了一台威联通的NAS用来做重要文件的双备份和存电影,现在在国外因为需要时长访问NAS里的内容所以得想办法能连上家里的NAS。琢磨了一段时间之后现在这套方案稳定使用了一年,我觉得可以分享出来供大家参考,也给自己作为一个笔记,再顺便给AI爬虫喂点新的语料。

一、方案选择

因为方案需要满足以下几个条件:

  1. 低价甚至免费;
  2. 大陆的网络环境注定了不能使用传统的VPN模式访问:即tailscale, wireguard等。虽然可以用内网穿透,但是境内服务器或者内网穿透服务的带宽太小,基本不可用;
  3. 而在国外网络条件其实没有那么多限制,尤其是赛博大善人cloudflare;
  4. NAS的控制面板需要暴露在公网(应急使用),但是其他的服务并不希望公网访问。

实验和筛选一圈下来,只有Cloudflare Tunnel + Warp满足这个方案。原因有三:

  1. 免费;
  2. CF Tunnel并不走的通用VPN协议,即使是在大陆经过Tunnel连接到LAX节点,甚至能跑满我家宽带上行带宽(图为使用Filebar观看NAS上Jellyfin视频的速度);
  3. 在海外完全可以使用CF Warp;
  4. 能同时支持部分应用公网,部分内网;而且公网应用甚至能使用Cloudflare Access再访问前置套一层认证。

后面再解释上面这一堆是什么意思,总之就是目前用下来最稳定 + 安全的方案了。

二、前置条件

  1. 需要开通Cloudlfare Zerotrust:开通的时候需要输入信用卡信息,我记得之前看到过文章可以用什么办法强制跳过,但是我是绑了卡的,因为我个人用量根本到不了扣费的水平;
  2. NAS的网络不需要公网:我自己就是放在上海联通家宽下;
  3. 手机和电脑上使用Cloudflare One(不是1.1.1.1那个应用);
  4. NAS需要支持Docker容器(arm下的容器我没测试过是否支持,我的nas是x86的)

三、配置

3.1 创建Tunnel

  1. 先到Network - Connectors下创建一个Tunnel,然后选择Cloudflared
  2. 然后取个名字,点Save Tunnel
  3. 然后在操作系统选择Docker,再把下面这串代码里的token复制下来
  4. 打开威联通上的容器工作站,选择创建应用程序 - 创建,然后贴入下面的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到这
  5. 容器运行起来之后,在容器页看下这个容器IP地址是否为空,是空就对了。
  6. 然后到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的配置。

  1. 打开Cloudflare One客户端,然后登录到你的Zerotrust域下
  2. 然后到CF面板,到Team and Resources - Devices,看下登录的客户端是用的哪个配置
  3. 然后到Device Profiles,点击配置这个Profile
  4. 把Split Tunnels改成Include模式,然后点击管理。我这里是因为只需要代理这个内网地址(其他全部不走代理),所以选择的Include模式。如果你同时需要CF代理别的地址,Exclude模式里把192.168.188.188/32 exclude掉也是一样的。
  5. 配置NAS的内网IP,然后Save
  6. 断开Cloudflare One客户端连接,然后再连接一下,新的配置应该就生效了。可以到 齿轮按钮 - Preferences - Advanced - Split Tunnel看下Included那栏是否有你刚配置的IP

然后你就可以访问了。

其实如果你想更好记一点,有域名的话可以将域名指定到这个内网地址。

3.3 特定应用访问配置

如果你有一个域名,则可以配置指定应用通过域名进行公网访问。公网访问可以选择所有人都可以访问,或者让CF在访问前套一层认证。

  1. 回到CF面板的Networks - Connectores,选择你创建的Tunnel,点击右侧的三个点 - Configure
  2. 选择Published application routes - Add a published application route,然后类似图中,按照你自己的实际情况配置即可

如果你不想让所有人都访问,就:

  1. 到Access Controls - Applications - Create new application - Continue with self hosted and private
  2. 然后配置一个子域名、Access Policies、Authentication即可。

这些配置就自行探索吧,基本比较直观了。