本文以基于绿联 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 实现在家远程桌面到公司内网进行远程办公