最近从一款游戏(台服MapleStory枫之谷)退坑,手头上回收了一点资金,想着家里的Unraid处于无校验盘状态,感觉实在有点危险,毕竟这台NAS主机是家人共用,并且我自身也有不少重要数据存放在里面,于是就咬咬牙买了一台群晖DS920+,打算先在公司宿舍跑起来,后续再搬回家里重新部署使用。(所以后续还会有一点小更新)
这时出现了点小问题,公司宿舍集体报装的宽带,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
云服务器配置反代
# 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";
}
群晖配置反代
记得导入域名对应的ssl证书并设置默认,还要开启DSM的https访问
非强迫症人群正确做法
- 上面配置frpc.ini时把http和https的
local_port
分别改为5000
和5001
控制面板-登录门户-高级-反向代理
设置去掉控制面板-登录门户-"自动将DSM桌面的HTTP连接重定向到HTTPS"
勾选上后保存
这样后续访问 https://ds920.abc.com
时会最终自动跳转为 https://ds920.abc.com:5001
,也不影响内部各个应用套件之间的跳转,比如Synology Office打开文件后点击左上角进入Synology Drive就不会错误
版权属于:Zakikun
本文链接:https://blog.zakikun.com/archives/43.html
本文采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
1 条评论
原来也用frp,后来发现nps是个好东西,有类似,下发配置给客户端那种功能呢