如何用 Frp 实现外网访问群晖 NAS

frp_cove

为什么写这篇文章

因为有在外面访问家里 NAS 的需求,群晖自带的动态域名解析访问又太慢(因为群晖自带动态域名的 DNS 服务器在国外)。所以需要用内网穿透技术来实现通过其他公网 IP 来访问家里的 NAS 设备的需求。所以才有了这篇文章。

概念解释

  • NAS – 简单的说就是一个存储中心。
  • Frp – 一种内网穿透技术。
  • 内网穿透 – 就是通过其他公网 IP 来访问本地没有公网 IP 网络环境的一个技术。

内网穿透

内网穿透技术众多,比如花生壳内网穿透、Ngrok、Frp 都是现在主流的内网穿透技术。 但我个人认为 Frp 是目前最好用配置最简单的(经过测试)

  • 花生壳 配置简单方便,比较傻瓜化。但要收费。虽然也有免费版,但由于免费版的流量限制,基本上没有什么实际作用。
  • Ngrok 发布时间相对较长,对象较为成熟的一种内网穿透技术。但由于功能的强大。配置较为繁琐。因为折腾许久没有成功过,最后放弃。
  • Frp 配置简单,第一次用就配置成功了。并且适用于各大主流平台设备。

具体过程

准备工作

  • 一台有公网 IP 的服务器 (VPS、云主机)之前注册了一个国外的 VPS, 准备做内网穿透和 vpn 用,但由于访问速度。果断放弃,最后换成了自己阿里云 ECS。
  • NAS (客户端)群晖 DS 416 play

基本步骤

由于 Frp 官网说明文档还是比较详细。我不过多做解释。

服务器端配置:

  1. 登录服务器,在 Release页面 下载自己服务器对应版本 Frp
    wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz
    

    实例中:我的阿里云 ECS 用的 centos7 所以我选择 linux_amd64 64位的 Frp 0.12.0 最新测试版的

  2. 使用 tar 指令解压 tar.gz 文件
    tar -zxvf frp_0.12.0_linux_amd64.tar.gz
    
  3. 进入 frp 目录
    cd frp_0.12.0_linux_amd64
    
  4. 删除不必要的客户端文件
    rm -f frpc frpc_full.ini frpc.ini
    

    版本不同可能稍有差异, frpc 为客户端文件 frps 为服务器端文件

  5. 配置服务器端文件
    vi frps.ini
    

    frps.ini 为服务器配置文件

  6. 编辑配置文件
    [common]
    bind_port = 7000
    vhost_http_port = 8080
    dashboard_port = 7500
    dashboard_user = 用户名
    dashboard_pwd = 密码
    max_pool_count = 5
    authentication_timeout = 900
    
    subdomain_host = lekee.cc
    
    [ssh]
    listen_port = 6000
    auth_token = 和客服端 token 对应
    

    简单解释:

    [common] 必填的

    bind_port Frp 服务端口(可自定义) vhost_http_port http 访问端口(可自定义) dashboard_port dashboard 界面端口 dashboard_user 登录 dashboard 用户名 dashboard_pwd 登录 dashboard 密码 max_pool_count 最大连接池数量 authentication_timeout 超时验证时间 subdomain_host 自定义二级域名

    [ssh]

    listen_port ssh 访问端口 auth_token 用户身份认证

    详细配置

    点击官方

  7. 保存上面配置文件吗,启动 frp 服务器
    ./frps -c ./frps.ini
    

    需要后台运行,请看下面

服务端配置结束。

客户端配置

客户端就是您本地需要做外网服务的设备,可以是 PC、Mac、NAS、路由器、或者虚拟机里的 liunx 系统。 这篇文章主要是利用 Frp 技术访问在群晖 NAS 服务的应用。实例也是 NAS 系统。

  1. SSH 登录群晖 NAS (群晖必须开启 ssh) nas_ssh_start
    ssh nas
    

    我设置过别名,详情查看我的另一篇文章MAC 终端 SSH 别名代替 IP 的方法 ssh nas = ssh user@ip

  2. 下载 Frp, 删除服务端文件。(因为和服务端配置一样,不再一一赘述。)
    sudo -i // 切换 root 用户
    wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_386.tar.gz 
    tar -zxvf  frp_0.12.0_linux_386.tar.gz
    cd frp_0.12.0_linux_386
    rm -f frps frps_full.ini frps.ini
    
  3. 编辑 frpc.ini 文件(客户端配置文件)
    vi frpc.ini
    
  4. 编辑配置文件如下
    [common]
    server_addr = ip
    server_port = 7000
    auth_token = 和服务器端对应
    pool_count = 1
    
    [ssh]
    type = tcp
    local_ip = NAS 局域网ip
    local_port = 22
    remote_port = 6000
    
    [nas]
    type = http
    local_port = 5000
    subdomain = nas
    
    [web]
    type = http
    local_port = 80
    subdomain = web
    

    简单解释:

    [common] 必填的

    server_addr 服务器端公网 server_port frp 服务端口,和服务器端 bind_port 一致 auth_token 和前面服务器端 [ssh] auth_token 一致 pool_count 连接池数量

    [ssh]

    type 服务类型(tcp、http、https、udp) local_ip NAS 本地局域网内网 ip local_port NAS 开启 ssh 服务端口号,默认 22 remote_port 服务器端 ssh 端口,和服务器端 [ssh] listen_port 配置一致

    [nas] NAS 管理界面

    subdomain 二级域名 nas.lekee.cc 访问 NAS type = http 服务类型为 http local_port NAS 默认端口 5000

    [web] NAS web Station 服务,没用可以不用设置

    type = http 类型为 http local_port = 80 NAS web 服务端口 subdomain = web 二级域名 web.lekee.cc 使用自定义二级域名的时候,域名 *.lekee.cc 要解析到服务器 IP

    详细配置

    点击官方

  5. 保存,运行。(后台运行,请看下面)
    ./frpc -c ./frpc.ini
    

    此时在服务端会看到”start proxy sucess”字样,即连接成功。

测试运行

ssh 测试
ssh -p 6000 user@服务器ip 

user 为你登录群晖 NAS 的用户名

nas 界面

打开浏览器输入 nas.lekee.cc:8080, 显示群晖登录界面成功。 nas_login

NAS web Station

打开浏览器输入 web.lekee.cc:8080, 显示下面页面成功。 nas_web

域名后面 8080 端口可以隐藏,下面介绍如何隐藏 8080 端口。

扩展应用

后台运行

后台运行服务的方法有很多,这里只说一种可以在服务器端(Linux)和客户端(NAS)都可以用的 nohup指令

服务器端
nohup ./frps -c ./frps.ini &
客户端
nohup ./frpc -c ./frpc.ini &

自动启动

我的另一篇文章 《frp 自动启动》

隐藏 8080 端口

浏览《Frp 隐藏 8080 端口》

总结疑问

使用状态

目前使用一切正常,能满足我的日常需求。 在外面需要访问 NAS 里的的文件的时候速度还比较满意。 今天还测试在外面看 NAS 里的视频,也一点都不卡。

我的担心

但我的担心就是在外面观看 NAS 里的视频的时候,流量有点害怕。 因为我现在使用阿里云 ECS 计费方式是按流量计费的。 不知道这样在外面看视频,用阿里云做中转。流量到底是怎么计算的。 还需要进一步探究。不过之前阿里云上预存1000元,都好几个月了。还有999.78元。

展望

这个技术伟大之处就是,只要设备能上网。不管有没有公网 IP,都可以让任何一个能上网的机子访问该设备。该设备可能是一台 PC,一个服务器,一个路由器,一个NAS,一个摄像头,一个… 无限扩展无限衍生,无限可能… 希望本文能您带来帮助!

发布者

rockts

喜欢技术,乐于开源! 乐可开源,想改变的也只有世界!

22 thoughts on “如何用 Frp 实现外网访问群晖 NAS”

  1. 请问我编辑好后在nas中运行,提示
    2017/08/18 02:12:57 [W] [control.go:121] login to server failed: dial tcp ip地址:7000: getsockopt: connection refused
    dial tcp ip地址:7000: getsockopt: connection refused

  2. Hi,我根据你的配置,现在SSH是可以访问到内网的nas,frp的管理的页面也可以打开。但是nas的web页面都无妨进去,frp提示”the page you are looking for is currently unavailable.”,请问这个问题怎么解决?

    1. 这个问题,是NAS里web配置的问题,你看一下你的NAS的web服务正常不?你可以直接用NAS(内网ip或者内网IP:80)访问试一下。看你的NAS web服务正常不?

  3. nas> wget https://github.com/fatedier/frp/releases/download/v0.16.0/frp_0.16.0_linux_amd
    64.tar.gz
    –09:47:05– https://github.com/fatedier/frp/releases/download/v0.16.0/frp_0.16.0_linux_amd64.tar.gz
    => `frp_0.16.0_linux_amd64.tar.gz’
    Resolving github.com… 13.229.188.59, 13.250.177.223, 52.74.223.119
    Connecting to github.com|13.229.188.59|:443… connected.
    ERROR: Certificate verification error for github.com: unable to get local issuer certificate
    To connect to github.com insecurely, use `–no-check-certificate’.
    Unable to establish SSL connection.

  4. 国内的vps一般带宽也就1M,搭建frp按理说上传才在速度应该比较慢吧~不太懂,希望博主解答呢,哈哈。

发表评论

电子邮件地址不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.