type
status
date
slug
summary
tags
category
icon
password
前两天,终于让手里的那台联想小新ideapad700-15ISK彻底退役了。这台机器自2016年读大学时购入,历经加装内存、硬盘、更换屏幕等多次升级,已陪伴我整整9年。其质量仍然很好,但闲着也是无用,索性刷个Ubuntu系统,作为个人服务器兼NAS使用。
由于本文是过程向,而非教程向,整体按照时间顺序记录,因而可能会缺乏逻辑性,见谅
📝 主要过程
需求
1.开放一个共享文件夹便于保存或读取资料 2.闲时挂载bt种子进行影视资源的上传与下载 3.存储收集的音乐资源,提供音源服务,作为电脑、手机端的个人音乐库 4.作为网盘自动同步手机、电脑端指定目录下的所有内容 5.运行个人自动化脚本。如:通知、数据处理、应答等 6.所有服务不仅可以在内网访问,也要能在公网被ipv4和ipv6访问
准备
1.已备案过的具有公网ip的云服务器和域名 2.闲置电脑和硬盘 3.光猫的超级管理员密码(用于关闭光猫的ipv6防火墙,也可以用来改桥接)
1 安装Ubuntu24.04.2LTS版
1.1 制作Ubuntu启动盘
将下载好的Ubuntu 24.04.2 LTS Server的iso文件,利用balenaetcher烧录到准备好的U盘中
Hint:U盘会被格式化;若U盘有写入保护,可参考下面这篇文章
1.2 在目标机器上安装Ubuntu
将刻录好iso镜像的U盘启动器,插入目标机器,开机时狂按F12进入bios,切换启动引导至U盘。接着按照系统引导逐步安装即可
Hint:具体步骤可参照下面这个视频
2 安装frp和ddns-go
由于入户光猫申请不到公网ipv4的地址,而我需要外网也能ssh家庭局域网内的服务器。所以我的实现方式是: 1.利用frp和手中已有公网ip的阿里云服务器实现ipv4的内网穿透 2.利用ipv6的地址和ddns-go,将手中闲置的域名解析到动态变化的ipv6地址 这两种方式分别可以实现: 1.当我访问阿里云的公网ipv4的特定端口时,能被转到固定的内网服务器ipv4的特定端口 2.当我访问固定的域名时,能被解析到动态变化的内网服务器的ipv6地址 这样就可以实现最基础的外网ssh远程内网服务器的功能。其余需要外网访问的功能,也都可以基于这两个方法实现
2.1 安装frp
2.1.1 frp客户端配置 frpc
为了方便操作,我们可以下载一个WinSCP,将在github上下载好的frp,传输给
/usr/bin
文件夹下,此时/usr/bin/frp
路径下应该包含frpc
(客户端)和frpc.toml
(配置文件)这两个文件,frpc.toml
的配置内容如下:文件配置好后,我们需要将frpc注册成service,以保证开机自动运行,我们将
frpc.service
文件放在/etc/systemd/system
路径下,其内容如下:这里需要注意两个问题:
1.利用WinSCP将
frpc.service
放入/etc/systemd/system
路径下时,会被系统拒绝,原因是/etc/systemd/system
路径只有root用户拥有写入权限,而Ubuntu系统默认不允许远程root账户登录。
此时,我们可以修改一下
/etc/ssh/sshd_config
,将其中的PermitRootLogin
参数的值改为yes。这样便可以实现远程root账户登录
2.要给frpc文件添加可执行权限,即
这样,frp的客户端就配置完成了。
完成以上步骤后,daemon-reload并restart一下,frpc就正常运行了,当然,别忘了
2.1.1 frp服务端配置 frps
总体思路与客户端类似,唯一值得注意的是,需要在阿里云服务器的防火墙和阿里云的安全组下访问规则中,将先前配置好的对应端口开放:7000端口(用于frp的客户端与服务端相互通信的端口)、7500端口(用于显示网页图形界面的管理页面端口)、6000端口(用于暴露在公网给其他机器访问的端口)
完成以上步骤后,此时就已经可以正常地ssh到阿里云服务器的ipv4地址,进行内网穿透,访问内网的家庭服务器了
2.2 安装ddns-go
2.2.1 获得域名解析服务商的AccessKey(我用的是阿里云)
创建一个AccessKey并将AccessKey ID和AccessKey Secret的值记录并保存下来
2.2.2 在Ubuntu上安装ddns-go
在github上找到ddns-go并下载对应的版本内容,用WinSCP传到Ubuntu上,然后输入以下命令安装
安装完成后如下图所

此时需要打开网页进行进一步的配置,默认端口为9876。填入先前获得的AccessKey ID和AccessKey Secret

接着在ipv6设置中的Domains这一项,填入我们事先准备好的闲置域名

最后,保存即可。这样ddns-go就成功配置好了。此时就可以通过固定的域名访问拥有动态公网ipv6地址的Ubuntu服务器了
3 安装samba实现内网共享文件夹
3.1 挂载硬盘
因为这台联想小新700只有128g的SSD和1T的HDD,面对家庭存储的需求,这点硬盘容量显然过于鸡肋。我手里刚好有一块闲置的西数8T紫盘,买了个好点的纹波小的电源,直接通过USB连接并外挂
当然我是新手,这里了解一下Linux的文件管理机制:
Linux 一切皆文件
- 硬盘、U盘、光驱等设备都映射到
/dev/
下的文件(如/dev/sdc2
),而不是盘符
- 必须挂载到目录才能访问。
- 可以挂载到任意目录(如
/mnt/data
、/media/yourname/disk
)。
- 可以挂载网络存储、内存盘等,而 Windows 的盘符(A-Z)有限。
Windows 自动分配盘符(如
D:
),但 Linux 要求显式挂载。了解完之后,我们输入如下命令来显式地进行硬盘挂载:
当你执行
sudo mount /dev/sdc2 /home/mujiang/HDD-8T-SHARE
时:- 如果
/home/mujiang/HDD-8T-SHARE
是空目录: - 挂载后,该目录会显示
/dev/sdc2
的内容。 - 原有目录本身无内容,所以不会有变化。
- 如果
/home/mujiang/HDD-8T-SHARE
原本有文件: - 这些文件会暂时“隐藏”,只能看到
/dev/sdc2
的内容。 - 卸载硬盘后(
sudo umount /home/mujiang/HDD-8T-SHARE
),原有文件会重新出现。 - 文件不会被删除,只是被挂载的硬盘“覆盖”了访问入口。
3.2 安装samba并配置
3.2.1 安装samba
输入如下命令进行samba安装:
3.2.2 配置samba
打开samba配置文件
修改配置文件如下
其中0664和0775的含义如下:
create mask = 0664
的作用
- 定义新创建文件的默认权限(即用户上传或新建文件时的权限)。
0664
的八进制解析:0
:特殊权限位(通常为 0)。6
(所有者权限):rw-
(可读可写,不可执行)。6
(所属组权限):rw-
(可读可写,不可执行)。4
(其他用户权限):r--
(仅可读)。
效果:
- 用户
mujiang
创建的文件权限为rw-rw-r--
(所有者可读写,组用户可读写,其他用户只读)。
directory mask = 0775
的作用
- 定义新创建目录的默认权限。
0775
的八进制解析:0
:特殊权限位。7
(所有者权限):rwx
(可读可写可执行)。7
(所属组权限):rwx
(可读可写可执行)。5
(其他用户权限):r-x
(可读可执行,不可写)。
效果:
- 用户
mujiang
创建的目录权限为drwxrwxr-x
(所有者可读写执行,组用户可读写执行,其他用户可读和执行)。
权限对照表
权限项 | 数字表示 | 字符表示 | 说明 |
文件所有者 | 6 | rw- | 可读可写 |
文件所属组 | 6 | rw- | 可读可写 |
其他用户 | 4 | r-- | 仅可读 |
目录所有者 | 7 | rwx | 可读可写可进入 |
目录所属组 | 7 | rwx | 可读可写可进入 |
目录其他用户 | 5 | r-x | 可读可进入,不可写 |
添加samba用户
重启服务
防火墙设置(如有)
3.2.3 测试访问
由于我们之前设置好了ddns,所以此时我们有如下两种访问形式: 1.办公电脑在内网,输入内网Ubuntu服务器的内网ip访问共享文件夹 2.办公电脑在外网,输入固定的域名,利用ddns解析到最新的ipv6地址,访问内网的Ubuntu服务器的共享文件夹
客户端访问
- Windows:文件资源管理器输入
\\服务器IP\HDD-8T-SHARE
- Linux/macOS:使用文件管理器连接或
smb://服务器IP/HDD-8T-SHARE
注意事项:
- 如果硬盘是NTFS格式,确保安装NTFS支持包:
- 对于大容量共享,可能需要调整Samba性能参数:
- 如需匿名访问,设置
guest ok = yes
并取消valid users
行
3.3 效果


4 安装qBittorrent和PeerBanHelper实现bt下载
由于国内糟糕的BT共享环境和以迅雷为首的大平台的作恶,为防止服务器挂BT种子时被恶意吸血,因此选用github上基于qBittorrent的改版qBittrrent-Enhanced-Edition安装使用,并配合PeerBanHelper对恶意ip进行封禁
4.1 安装qBittorrent-Enhanced-Edition
我们安装无头的x86版本,链接如下:
这里我将其放在了
/usr/bin
路径下,并通过运行webui,将webui的端口改在了10001(看个人喜好),勾选高级设置中的Auto Ban Unknown Client From China(捂脸)和Auto Ban Bittorrent Media Player接着将qbittorrent-nox注册成service,使其开机自动运行
qBittorrent默认的配置文件路径在
/home/mujiang/.config/qBittorrent
qBittorrent配置nginx时的注意事项
- 确保启动参数无误,尤其是配置文件的目录,必须是 qbittorrent 的父级目录,不可以到 qbittorrent 这一层。
- 如果你是在外网通过 IP 访问内网服务器,则需查看 qbittorrent.conf 中,是否设置了 WebUI\HostHeaderValidation=true 参数,如有,请改为 false。
- 如果你是在外网通过域名访问内网服务器,则第二条同样适用;但安全起见,建议改为 true 并把值设置为你的域名。
- 如果你并未配置 HTTPS 证书,或未安装相关组件,则需查看 qbittorrent.conf 中,是否设置了 WebUI\HTTPS\Enabled=ture 参数,如有,请改为 false。
- 若以上参数在配置文件里都没有,可自行添加,并设置为 false;若仍未解决,可在 webui 中尝试关闭跨站请求伪造(CSRF)保护。
- 如果你设置了 Nginx 反向代理,则需要根据官方 Wiki 设置以下参数(请删除其他所有参数):
4.2 安装PeerBanHelper
在github上PeerBanHelper的release仓库中找到合适的deb后缀的安装包
安装完成后,peerbanhelper会在Ubuntu服务器的本机9898端口默认开启一个配置页面
默认的配置文件目录在
/etc/peerbanhelper/
后续可以用frp+nginx穿透到公网方便运维
5 安装Navidrome搭建个人音乐库
5.1 安装并配置Navidrome
官方给出了如下的安装教程,这里仅简要说一下
在github上下载并安装合适的版本
打开配置文件
添加/更新以下行以指定音乐库路径(以自己的路径举例):
启动 Navidrome 服务:使用 systemctl 启动 Navidrome 服务并将其设置为在启动时运行
检查服务状态:验证 Navidrome 是否正常运行。
如果一切设置正确,Navidrome 将可以通过网络浏览器访问:http://localhost:4533
5.2 手机端、电脑端安装音流实现多端听Navidrome里的歌
github上搜索音流并安装,具体细节略去不表
6 安装Docker
- 安装必要依赖
2.添加 Docker 官方 GPG 密钥(使用国内镜像加速)
3.设置 Docker 稳定版仓库(使用国内源)
4.更新并安装 Docker
7 安装musictagweb实现音乐刮削
直接docker无脑安装
- 从Docker Registry拉取镜像
- dokcer run
ps:
/path/to/your/music
改成你的音乐文件夹路径!我这里为/home/mujiang/HDD-8T-SHARE/HomeServer/music/path/to/your/config
改为配置文件路径!我这里为/home/mujiang/music_tag_data- 修改默认密码(可选)
访问在
127.0.0.1:8001/admin
默认账号密码 admin/admin 修改默认密码
8 安装homeassistant实现全屋智能
8.1 用Docker安装homeassistant
用docker一键安装
HA 想使用内网穿透还得再 configuration.yaml 文件里加上这一段:
完成修改后,重启一下docker里的homeassistant容器
8.2 nginx问题解决
8.2.1 问题探究
在下文配置好相应的frp和nginx后,我们会发现通过homeassistant.home.yourdomain.com:28080可以正常访问并登录网页,但是通过homeassistant.home.yourdomain.com却只能访问,无法登陆,错误页面如下:

出现这个问题的原因是:
1. Home Assistant 的 WebSocket 依赖
Home Assistant 的前端(如登录后的实时界面)依赖 WebSocket 协议实现双向通信(例如状态更新、事件推送)。而初始的 HTTP 反向代理配置可能仅处理普通 HTTP 请求,未正确转发 WebSocket 连接。
2. Nginx 的默认代理行为
默认情况下,Nginx 的
proxy_pass
会:- 将客户端请求转换为普通的 HTTP/1.1 请求转发给后端。
- 不会主动处理
Upgrade
标头(WebSocket 的关键握手标头)。
8.2.2 问题解决
通过在nginx的location块中添加以下配置解决问题:
关键标头的作用
Upgrade: $http_upgrade
将客户端的
Upgrade
标头(如 websocket
)原样传递给后端(Home Assistant),告知需要升级协议。Connection: "upgrade"
确保
Connection
标头包含 upgrade
,这是 WebSocket 握手必需的字段。如果缺少这些标头,Home Assistant 无法建立 WebSocket 连接,导致登录后实时功能失效(表现为“无法连接”)。
Nginx 配置的深层原理
1. WebSocket 握手流程
WebSocket 通过 HTTP 协议初始化握手,客户端发送:
Nginx 必须将这些标头透传给后端,否则握手失败。
2. 反向代理的“协议转换”问题
Nginx 默认会:
- 将客户端请求降级为 HTTP/1.1 不带标头的普通请求。
- 丢弃
Upgrade
和Connection
标头,导致后端无法识别 WebSocket 请求。
添加
proxy_set_header
后,Nginx 会保留这些标头,允许协议升级。为什么只配
trusted_proxies
不够?trusted_proxies
仅告诉 Home Assistant 信任来自 Nginx 的 IP(避免将 Nginx IP 误判为攻击来源)。
- 但 WebSocket 功能依赖正确的标头转发,与 IP 信任无关。
8.3 加装zigbee模块,使笔记本作为zigbee网关
硬件上:淘宝上有很多成品方案,本次我选购了CC2652P作为主芯片,且附带USB接口并刷好固件的成品(插上即用。当然对自己焊接技术自信的也可以参照开源方案自己打板子焊接)
软件上:在homeassistant的设置中,添加ZHA作为zigbee软件控制模块,并在ZHA中添加相应的zigbee设备即可,此处细节略去不表
9 安装syncthing实现个人云盘搭建
9.1 在Ubuntu服务器上安装syncthing
步骤 1:下载 Syncthing
1. 进入临时下载目录:
2. 使用
wget
下载 Syncthing:步骤 2:解压文件
1. 解压下载的
.tar.gz
文件:2. 进入解压后的目录:
步骤 3:安装 Syncthing
1. 将二进制文件复制到
/usr/local/bin
(系统可执行路径):2. 验证安装:
应输出类似:
步骤 4:配置 Syncthing 为系统服务
1. 创建数据存储目录并设置权限:
2. 创建 Systemd 服务文件:
粘贴以下内容:
3. 启动并启用 Syncthing 服务:
4. 检查服务状态:
步骤 5:访问 Syncthing Web 界面
默认情况下,Syncthing 的 Web 界面运行在
http://localhost:8384
。如果需要远程访问,修改配置文件
/var/lib/syncthing/config.xml
,将 127.0.0.1
替换为 0.0.0.0
:接着,进行下一节所示的frp和nginx相关配置即可
9.2 在个人windows电脑及手机上上安装syncthing
9.2.1 开机自启动并无窗口运行设置
windows装好后,默认是以终端窗口运行,且每次运行时会弹出网页控制台(本机默认在13614端口)。我们可以写一个简单的bat的脚本来规避这个问题,注意在此步之前,一定要在windows系统设置中将终端选为下图所示

将syncthing的执行路径添加的系统环境变量的path中
在syncthing的安装目录下,新建一个文本编辑为bat,内容如下,命名为syncthing_start.bat
新建一个该bat脚本的快捷方式,并放置在windows开机自启动目录下,即C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
9.2.2 手机上安装syncthing
谷歌商店上找到Syncthing-Fork安装即可,其余过程略去不表
9.3 同步方式设置
我想实现增量备份
因此在ubuntu服务器的syncthing的界面,右上角“操作-高级-文件夹-具体文件夹名称”点开后会弹出来一个全是英文的菜单,里面有一个Ignore Delete的选项,勾选就可以忽略删除了。
10 安装jellyfin实现个人电影库
10.1 安装jellyfin
对于Ubuntu系统,官方直接提供了一个bash脚本一键安装,非常简单
装好后,网页UI默认运行在本地的8096端口
10.2 安装常用插件
通用流程如下:
- 进入 Jellyfin 控制台 > 插件目录/存储库 > 设置,点击添加
- 输入存储库名称:
MetaTube
- 输入存储库 URL,如:
https://raw.githubusercontent.com/metatube-community/jellyfin-plugin-metatube/dist/manifest.json
- 在插件目录下找到 MetaTube,点击安装
- 重启 Jellyfin
注意事项:
第一次扫描媒体库的时候一定要把元数据下载器关闭,否则扫描会失败!
10.3 开启硬件解码
问题一
这一步困扰了我好久,我在根据官方文档打上了Nvidia相关驱动并reboot后,发现Ubuntu服务器直接断网了,在确认网卡硬件没有损坏后,我排查了各个方面,最终发现最后一次reboot启动之后和之前多次启动的内核版本不同,才确定问题的原因:nvidia官方驱动的安装会导致Ubuntu自动升级内核版本,而新的内核版本不兼容老的网卡驱动,所以导致Ubuntu服务器直接断网(谁懂啊,服务器一直提示网卡驱动有问题,而更新网卡驱动需要有网,但现在网卡驱动有问题所以没有网,翻箱倒柜找出一个上古U盘前来救急折腾半天,而且服务器放的位置不好挪,全程以一个诡异的姿态去操作这台老破机器,才最终确定了原因)
打显卡驱动这一步略去不表,详见下方的官方文档:

Hardware Acceleration | Jellyfin
The Jellyfin server can offload on the fly video transcoding by utilizing an integrated or discrete graphics card (GPU) suitable to accelerate this workloads very efficiently without straining your CPU.
问题二
这台机器的CPU是i5-6300HQ,对应的核心显卡是Intel Corporation HD Graphics 530(第6代,8代之后才支持QSV,因此核显只支持VAAPI),独立显卡是Nvidia GTX950M(官网查不到,貌似比桌面端少了hevc编码,而且由于独立显卡架构较老,不支持HDR色彩映射)
相应的,如果用核显进行硬件解码,设置如下:
Intel Corporation HD Graphics 530


如果使用独显进行硬件解码,设置如下:
Nvidia GTX950M


11 安装alist实现网盘聚合及本地文件webdav服务访问
11.1 安装alist
输入下列脚本一键安装
11.2 将Ubuntu服务器本地路径用webdav协议挂载到公网
参照下面的文档,很简单:
这里顺带提一下隐藏文件夹的设置,在“元数据”项中,通过在网盘显示的路径(注意,不是实际在服务器上的路径),正则表达式匹配来进行隐藏(支持单个文件或文件夹)。如下:

12 设置frp和nginx实现稳定公网访问
没有在前面进行这一步是因为两天前我还在乐滋滋地用ipv6公网访问我的所有服务,结果今天就发现联通把我光猫的所属网段下所有ipv6的端口全部封了!!!(不得不感叹一下上海网络检查的速度,要不说魔都效率高呢)。所以纵然ipv6的地址数量浩瀚到可以给每一粒沙子都分配地址,但现实国情就是:现在的ipv6在大部分区域都变成了只能进不能出的单向通道(只能访问服务,但不能提供服务),这基本是掐死了个人用户的DIY空间。 此外,入户的公网ipv4地址,那是根本申请不下来啊…… 但,“只要思想不滑坡,方法总比困难多”:虽然利用frp实现内网穿透延迟高、还耗费中继服务器的流量,但它好歹能用啊。而且我需要公网访问的家庭网络服务,对延迟并不敏感 那么,说干就干
12.1 利用frp通过自定义域名访问内网的web服务
12.1.1 配置 frps.toml
在 frps.toml 文件中添加以下内容,以指定 HTTP 请求的监听端口为 28080:
如果需要配置 HTTPS 代理,还需要设置
vhostHTTPSPort
。12.1.2 配置 frpc.toml
在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器 IP 地址、本地 Web 服务监听端口和自定义域名:
12.1.3 添加相应的dns解析
在相应的域名托管平台,将步骤6.1.2中customDomains中填写的对应的域名,添加A记录解析平台到serverAddr对应的地址
12.1.4 访问测试
使用浏览器访问
http://navidrome.yourdomain.com:28080
即可访问内网机器上的 4533 端口服务,访问 http://qbittorrent.yourdomain.com:28080
可以访问内网机器上的 10001 端口服务。但很显然,输入端口的方式仍然不够优雅,所以下一步,我们配置一下nginx代理
12.2 利用nginx实现端口转发
在具有公网ip的中继服务器上,部署nginx服务,并在编写好的配置文件中加入如下的配置
完成了如上的配置之后,这时nginx会将例如对于该域名navidrome.yourdomain.com(默认是80端口)的访问,转发到中继服务器的28080端口(由frp监听),从而穿透到内网的相应端口,实现服务
这样我们只需通过配置好的有规律的域名,就能访问到内网机器的对应服务,非常舒服
13 内网Ubuntu服务器部署nginx以方便ipv6不带端口号访问
13.1 安装nginx
官方有专门的对于ubuntu系统的安装指南,详见下面的链接:
安装好后,默认的相关路径如下
类型 | 路径 |
主程序 | /usr/sbin/nginx |
配置文件 | /etc/nginx/nginx.conf |
13.2 配置nginx
在默认的配置文件中,我加入了下面这一段,通过map进行分类,并正则表达式效率高一些
14 ipv6访问的小插曲
14.1 插曲一
在配置好ipv6公网访问的那段时间,我总会在一天中的某个随机的时段,无法用ipv6访问我的内网服务器,而在剩下的大部分时间,都是可以正常访问网页服务的,在这期间,ssh服务是始终稳定不受影响的。 总结下来就是:http协议的ipv6网页访问时不时抽风;tcp协议的ssh服务用ipv6却始终稳定 除此之外,每当网页的ipv6访问抽风出现502错误时,我用curl对应的端口和ping域名或ipv6的地址,都是能正常连通的。 以上的这些怪异表现让我百思不得其解 终于在我又一次烦躁不安地检查并确认了光猫防火墙、路由器防火墙都被关闭,且curl与ping都正常之后,我下意识地在网页用ipv6的地址进行访问时,打开F12检查了一下。然后便看到了下面这样的画面……

此时,笔者内心犹如一万匹草泥马奔腾而过。要知道,我在排查问题的时候,也尝试过把clash切到直连模式并关掉,但始终忘了在windows系统中将这个代理服务器关闭

所以,之前网页的ipv6访问时不时抽风,是因为我在用电脑访问ubuntu服务器的ipv6地址时,被时不时代理到了本地的
127.0.0.1:7890
所以页面才会返回502。而ssh服务却不受这一影响,因此始终正常。终于破案了。
解决方法也很简单,clash中设置一下绕过系统代理的ip/域名即可,如下:

14.2 插曲二
本来已经美滋滋地享用“域名ddns解析为ipv6地址,以直接访问内网ubuntu服务器的网页”,结果今天在外面一尝试,直接通过域名访问的方式(默认80端口)又寄了,但带对应的端口号访问却依然正常。 初步可以判断是运营商把80和443端口给封了。 我才用一天啊…… 去球吧,上海联通。 在路由器配置一下端口转发,改成250端口(暴躁)
将13.2节的nginx配置修改如下:
讲一下几个改动点:
1.将所有的对80端口的监听改成了250
2.由于qbittorrent默认设置-webui-验证这一项开启了“点击劫持”保护和CSRF保护,导致nginx设置后无法正常访问qbittorrent的服务,因此需要在原来的nginx配置文件中加入下面这一段:
其中:
1.
X-Forwarded-Host
的修正作用原配置:
作用:
- 传递代理信息:
X-Forwarded-Host
头告知后端(qBittorrent)客户端原始请求的主机名和端口(即$server_name
匹配的域名qbittorrent.ddnsv6.jfseed.com
和端口250
)。
- 修复后端识别问题:
qBittorrent 默认会校验请求来源是否合法。如果反向代理未正确传递原始域名和端口,后端可能认为请求来自非法代理(例如缺失
Host
头或 X-Forwarded-Host
头),从而触发安全拦截。此设置确保后端能正确识别原始请求的域名和端口,避免因反向代理导致的安全校验失败。
2.
Referer
和 Origin
头的控制配置:
作用:
- 清除敏感头信息:
qBittorrent 的 CSRF 防护 会检查
Referer
和 Origin
头,验证它们是否与当前服务的域名一致。当通过
http://qbittorrent.ddnsv6.jfseed.com:250
访问时,浏览器默认会发送 Referer: http://qbittorrent.ddnsv6.jfseed.com:250/...
和 Origin: http://qbittorrent.ddnsv6.jfseed.com:250
。如果后端校验逻辑 严格匹配域名且拒绝带端口的来源(如只允许
qbittorrent.ddnsv6.jfseed.com
不带 :250
),这些头会被视为非法,导致请求被拦截。- 强制置空绕过校验:
通过
proxy_hide_header
和 proxy_set_header
清空这两个头,后端无法获取到带端口的信息,从而跳过 CSRF 校验。(注意:此方法可能存在安全风险,需确保其他防护措施已到位。)
3.
X-Frame-Options
的防护兼容配置:
作用:
- 防止点击劫持(Clickjacking):
该响应头告诉浏览器此页面只能被嵌入到同源(相同域名、协议、端口)的框架中。
qBittorrent 默认可能要求此头为
SAMEORIGIN
或 DENY
,但反向代理未传递时会导致浏览器拦截页面加载。主动添加此头可满足劫持保护的要求,确保页面正常渲染。
综合生效原理
- 修复后端域名识别:
X-Forwarded-Host
提供准确的客户端原始请求信息,使后端(qBittorrent)能正确关联域名和端口,避免因反向代理导致的域名混淆。- 绕过严格端口校验:
- 清空
Referer
和Origin
头,使后端无法检测到客户端实际访问的端口(:250
),从而绕过对非标准端口的拦截。 - 若后端仅校验
Host
头(通过proxy_set_header Host $host
已传递为qbittorrent.ddnsv6.jfseed.com
),则校验通过。
- 满足安全响应头要求:
X-Frame-Options
的显式设置确保浏览器不会因安全策略拦截页面。15 成品展示



16 后续
16.1 安装transmission(qBEE不支持qt种子)实现qt下载
安装流程详见官方文档:
在安装好后,可能会出现systemd无法正常工作的错误,可以参考下面这篇文章进行解决:
transmission-daemon fails to notify systemd of correct start
默认配置文件路径
/var/lib/transmission-daemon/info/settings.json
transmission的默认webui过于简陋,可以安装如下webui美化:
transmission-web-control
ronggang • Updated Apr 28, 2025
按照官方的步骤会有一些问题,解决方案如下:
更新后始终停留在官方界面,不能切换
安装好transmission后,可以将其加入peerbanhelper中
17 添加新功能:telegram签到
使用开源项目tg-signer
使用 nohup
说明:
nohup
:忽略SIGHUP
信号(终端关闭时不会终止进程)。
> output.log
:将标准输出重定向到output.log
文件。
2>&1
:将标准错误(stderr)也重定向到标准输出(即同一个日志文件)。
&
:让命令在后台运行。
查看日志:
终止进程:
- 先找到进程 ID:
- 然后杀掉进程:
18 添加新功能:jupyter notebook
🤗 总结
搭建前自己其实并没有一个整体的规划,想到什么需求就一点点往上加,一步步走下来,不知不觉就折腾了一堆东西。
虽然连个RAID阵列都没有(后续再加吧),也远不如购买一个成品NAS跑黑群晖来的方便快捷,但DIY的乐趣在于,高度的掌控感、可扩展性与自由度,以及看着老旧机器焕发新生的成就感。
整体操作下来其实并没有难度,只是步骤很多很繁琐。但只要不接触内核、驱动,这些都是小问题。
如果以后有新功能添加,再来续更。
📎 参考文章
- 作者:江牧
- 链接:https://lawyerjiang.top/article/practice/guide/1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。