让家庭 NAS 服务可外网访问:绿联 DX4600 部署 frpc 实现基于公网服务器的内网穿透

目录
[隐藏]

本文以基于绿联 dx4600 上的实践为例,主要介绍家庭 NAS 部署 frpc 实现内网穿透的详细方法与步骤。

1 服务器安装与配置 frps

frp 服务分为服务端 frps 和客户端 frpc。搭建 frps 的前提条件是需要拥有一台公网 IP 的服务器。如阿里云与腾讯云99元左右一年的云服务器就很合适。

首先登录服务器 SSH,然后安装 FRP:

# 下载 frp 0.58.1
# 注意,你实际要下载的版本(替换版本号即可),要与 nas 上安装的 frpc 服务保持一致,并与服务器系统架构要相符。这里以常见的 amd64 为例
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz

# 使用 tar 指令解压
tar -zxvf frp_0.58.1_linux_amd64.tar.gz

# 安装到 /usr/local/frp 目录。这一步是可选的,安装到任意位置都行
mv frp_0.58.1_linux_amd64 /usr/local/frp

# 进入 frp 目录
cd /usr/local/frp

修改服务器配置文件 frps.toml

vi frps.toml

配置内容参考:

[common]
# 要绑定的端口,可自定义修改一下
bindPort = 7000
quicBindPort = 7001
kcpBindPort = 7000

# 公网服务访问的端口,可通过 http:[域名]:[端口] 形式访问
vhostHTTPPort = 7701

# 安全授权 token,防止端口被扫描到后可以被任意客户端连接
auth.token = "12345678"
# 自定义日志保存路径
log.to = "/home/logs/frps.log"

# 控制台的用户名
dashboardUser = lzwme
# 控制台的密码
dashboardPwd = password
# 控制台的端口
dashboardPort = 7750

在当前目录下输入如下命令启动服务端服务:

frps -c frps.toml

如果希望断开 ssh 后依然在后台运行,可以使用 screen 命令启动服务端:

screen frps -c frps.toml

当然,我们也可以设置 frps 服务开机自启动,方法参考如下。

创建后台启动服务文件:

vi /etc/systemd/system/frp.service

内容参考如下:

[Unit]
Description=frps
After=network.target

[Service]
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml

[Install]
WantedBy=multi-user.target

相关操作命令参考:

# 启动测试
systemctl start frp.service
# 查看启动状态
systemctl status frp.service
# 开机自启
systemctl enable frp.service

当服务端启动后,可以通过 dashboardPort 的端口号访问控制台。如:http://1.2.3.4:7750

2 绿联 NAS 基于 docker 安装与配置 frpc

绿联 NAS 的 docker 功能需要用 PC 电脑登录后从​浏览器访问。打开 docker,在 “镜像管理-远程仓库” 中,搜索 frpc 镜像并下载:snowdreamtech/frpc

下载完成后,在 “容器管理” 添加镜像,需要注意的设置有:

  • 网络 - 网络名称 那里,需选择 host。这样在 frpc.toml 中就不需要设置 localIP 了。

  • 选择一个磁盘,新建目录 /docker/frp
  • 磁盘空间 那里添加一个映射:/docker/frp,装载路径设置为 /etc/frp

新建文件 frpc.toml 并上传至 NAS 磁盘 /docker/frp 目录下。内容参考:

[common]
# 服务器的 IP
serverAddr = 1.2.3.4
# 服务器上设置的服务绑定端口(frps.toml 中的 bindPort)
serverPort = 7000

# 安全授权 token,需与服务端设置一致
auth.token = 12345678
log.to = "/etc/frp/frpc.log"

# 示例一:配置一个本地的 http 服务穿透
# 例如本地访问地址为: http://192.168.31.10:5678
# 公网穿透后以域名形式访问: http://tool.lzw.me:7701
[[proxies]]
name = "tool"
type = "http"
# 本地 http 服务的端口号
localPort = 5888
customDomains = ["tool.lzw.me"]

# 穿透一个本地端口号为 3001 的服务,公网以 test1.lzw.me:7701 访问
[[proxies]]
name = "test1"
type = "http"
localPort = 3001
customDomains = ["test1.lzw.me"]

配置好后启动该 docker 容器服务即可。

3 几种 frp 穿透服务的访问形式与配置

下面我们以 NAS 上部署的小雅服务(本地端口 5678)为例,介绍实现在公网访问穿透服务的几种方式。

对于 frpc 客户端来说,在 frpc.toml 中新增如下配置并重启 docker 服务,即可配置好本地小雅服务的穿透访问:

[[proxies]]
name = "xiaoya"
type = "http"
localPort = 5678
customDomains = ["xiaoya.lzw.me"]

3.1 方式一:以域名+端口形式访问

本方式你需要拥有一个域名,并且:

  • 将域名解析至公网服务器 IP
  • 服务器需开放 vhostHTTPPort 设置的端口从公网访问

然后即可直接以http://域名:端口的形式访问。以上述示例为例:http://xiaoya.lzw.me:7701

3.2 方式二:以IP + 端口形式访问

阿里云和腾讯云绑定域名需要域名备案。如果没有可用的域名,也可以通过 nginx 反向代理配置的方式,以 IP + 端口形式访问。我们仍以前面介绍的小雅服务为例,frp 服务端和客户端相关配置不变,nginx 配置参考如下:

server {
    listen 5678;

    location / {
        proxy_pass http://localhost:7701;
        proxy_store off;
        proxy_redirect off;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 重点在这里:通过设置 header Host 方式伪装请求域名
        proxy_set_header Host xiaoya.lzw.me;
    }
}

3.3 方式三:以 https + 域名 形式访问

web 服务使用 https 是提供安全访问最基本的要求。这里仍需要借助 nginx 反向代理配置方式实现,参考如下:

server {
    listen 443 ssl http2;
    server_name qinglong.lzw.me # 青龙面板
    60s.lzw.me # 每日早报服务
    xiaoya.lzw.me; # 小雅服务

    # 这里是使用了泛域名的 SSL 证书
    ssl_certificate /etc/nginx/acme.sh/lzw.me/fullchain.pem;
    ssl_certificate_key /etc/nginx/acme.sh/lzw.me/key.pem;

    location / {
        proxy_pass http://localhost:7701;
        proxy_store off;
        proxy_redirect off;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 重点在这里:通过读取 $host 变量并设置为 header Host 以区分
        proxy_set_header Host $host;
    }

    # qinglong.lzw.me
    # 青龙服务 websocket 代理
    location /api/ws/ {
        proxy_pass http://localhost:7701/api/ws/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

    # include ssl-public.conf;
    access_log  /wwwlogs/frp-nas.log  access;
}

上面的示例使用了泛域名 SSL 证书,只需要一个 server 配置,即可完成多个不同域名的代理转发,后续新增其他服务,只需要在 server_name 那里新增一行对应的域名即可。

如果你没有泛域名 SLL 证书,可以参考这篇文章: 基于 acme.sh 和 dnspod API 自动生成与更新网站泛域名证书

4 使用免费的第三方 frps 服务

如果没有公网服务器,也可以使用第三方提供的免费服务,具体用法与配置可参见各服务提供者的帮助文档。以下是一些提供免费 frp 服务的第三方站点参考:

  • https://freefrp.net
  • https://www.hayfrp.org
  • https://www.chmlfrp.cn
  • https://www.locyanfrp.cn
  • https://muhanfrp.cn
  • https://www.natfrp.com

5 总结

本文以基于绿联 dx4600 上的实践为例,主要介绍了基于 frp 实现家庭 NAS 服务内网穿透以实现公网访问的配置方式,并介绍了基于 nginx 反向代理配置实现不同访问形式的方法。

需要注意的是,你需要拥有一台有公网 IP 的服务器,并最好拥有一个域名。否则可以尝试使用第三方提供的 frps 服务,如果第三方免费服务的稳定性满足不了需求,也可以考虑付费购买性能更好的 VIP 服务。

另外,本站在几年前也写过基于 frp 内网穿透的文章,最近根据 frp 最新版本做了更新,若有兴趣可进一步阅读: 使用 FRP 实现在家远程桌面到公司内网进行远程办公

点赞 (0)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code