Loading... ## 前言 记录一下我自己的群晖配置方式,包含存储,网络和我在用的 docker 服务。主要篇幅是网络部分,不同于网上简单的 DDNS 水文,本文结合 服务器 Nginx 做到绝大部服务去端口访问,治好强迫症。尽量做到说人话,配置可伸缩,方案有始有终,宗旨是长期稳定的使用。(授人以鱼不如授人以渔) <!--more--> ## 一、存储方案 2.5寸320G + 3.5寸2T + 3.5寸8T;群晖有很多高可用存储方案,比如软 raid ,自研的 SHR ,每种方案都有不同的特点。简单说一下: Raid 系列,就是传统的解决方案,但是需要硬盘容量相通才能发挥优势,不然会浪费存储空间。 SHR 就是为了解决上面的问题出现的(大概),SHR 支持容量不同的盘进行数据校验,在坏了一部分后,也有恢复的几率。 所以我都没用, 感觉这些方案都花里胡哨的,首先以上都是软 raid 肯定比不上硬件阵列卡,其次能否恢复数据还有待考量,比如我了解到的 raid5 的恢复几率就很不靠谱,raid1 我觉得不错,但是容量损失一半,SHR 就更不知道怎么样了。 我的三个盘都做成了 Basic 这种模式,这样可以随时拔掉不想用的硬盘或替换新的,数据用 Onedrive 备份,NAS 本来就是 24 小时工作,初次备份需要很长时间,后面都是增量备份,其实可用性还能接受。 ## 二、网络 我家里有一条 100M 联通宽带动态公网 IP ,但是上传只有 30M 而且跑不满。所以我给带到了学校寝室里,这里的网开通的时候说是 50M 带宽,但是实际用下来,我感觉整栋楼的端口都没做限速处理,所以能跑多高取决于不同时间段人的多少和路由器性能,比如我的 K2P经常能跑出 500M 上下对等的速度,直连 Onedrive 能 40M/s,室友用 steam 直连下游戏能突破 50M/s,简直不要太爽。 ### 1.内网穿透 #### NPS服务器基础环境 为了满足在公网管理,偶尔提取文件的需求,所以还是要穿透一下。 我用的软件是:[nps是一款轻量级、高性能、功能强大的内网穿透代理服务器](https://github.com/ehang-io/nps) 官方文档:https://ehang-io.github.io/nps/#/ 服务器:腾讯轻量HK CPU 1核 - 内存 1GB - 系统盘 25GB ¥24/月(新用户关联腾讯代理可以打 7.5-8折) (关于购买腾讯服务器的套路可以参考大佬新鲜出炉的文章:[腾讯云购买指南技巧以及优惠活动汇总(长期更新)](https://51.ruyo.net/16938.html)) 如果你是使用一台空服务器专门做穿透服务,那么按照官方文档一步一步来,肯定是没有问题的。 说一个极有可能遇到的**坑**,服务端配置文件修改无效: ``` install 之后,Linux 配置文件在 /etc/nps ``` 关键字:nps端口无效 nps修改配置文件不成功 ps.安装文档会让你下载一个 tar 包,里面的 config 文件只是用于软件首次安装的初始化,后续修改都应该在 /etc/nps 下。 修改配置文件建议从上到下,一点一点的修改,便于排错,如果想着一步到位,出错后往往会花费更多的时间。 当完成官方的文档后,应该能使用 IP:端口 的形式访问了,按照官方文档可以进一步绑定域名。 但是以上并不符合我的实际情况,因为我的服务器上有 Nginx 如果想让 NPS 穿透出去的内容全部经过 443 端口访问两个软件就会冲突。所以下面要写的是用 Nginx 反代 群晖服务 和 NPS web 界面,使其全部经过 域名+SSL 访问,去掉端口。 #### **Nginx环境** 我使用的是 [Oneinstack](https://oneinstack.com/auto/) 这个 Lnmp 环境面板,同类的还有军哥的 [Lnmp](https://lnmp.org/) ,都没有 web 界面,纯脚本组成,用宝塔之类的也可以。这类面板有很多优势,比如一键编译多个环境,自动处理 SSL 证书问题,但是都无法用 web(或HTTP-01) 验证方式处理 nginx反代后SSL证书续签 的问题 ,Caddy 这个 web 服务器就可以自动处理,可以尝试尝试。 **坑**:由于这些面板默认就是用 HTTP-01 方式验证的,对新手做反代不太友好,推荐使用这些面板建立环境的时候就用 DNS 验证,以 Oneinstack 为例,进入解压 Oneinstack 的文件夹内 ``` ./vhost.sh --dnsapi ``` 这样就能强制使用 DNS 签发 Let’s Encrypt 的证书了,一劳永逸。这时候会让配置 DNS 提供商的 token 之类的。 示例:https://oneinstack.com/faq/letsencrypt/ PS.签发证书前请提前做好域名解析。 **坑**:以 CloudFlare 为例,需要两项参数,token (在 个人资料 里面) ![CF_Token](https://wuyn.net/usr/uploads/2021/03/2502850711.png) 和 account ID(随便点开一个已托管的域名,注意右下方会有 Account_ID 显示),使用格式 ``` export CF_Token=sdfasdfasdfxxxx ; CF_Account_ID=asdfasdasdfxxxx ``` 上面的内容格式,包括空格都不要变,只需要把两个等号后的内容替换为实际值即可。 Oneinstack 的 DNS API 文档不是最新的,可以去 [acme.sh](https://github.com/acmesh-official/acme.sh/wiki/dnsapi) 官方查看格式。 根据示例,新建一个名字为 nas.abc.com (实际请替换为自己的域名)的环境,示例一步一步对照着来,就会搭建好一个虚拟主机供外部访问,完成后浏览器访问一下,返回 403 即成功。 #### **Nginx 反代 NPS web 界面** Oneinstack 虚拟主机的配置文件在 /usr/local/nginx/conf/vhost 下,以名字形式存储,如 nas.abc.com.conf 后面的所有反代都在这里进行配置,需要将 nas.abc.com.conf 默认配置改造一下下。 /etc/nps/nps.conf 内需要配合开启 web_base_url=/nps 修改:/usr/local/nginx/conf/vhost/nas.abc.com.conf ``` nano /usr/local/nginx/conf/vhost/nas.abc.com.conf ``` 以下是文件内容 ``` server { listen 80; listen [::]:80; listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /usr/local/nginx/conf/ssl/nas.abc.com.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/nas.abc.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_buffer_size 1400; add_header Strict-Transport-Security max-age=15768000; ssl_stapling on; ssl_stapling_verify on; server_name nas.abc.com; access_log /data/wwwlogs/nas.abc.com_nginx.log combined; index index.html index.htm index.php; root /data/wwwroot/nas.abc.com; if ($ssl_protocol = "") { return 301 https://$host$request_uri; } include /usr/local/nginx/conf/rewrite/none.conf; #error_page 404 /404.html; #error_page 502 /502.html; ###################################################################### #以上内容是 Onintack 默认生成的,不需要动,需要将下面的内容删减然后添加如下配置,然后适当修改 #1.反代 nps web 界面 location ^~ /nps { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8080/nps;#这里端口对应 nps.conf 内的 web_port #这里 127.0.0.1 代表服务器本身,不可省略 } } ``` 完成后重载一下 nginx 配置 ``` systemctl reload nginx ``` 此时访问 https://nas.abc.com/nps 即可打开 NPS web 界面,默认admin/123。 新增一个 客户端 全部默认就行,然后就会看到 server 和 端口(对应 nps.conf 里的 bridge_port),还有 key 的值;两项参数对应客户端的参数。 ![nps客户端列表](https://wuyn.net/usr/uploads/2021/03/2261142843.png) #### NPC 客户端环境 NPS 作者编译了群晖的安装包,直接下载下来安装即可,用 docker 也行。 地址:https://github.com/ehang-io/nps/releases 选 [npc_syno.spk](https://github.com/ehang-io/nps/releases/download/v0.26.9/npc_syno.spk) ![npc客户端配置](https://wuyn.net/usr/uploads/2021/03/2156059810.png) 填入内容保存以后在 web 端应该能看到 **在线** ,不然就是哪里有问题,注意 服务器提供商 和 Linux系统 的防火墙放通端口。这个端口(bridge_port)没法反代,因为不是 http 协议,而且是隐性的,浏览器直接访问没有结果,所以不用强迫症逼死自己。 连通后新建隧道,注意 客户端ID 号一定要对应,填上转发的端口保存,目标端口填 内网ip地址:端口号,也可以 **只填端口号** 表示为 127.0.0.1:5001(这个127.0.0.1代表的是客户端本身,省略后就不用担心内网 DHCP 分配的IP 变动问题)。 ![建立隧道](https://wuyn.net/usr/uploads/2021/03/1305267774.png) 端口可以参照下表: ![隧道列表](https://wuyn.net/usr/uploads/2021/03/423689968.png) 目前我就只映射了这三个端口,webdav 用于外网传输文件,但是反代后 webdav 有点点问题,手机上 CX文件管理器 连接时提示网络错误,Windows 自带客户端无法连接,但是 tmd RaiDrive 这破软件却可以连接,所以我自闭了,手机上还是老老实实用 nas.abc.com:5006 端口形式链接。(手机上装了个 Soild Explorer 又可以正常使用了,果断优惠价 $0.99 入正) 更多 群晖服务端口 参考这个链接:[https://www.synology.com/](https://www.synology.com/en-global/knowledgebase/DSM/tutorial/Network/What_network_ports_are_used_by_Synology_services) 端口映射以后,服务器 公网ip:端口 = 内网ip:端口,和网上千篇一律的 群晖 公网 DDNS 端口转发 的垃圾文章 实现的效果是一样的。 服务器相比家宽公网 DDNS 还有优势,不管什么原因家宽开 80,443 是很容易被请喝茶的,国外服务器 IP 随便造,只要不违法。 也有缺点,文件传输速度取决于群晖连接的宽带到服务器之间的速度,比如 腾讯轻量HK 只有30M 带宽,好在它的网络质量挺好的,高峰时期跑满也不是问题,如果是其他服务器,可能会很慢。 #### Nginx 反代内网服务 上面端口映射后,端口可以直接使用, 同样编辑 /usr/local/nginx/conf/vhost/nas.abc.com.conf 完整配置 ``` server { listen 80; listen [::]:80; listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /usr/local/nginx/conf/ssl/nas.abc.com.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/nas.abc.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_buffer_size 1400; add_header Strict-Transport-Security max-age=15768000; ssl_stapling on; ssl_stapling_verify on; server_name nas.abc.com; access_log /data/wwwlogs/nas.abc.com_nginx.log combined; index index.html index.htm index.php; root /data/wwwroot/nas.abc.com; if ($ssl_protocol = "") { return 301 https://$host$request_uri; } include /usr/local/nginx/conf/rewrite/none.conf; #error_page 404 /404.html; #error_page 502 /502.html; ###################################################################### #以上内容是 Onintack 默认生成的,不需要动,需要将下面的内容删减然后添加如下配置,然后适当修改 #1.反代 nps web 界面 location ^~ /nps { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8080/nps;#这里端口对应 nps.conf 内的 web_port, #这里 127.0.0.1 代表服务器本身,不可省略 } #在上一个 location 后面追加下面的内容 #2.反代群晖 DSM 面板 location / { proxy_set_header Host $http_host; proxy_pass https://127.0.0.1:5001/;#5001 为群晖面板 https 默认端口 } #3.反代 aria2 的 RPC 远程控制端口 location ^~ /jsonrpc { proxy_pass http://localhost:6800/jsonrpc; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; #WebSocket proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } #4.反代 webdav 服务 location ^~ /dav { proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Host $http_host; proxy_pass https://127.0.0.1:5006/; #5006 webdav https 端口 } } ``` 完成后重载一下 nginx 配置 ``` systemctl reload nginx ``` 可以愉快的访问了 | nas.abc.com | 群晖 DSM 面板 | | :- | :-: | | nas.abc.com/nps | NPS web 界面 | | nas.abc.com/jsonrpc | aria2 控制端口:443 | | nas.abc.com/dav | webdav 传输 | | nas.abc.com:9993 | bridge_port nps与客户端通信口 | 公网服务器的防火墙可以把其他端口关闭了,以上情况 只留 80 443 ssh端口 9993 就能运行。 #### **授人以渔** 其实 nginx 我也不太会,以前反代一直是个不解的难题,只会找对应软件的文档看,文档没写就拉闸,经过上面的一些突击学习,突然通了一点。 看上面反代的例子,其实最主要的就两句话: ``` #1.反代 nps web 界面 location ^~ /nps { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8080/nps;#这里端口对应 nps.conf 内的 web_port } ``` 依葫芦画瓢,将地址端口换成其他 http 服务,应该就能反代了,如果有问题那可能是需要更高级的参数,比如 proxy_set_header 对头进行处理;再或者是程序本身就不支持,比如 Cloudrave 这个网盘程序就不支持用 二级目录 /cloud 这样的形式反代,这是软件本身没有设计这样的路由,总之多试多搜索。 PS.要注意 proxy_pass url 后面的斜杠问题 参考:[proxy_pass根据path路径转发时的"/"问题记录](https://www.cnblogs.com/kevingrace/p/7133806.html) 如果你想搞懂以上 Nginx 中其他参数的含义,可以看看:[Nginx反向代理中proxy_set_header参数说明](https://www.cnblogs.com/kevingrace/p/8269955.html) 然后你会发现这两篇文章都出自同一个人,那么顺腾摸瓜你可以看到这位博主更多关于 Nginx 的说明文章,结合 Nginx 官方文档,差不多就可以系统学习一遍了,当然我没那么多时间,我只粗略的看了看,觉得写的挺好的。 #### 如何使用其他面板反代 套路,将上面的配置变通一下即可,这些面板都是采用 Vhost 模式存放 Nginx 的配置,换句话说你只需要找到以域名为名字的 conf 文件,再按照上面的配置进行修改就成了,不同面板存放路径不同,多看对应文档。 面板都大同小异,比如 宝塔 可视化,可能建立环境的时候点几下鼠标就行,其他非图形化界面,需要输几下命令,核心内容还是修改 config 文件。 ## 三、Docker 自建服务 推荐一些 docker 镜像 | Docker 镜像 | | | - | - | | p3terx/aria2-pro | | | p3terx/ariang | | | noobx/jd:gitee | 教程:[(双发更新) 群晖Docker部署京东自动签到\任务脚本-3](https://www.geekyes.com/593.htm) | 目前只装了上面几个,Syncthing 和 jellyfin 打算后面再装,这里就没写反代内容,其实开源软件的文档是很齐全的,基本上一搜一个准,比如你可以这样 Google 关键字: ``` Syncthing Nginx 或者 Jellyfin Nginx ``` 按照上面的套路 反代,应该没问题。 用 docker 可视化面板安装软件教程,推荐 [8个超实用的Docker镜像部署——司波图 UNRAID 陪玩教程 03](https://www.bilibili.com/video/BV1wE411v7k5) 群晖同理,就是映射路径,添加一些额外的参数,挺简单的。群晖的 docker 推荐统一用 host 网络模式,免去端口映射和性能损耗。 ## 四、附件 附加我的 nps server /etc/nps/conf/nps.conf 配置 ``` appname = nps #Boot mode(dev|pro) runmode = dev #HTTP(S) proxy port, no startup if empty http_proxy_ip=0.0.0.0 http_proxy_port=9991 https_proxy_port=9992 https_just_proxy=true #default https certificate setting https_default_cert_file=conf/server.pem https_default_key_file=conf/server.key ##bridge bridge_type=tcp bridge_port=9993 bridge_ip=0.0.0.0 # Public password, which clients can use to connect to the server # After the connection, the server will be able to open relevant ports and parse related domain names according to its own configuration file. public_vkey=abcdabcd #Traffic data persistence interval(minute) #Ignorance means no persistence #flow_store_interval=1 # log level LevelEmergency->0 LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7 log_level=3 log_path=/var/log/nps.log #Whether to restrict IP access, true or false or ignore #ip_limit=true #p2p #p2p_ip=127.0.0.1 #p2p_port=6000 #web web_host= web_username=admin web_password=oasdfgvaaAcSqJA web_port = 8080 web_ip=127.0.0.1 #web_base_url=/nps web_open_ssl=false web_cert_file=conf/server.pem web_key_file=conf/server.key # if web under proxy use sub path. like http://host/nps need this. #web_base_url=/nps #Web API unauthenticated IP address(the len of auth_crypt_key must be 16) #Remove comments if needed #auth_key=test #auth_crypt_key =1234567812345678 #allow_ports=9001-9009,10001,11000-12000 #Web management multi-user login allow_user_login=false allow_user_register=false allow_user_change_username=false #extension allow_flow_limit=false allow_rate_limit=false allow_tunnel_num_limit=false allow_local_proxy=false allow_connection_num_limit=false allow_multi_ip=false system_info_display=true #cache http_cache=false http_cache_length=100 #get origin ip http_add_origin_header=true #pprof debug options #pprof_ip=0.0.0.0 #pprof_port=9999 #client disconnect timeout disconnect_timeout=60 ``` 不知道参数啥意思,可以复制到文档里搜,每一项都有说明,不是所有参数都用得上。 今天就更新这么多,其他的配置,我遇到了再更新到这里,这应该是一篇长期更新的文章,欢迎在评论区讨论交流。 <div class="tip inlineBlock info"> 版权声明:本文为原创文章,版权归 乌影‘s blog 所有,转载请注明出处! 本文链接:[https://wuyn.net/29.html](https://wuyn.net/29.html) 如相关链接出现404,可以在文章下面评论留言。 自由乌托邦,欢迎大爷来 Telegram 频道玩呀:[点击加入](https://t.me/wuyn_net) </div> Last modification:March 19th, 2021 at 10:40 pm © 允许规范转载