黑群晖搭建以及利用FRP内网穿透DSM上的服务

黑群晖搭建

硬件是铁威马的F2-221,双网口,cpu是Intel J3355 CPU。

  1. 烧录rr.img镜像到U盘中作为启动盘,Windows下可以用Rufus,Mac用Balena Etcher

GitHub - RROrg/rr: Redpill Recovery (arpl-i18n)

  1. 完成后插入设备中等待启动完成,设备会自动获取IP(此时网线插入到下面的网口)
  2. 进入路由器查看连接IP,输入http://IP:7681,进入指令界面
  3. 按照需求选择,build loader.
  4. 完成后利用Synology assistant查找设备,并进行初始化
  5. 完成初始化后等待系统重启

反向代理服务器

如果想要访问NAS上的其他服务(emby/gitea/qbittorrent)可以利用群晖自带的反向代理服务器的功能,配置相应的转发规则,即可实现

  1. 打开控制面板,搜索反向代理

  1. 新建规则,按照需求进行添加

注意:
整体思路是通过访问443 https端口,此时来源设置为未来想要访问的域名,访问时通过群晖来对流量进行转发,转发至相应的服务端口上,这样方便配置https。

内网穿透

需要一台有公网IP的vps,并利用frp实现

服务器端

  1. 下载frp:

GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.

  1. 编辑frps.toml
1
2
3
4
5
6
7
8
9
bindPort =  // 与frpc服务端绑定端口
auth.method="token"
auth.token = //设置Token验证
vhostHTTPPort=80
vhostHTTPSPort =443

log.to = "/opt/frp.log" //日志相关
log.level = "info"
log.maxDays=3
  1. 试运行是否有错误
1
./frps -c frps.toml
  1. 加入systemctl服务,程序在vps启动时自启动,在/etc/systemd/system/ 创建frps.service,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
ExecStart = /opt/frp/frps -c /opt/frp/frps.toml //具体的执行路径
Restart = always //以防程序挂了,自动重启

[Install]
WantedBy = multi-user.target

客户端

客户端部署在Nas上,开启群晖的SSH功能

  1. /volumn1下新建frp文件夹
  2. 进入frp文件夹下,下载frp
  3. 编辑frpc.toml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
serverAddr = "" //frps服务端的ip
serverPort = //与frps服务端的绑定的端口一致
auth.method = "token"
auth.token = "" //验证token

[[proxies]]
name = "dsms" //服务名称
type = "https"
localIP = "192.168.1.15" //设置群晖本地的IP
localPort = 443
customDomains = ["xxx"] //设置访问时的域名,与上面反向代理服务器保持一致

[[proxies]]
name = "qb"
type = "https"
localIP = "192.168.1.15"
localPort = 443
customDomains = ["yyy"] //同样,示例用

  1. 试运行是否有错误

    1
    ./frpc -c frpc.toml
  2. 加入systemctl,加入的方法与上面一致。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Unit]
    Description = frp server
    After = local-fs.target multi-user.target //程序在群晖系统启动完成并挂载硬盘后启动
    Wants = local-fs.target

    [Service]
    Type = simple
    ExecStart = /volume1/frp/frp_0.61.1_linux_amd64/frpc -c /volume1/frp/frp_0.61.1_linux_amd64/frpc.toml
    Restart=always

    [Install]
    WantedBy = multi-user.target

HTTPS证书问题

上面已经打通了内网NAS和VPS的HTTP通道,为了实现TLS的加密,需要先完善证书问题,这里利用acme.sh的docker容器来实现自动申请证书,续签证书以及向dsm导入证书

  1. 在套件中下载container套件,这里需要docker,请准备好科学上网的环境,如果没有,可以利用cloudflare 自建docker 加速镜像,参考使用Cloudflare Worker加速docker镜像

  1. 在container套件中搜索nailpang/acme.sh,如果container无法搜索的话,通过ssh 进入群晖利用命令行实现:

    1
    sudo docker pull nailpang/acme.sh //加入sudo,不然会权限报错
  2. 在container的映像中运行,自动重启先不启用,调试完成后启用,在docker文件下新建acme.sh,并映射到/acme.sh

  1. 在环境变量中配置如下:

  • SYNO: 群晖用户名
  • SYNO_PASSWORD: 群晖密码
  • SYNO_Certificat: 为空替换默认的证书
  • CF_TOKEN: 利用DNS验证获取证书,这里是CF的TOKEN,获取方式见acme.sh/wiki/dnsapi

这里建议重新新建一个群晖账号,关闭所有文件读取写入的权限,但需要加入administrator用户组

  1. 网络选择host,并在执行命令的地方加入daemon启动守护模式

  2. ssh登陆群晖,在/volume1/docker/acme.sh新建cert.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

# 域名

DOMAIN='' //使用泛域名,方便做穿透

# # DNS类型

DNS='dns_cf'

# DNS API 生效等待时间 值(单位:秒),一般120即可

# 某些域名服务商的API生效时间较大,需要将这个值加大(比如900)

DNS_SLEEP=120

# 证书服务商,zerossl 和 letsencrypt

CERT_SERVER='letsencrypt'

generateCrtCommand="acme.sh --force --log --issue --server ${CERT_SERVER} --dns ${DNS} --dnssleep ${DNS_SLEEP} -d "${DOMAIN}""

installCrtCommand="acme.sh --deploy -d "${DOMAIN}" --deploy-hook synology_dsm" //利用deplot-hook部署该证书

docker exec acme.sh $generateCrtCommand
  1. 试运行该脚本sudo bash /volume1/docker/acme.sh/cert.sh,查看最后一步是否返回成功

  1. 由于自签的证书在三个月后会过期,因此在群晖中加入计划任务,每月对证书续签一次,运行权限是root
1
bash /volume1/docker/acme.sh/cert.sh  >>/volume1/docker/acme.sh/log.txt 2>&1

总结

反向代理器的坑点比较多,之前怎么配置都不正确,参考了其他人,通过443转发之后,居然就成功。证书的配置也是,还把之前的群晖直接搞崩了,也是参考别人用acme.sh中的depoy-hook可以直接部署,一次成功。完成上面的步骤,就可以访问自己设定的域名,穿透到NAS的数据了。务必注意数据流量以及防火墙的设置

参考文章

  1. 群晖NAS反向代理 + 内网穿透 = 无需端口访问内网所有服务无需端口
  2. 群晖使用acme申请泛域名证书并设置自动证书部署
  3. 12 代平台 DSM7.2.1 黑群晖安装教程 | 保姆喂饭级图文 | 附 2024 最新 ARPL 引导镜像