最近从一款游戏(台服MapleStory枫之谷)退坑,手头上回收了一点资金,想着家里的Unraid处于无校验盘状态,感觉实在有点危险,毕竟这台NAS主机是家人共用,并且我自身也有不少重要数据存放在里面,于是就咬咬牙买了一台群晖DS920+,打算先在公司宿舍跑起来,后续再搬回家里重新部署使用。(所以后续还会有一点小更新)

 title=

这时出现了点小问题,公司宿舍集体报装的宽带,480元2年100M,属于酒店商用无线WIFI路由器的宽带方案,理所当然地就不享受公网IP的待遇,所幸的是上游网关并没有限制太狠,高位端口都处于开放状态,所以就能使用一些内网穿透方案实现外部远程访问。

原本我还想着直接利用wireguard或者zerotier之类的虚拟局域网手段,但考虑到每台设备都要配置一次客户端,还要手动启动接入太麻烦了,加上目前这台云服务器的流量基本用不完,对接群晖DSM和qbittorrent管理界面之类的流量开销也不大,于是决定转向FRP方案

说在开头

我个人比较折腾,群晖的DSM门户访问默认使用5000和5001端口(分别对应http和https),而80和443通常会被web station之类的其他应用占用,为了尽可能不改动群晖的网络配置(其实是因为我没完全搞懂群晖系统内部是怎么配置网络的),而使用FRP穿透方案可以不用每次访问都指定5001端口访问https,所以下面的描述还涉及反向代理配置

一通糊弄之后,就实现了 https://ds920.abc.com访问绝大部分群晖服务的效果,后续还能通过ds920.abc.com:20000实现SSH接入群晖后台

拓补图大致如下,其中ssl证书部分由云服务器的nginx反代提供,相对应地也要把证书导入到群晖中

请输入图片描述

环境总览

服务端: 云服务器, ubuntu 22.04
客户端: 群晖DS920+, CPU: J4125

下载FRP

[https://github.com/fatedier/frp/releases]()

根据系统和架构下载对应版本,这里服务端和客户端都是选择linux_amd64

找办法上传到双方后,解压 tar -xvf frp_*_linux_amd64.tar.gz得到如下文件

root@VM-20-5-debian:/home/frp# tree -L 2
.
├── frp_0.44.0_linux_amd64.tar.gz
├── frpc
├── frpc_full.ini
├── frpc.ini
├── frps
├── frps_full.ini
├── frps.ini
├── frps.log
└── LICENSE

其中 frps是服务端,frpc是客户端

配置FRP

服务端
配置frps.ini
[common]
bind_port = 7000
vhost_http_port = 5000
vhost_https_port = 5001
# 为了有那么点安全性, 这里添加了token与客户端通信
token = 123456789@syno
use_compression = true
use_encryption = true

# 以下是frps自带的查看面板, 不需要可以去掉不写
dashboard_port = 10000
dashboard_user = zakikun
dashboard_pwd = 123456789@frps

# 以下是日志相关, 不需要可以去掉不写
log_file = /home/frp/frps.log
log_level = info
log_max_days = 3

然后就可以通过 ./frps -c frps.ini启动frps,出现 start proxy success之类的信息则启动成功,如果有端口占用等情况出现请自行排查

开机启动frps

虽然云服务器不是经常重启,但每次都要手动启动frps的话就未免太不优雅了,写一下service让它开机启动

vim /usr/lib/systemd/system/frps.service

[Unit]
Description=Frp Server Service
After=network.target
 
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/home/frp/frps -c /home/frp/frps.ini
 
[Install]
WantedBy=multi-user.target

最后运行 systemctl enable frps启用开机启动,从这之后如果想停止或启动frps,可以用 systemctl start/stop frps代替上面的启动方法

客户端

通过[https://ds920.abc.com]()访问群晖DSM和20000端口访问SSH为例

配置frpc.ini
[common]
server_addr = blog.zakikun.com # 这里可以填写域名或者服务器IP
server_port = 7000 # 服务端的bind_port
token = 123456789@synology # 服务端的token
use_compression = true
use_encryption = true

[syno-http]
type = http
local_ip = 127.0.0.1
local_port = 80 # 这里填写80是为了访问时不用手动指定5000端口, 涉及反向代理
custom_domains = ds920.abc.com
use_compression = true
use_encryption = true

[syno-https]
type = https
local_ip = 127.0.0.1
local_port = 443 # 这里填写443是为了访问时不用手动指定5001端口, 涉及反向代理
custom_domains = ds920.abc.com
use_compression = true
use_encryption = true

[syno-ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 20000

临时启动执行 ./frpc -c frpc.ini即可

开机启动frpc

群晖自带计划任务功能,所以开机启动比较方便

# 具体路径自行替换
cd /var/services/homes/Zakikun/frp && nohup ./frpc -c frpc.ini >/dev/null 2>&1 &

其他工作

开启SSH

 title=

云服务器配置反代
# Reverse Proxy (if needed)
   location / {
     proxy_pass       http://ds920.abc.com:5000$request_uri;
     add_header       X-Served-By $host;
     proxy_set_header Host $host;
     proxy_set_header X-Forwarded-Scheme $scheme;
     proxy_set_header X-Forwarded-Proto  $scheme;
     proxy_set_header X-Forwarded-For    $remote_addr;
     proxy_set_header X-Real-IP          $remote_addr;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "Upgrade";
   }
群晖配置反代

 title=

记得导入域名对应的ssl证书并设置默认,还要开启DSM的https访问

 title=

非强迫症人群正确做法

  1. 上面配置frpc.ini时把http和https的 local_port分别改为 50005001
  2. 控制面板-登录门户-高级-反向代理设置去掉
  3. 控制面板-登录门户-"自动将DSM桌面的HTTP连接重定向到HTTPS"勾选上后保存

这样后续访问 https://ds920.abc.com时会最终自动跳转为 https://ds920.abc.com:5001,也不影响内部各个应用套件之间的跳转,比如Synology Office打开文件后点击左上角进入Synology Drive就不会错误

最后修改:2022 年 07 月 26 日
个人分享,随意打赏