0 更新记录

1 概述

最近用一些闲置设备搭建了一个用于 PT 下载的小主机,这里记录一下配置的过程。我用 PT 基本属于养老状态,偶尔下载一些资源,不想花费过多时间和精力去折腾,只是需要一台机器能长期开机保种而已。

此外由于目前尴尬的网络环境,以及我的硬件都是从闲置的硬件中挑选,一些方案可能比较奇怪,并不符合一般家庭网络场景下的常规选择,也没有性能、性价比和功耗等方面的考虑。

学校的校园网只提供无线方式接入,直接接入校园网的设备能获取到2001开头的公网 IPv6 地址(全球单播地址)。之前配置过一台 NAS,也在 NAS 上跑过一段时间的教育网 IPv6 PT,当时的方案是编译了带无线网卡驱动的 OpenWRT 软路由,通过无线网卡作为 WAN 口连接校园网,OpenWRT 配置了 IPv6 中继模式,让 LAN 侧设备都能获取到2001开头的 IPv6 地址。但是这个方案最近几个月变得不稳定,NAS 上连接教育网 PT 站还算正常,其他 LAN 侧设备虽然有 IPv6 地址,但无法访问 IPv6 网站,时好时坏,尝试回退软路由的配置到之前的备份也没有解决问题。最近新注册了其他非教育网 PT 站,NAS 也无法访问了。所以就准备单独搭建一个通过无线网卡联网的主机来挂 PT 保种,正好有一台联想 M710q 准系统主机闲置吃灰,也还有几块闲置的硬盘可以用。

1.1 硬件组成

主机使用联想 ThinkCentre M710q 准系统,用户手册,配件情况如下:

  • CPU:I3-7100T(与 M710q 一起购买,支持 VT-d,当时想用来安装 PVE)
  • 内存 1:16G DDR4 内存(旧笔记本拆机)
  • 内存 2:空
  • NVMe1:KIOXIA 512G SSD(旧笔记本拆机)
  • NVMe2:主板未焊接,好像可以改 BIOS 支持
  • SATA:Transcend 120G SSD(旧笔记本拆机,近十年前的 mSATA 硬盘,用一块转接板转为 SATA 接口)
  • 网卡 M.2:AX210(本来是买给笔记本用的,装上后经常突然重启)
  • USB:前面板 2 个 + 后面板 4 个,USB3.0 接口,接一个硬盘盒,安装了一块笔记本拆机的 2.5 寸 1T HDD

暂时的规划是用 120G 的 SSD 做系统盘,512G 的 SSD 和 1T 的 HDD 挂载到系统中存储下载的内容。对于我来说,PT 下载的数据存储的可靠性不需要太高,值得收藏的资源下载之后我会尽快同步到 NAS 中存储。

数据无价,谨慎考虑!

下载机存储方案相当草率:

这块 512G 的 SSD 已经被长期高强度使用,不知道什么时候会罢工,用在这里发挥一下余热;

USB 硬盘盒是一个极容易数据火葬场的方案,但这块 1T 硬盘同样已经在报废的笔记本中使用了近十年,用在这里刚好。

1.2 软件组成

  • Ubuntu Desktop 22.04
    • 用户名:ubuntu
  • WireGuard,外网远程访问;
  • qBittorrent-nox,PT 下载与保种上传;
  • Samba,SMB 共享。

1.3 网络结构

网络整体结构
网络整体结构

所有公网地址都是编的,仅用来说明网络结构。

所有表面上是单播 IPv6 地址(2001 开头)都被校园网防火墙关闭了入站连接,在校园网之外是无法 Ping 的。

图中标注为绿色的 IPv6 地址,是从校园网 AP 获得的能够稳定访问 IPv6 站点的地址。

标注为橙色的 IPv6 地址,是经过 OpenWRT 中继模式获得的 IPv6 地址,具有这些内网地址的设备访问 IPv6 站点并不稳定,故障似乎是近几个月才出现,因为我已经在 NAS 上正常用了一年多的 PT,原因暂时未知。

这也是我单独搞一个能直接连接校园网 AP,获取 IPv6 地址的下载机的主要原因。

OpenWRT 路由器通过无线接口 wlan0 连接校园网 AP:

  • WAN 侧获得校园网 IPv4 地址(10.192.xx.111)、单播 IPv6 地址(2001:250:20x❌x❌x:111);
  • LAN 侧局域网使用 192.168.50.0/24 地址段,网关 IP 为 192.168.50.1,IPv6 设置为中继模式,局域网设备也能获取到单播 IPv6 地址。

公网 WireGuard 服务器:

  • 阿里云小水管服务器,拥有公网 IPv4 地址(39.106.117.205);
  • 服务器作为所有没有公网 IP 的 WireGuard 节点的对端设备,其他节点之间的流量由服务器中转。
  • WireGuard 虚拟局域网网段为 192.168.70.0/24,服务器自身局域网 IP 为 192.168.70.1;
  • 使用WireGuard-Easy搭建 WireGuard 中转服务器,WireGuard-Easy 是一个用 WebUI 管理 WireGuard 节点的简单易用的工具,运行在 docker 容器中。
  • WireGuard 中转服务器转发节点之间的数据的防火墙规则由 WireGuard-Easy 设置(容器中),容器外由 docker 开放端口(iptables),云服务器还需要在其控制台防火墙规则中开放对应的端口。

Ubuntu-PT 下载机:

  • 通过无线接口 wlp2s0 连接校园网 AP,获得校园网 IPv4 地址(10.192.xx.219)、全球单播 IPv6 地址(2001:250:20x❌x❌x:219);
  • 通过有线接口 enp0s31f6 连接路由器 LAN 口,获得局域网 IP 地址(192.168.50.219),主要用于局域网内设备间 SMB 传输文件。禁用 IPv6,不用路由器中继的 IPv6;
  • 通过接口 wg0 连接公网 WireGuard 服务器,主要用于穿透校园网 AP 隔离,也可以与非校园网设备的互连。

2 Ubuntu 系统安装

系统使用 Ubuntu Desktop 22.04,也可以用 Server 版本,基本所有操作都可以不使用图形界面。

常规的系统安装,注意选对安装的硬盘全新安装。遇到的问题是之前在 KIOXIA SSD 中安装过 PVE,Ubuntu 安装后启动时会进入 grub rescue 模式,将 KIOXIA SSD 分区表删除即可,这个硬盘里的内容本来也是要清空的。

3 Ubuntu 初始配置

  • 设置 root 密码 : sudo passwd root

  • 连接 WiFi,校园网的 WiFi 身份验证方式一般和普通路由器的 WPA/WPA2-PSK 不同,我这里使用 WPA/WPA2-EAP 加密,EAP 类型选择 PEAP,认证方式选择 EAP-MSCHAPV2,鉴权和密码分别输入校园网的登录用户名和密码,其他设置留空或保持默认即可。

  • 修改软件源Tsinghua Open Source Mirror

    1
    2
    3
    4
    sudo mv  /etc/apt/sources.list /etc/apt/sources.list_bak
    sudo vim /etc/apt/sources.list
    sudo apt update
    sudo apt full-upgrade -y
  • 开启 SSH 服务

    1
    2
    3
    sudo apt install ssh -y
    sudo systemctl enable ssh
    # 有关于 SSH 安全性的设置可以最后一起修改,暂时不需要修改配置文件
  • 安装 Zsh,我习惯 Zsh 终端,安装过程参考之前文章:在 Ubuntu 中安装配置 Zsh

至此,完成了一个普通 Ubuntu 系统的安装和简单设置。

4 使用 WireGuard 实现外网访问

校园网存在 AP 隔离,不同设备间不能互访,上一小节的配置是在 M710q 上外接显示器和键盘鼠标来完成,现在解决“远程”SSH 连接的问题,让管理 M710q 能脱离显示器。

使用 WireGuard 是一个比较简单的方案,之前的其他设备互访也都是通过这个方法。WireGuard 是一种简单、高效和现代的虚拟专用网技术,简单理解是可以将不在同一局域网的设备连接到一个虚拟的局域网中实现相互访问,这里不做过多介绍。

WireGuard 本身不是“服务器 - 客户端”类型的连接,而是“节点 - 节点”的连接,相连的节点是对等的,互为对方的对端(peer)。但是这种情况要求至少有一方有公网 IP,如果两个节点都位于局域网中是无法连接的。这就不得不把 WireGuard 用成了“服务器 - 客户端”的模式,即让一个拥有公网 IP 的服务器充当 WireGuard 服务器节点,这个节点是所有无公网 IP 的节点的对端,无公网 IP 节点之间互访的流量会通过服务器中转。

我使用的是一个阿里云的小水管(1Mbps)服务器,只能用来连接 SSH,传文件就别想了。服务器使用WireGuard Easy建立,该工具提供了 WebUI 管理所有对端,设置 Ubuntu 下载机的虚拟子网 IP 后即可下载生成的配置文件 wg0.conf。对于只作为“客户端”的节点来说,不需要转发流量,不需要在配置文件中增加iptables规则,直接使用 WireGuard Easy 生成的配置文件无需修改。

每个设备都有 IPv6 公网地址,用 IPv6 配置 WireGuard 可以避免服务器中转,两台机器都在校园网有时甚至可以跑满校园网带宽(看运气),但是校园网可能会阻止来自非校园网的入站连接,非校园网环境不可用,(似乎也有解决办法,探索关键词:校园网免流)

我的应用场景中一般不需要从下载机远程传输文件,不过多折腾,能连通 SSH 即可。

Ubuntu 系统中安装 WireGuard 非常简单,直接用apt安装即可,安装后将配置文件 wg0.conf 移动至/etc/wireguard目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 安装
sudo apt install wireguard -y
sudo mv wg0.conf /etc/wireguard

# 启动,wg0是WireGuard的接口名,来自于配置文件名
sudo wg-quick up wg0
# 停止
sudo wg-quick down wg0

# 查看接口状态
sudo wg
sudo wg show

# 打开和关闭开机自启动
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

WireGuard 安装成功后,就可以用加入同一个 WireGuard 局域网的其他设备 SSH 连接到下载机的 WireGuard 局域网 IP 地址了,这样既能够在 AP 隔离的校园网内访问,也可以在非校园网环境访问。

5 挂载硬盘

对于一块全新的(已经删除分区的)硬盘,挂载到 Ubuntu 上的步骤一般为:创建分区,格式化,挂载,设置自动挂载。

如果硬盘有数据,可能需要删除分区,删除的步骤也在本节最后列出用作参考,不是必须的步骤。

文件系统选择 ext4,优点是 Linux 可以无痛兼容,缺点是 Windows 不能直接读取。后面会用 SMB 共享的方式让 Windows 来读写文件,不需要硬盘直连到 Windows 电脑上读写。

将硬盘挂载信息写入/etc/fstab文件,该文件在系统启动时被读入,执行挂载操作。挂载时使用硬盘的 UUID(Universally Unique Identifier),UUID 是固定的,避免了用设备节点名称(如/dev/sda1)挂载时,设备名称变化带来的挂载失败的问题。

涉及数据安全,请务必谨慎操作!

5.1 创建分区

首先找到空硬盘:sudo fdisk -l或者lsblk,这里需要挂载的硬盘设备名为/dev/nvme0n1

使用fdisk分区:sudo fdisk /dev/nvme0n1,用m命令打印帮助,如果只建立一个分区,直接用命令n,按照提示创建分区(保持默认一直回车即可),最后用w命令应用修改。用 w 保存修改之前,硬盘分区不会发生实际修改,随时可以退出 fdisk

5.2 格式化

指定文件系统:sudo mkfs -t ext4 /dev/nvme0n1

5.3 挂载

创建挂载目录,一般在/mnt目录下,我这里创建在当前用户 home 目录下:mkdir -p /home/ubuntu/nvssd

挂载:sudo mount /dev/nvme0n1 /home/ubuntu/nvssd

检查是否挂载成功:df -hT

调整目录权限:挂载后nvssd目录会被修改为 root 所有,普通用户无读写权限。直接修改nvssd目录权限让当前用户 ubuntu 可用读写:sudo chown ubuntu:ubuntu nvssd

5.4 设置自动挂载

查到硬盘的 UUID:sudo blkid,注意找对应硬盘的 UUID(不是 PARTUUID)。如果没有 UUID,可能是格式化没有成功。必须使用sudo,否则可能看不到所有硬盘。

找到要挂载硬盘的 UUID
找到要挂载硬盘的 UUID

编辑 fstab:sudo vim /etc/fstab,在最后一行加入:(替换为你自己硬盘的 UUID 和挂载路径)

1
2
3
UUID=6d0a******9c2 /home/ubuntu/nvssd  ext4  auto,nofail,user,rw  0  0
# nofail 防止硬盘故障无法开机
# user,rw 表示允许其他用户读写
编辑 fstab 文件
编辑 fstab 文件

测试自动挂载:sudo mount -a,测试前先取消已有的挂载。与手动挂载一样,此时仍可能有权限问题,用同样方法调整:sudo chown ubuntu:ubuntu nvssd。最好重启后用命令df -hT检查是否自动挂载成功。

硬盘已成功挂载
硬盘已成功挂载

5.5 其他问题

  • 取消挂载:sudo umount /home/ubuntu/nvssd,取消挂载时如果当前工作目录(cwd)在挂载目录中会提示挂载目录正忙,取消挂载失败。
  • 如需挂载 FAT32 和 NTFS 等非 UNIX 权限文件系统,可以通过挂载选项指定uidgid修复权限问题,参考评论区,但是不要用在 EXT4 等文件系统中包含权限信息的文件系统中,这类文件系统直接修改挂载目录的所有权即可。
  • 删除分区方法:使用fdisk删除分区:sudo fdisk /dev/nvme0n1,输入d命令,输入分区编号依次删除即可,最后用w命令保存。

6 配置 qBittorrent

最初由于无知安装了普通版本的qbittorrent,连接显示器导入了大量的种子之后才想起来查一下如何只启动 WebUI 而不启动 GUI,结果发现无 GUI 版本的程序叫qbittorrent-nox

幸运的是qbittorrentqbittorrent-nox可以共存(不能同时运行),默认情况下配置文件和种子信息数据存放路径相同,可以无缝切换。

6.1 安装 qbittorrent-nox

1
2
3
4
5
6
# 添加qBittorrent PPA源
sudo add-apt-repository ppa:qbittorrent-team/qbittorrent-stable

# 安装
sudo apt update
sudo apt install qbittorrent-nox -y

安装的版本为 qBittorrent v4.5.5,以下设置基于这个版本。

6.2 启动 qbittorrent-nox

启动 qbittorrent-nox 有两种方式可以选择,使用当前用户直接运行和创建独立的用户运行。

主要区别是:

  • 使用当前用户运行:
    • 优点:
      • 设置和管理较为简单,不需要创建新用户,也不需要配置权限;
      • 下载的文件直接在当前用户的权限范围内,访问和修改都较为方便。
    • 缺点:
      • 安全性较低,权限较大。如果 qbittorrent-nox 被利用,攻击者可能获取当前用户的所有权限。
  • 使用独立的用户运行
    • 优点:
      • 可以限制 qbittorrent-nox 仅拥有必要的权限,降低安全风险。
    • 缺点:
      • 文件访问不便,qbittorrent-nox 只能往新用户有写入权限的目录下载文件;并且下载的文件权限属于新用户,需要额外的权限调整才能让其他用户读写下载的文件。

考虑到下载机是我个人使用,不会将其暴露在公网,安全风险不是很高,简单起见直接用当前用户运行,不过下面仍然给出两种方式的操作步骤用作参考,选择任意一种即可。

使用当前用户运行

  • 运行

运行:qbittorrent-nox,此时可以访问 WebUI。默认用户admin,密码adminadmin,设置信息和种子数据保存在当前用户的 home 目录中:

1
2
QBT_DATA_DIR="$HOME/.local/share/qBittorrent/BT_backup"
QBT_CONFIG_DIR="$HOME/.config/qBittorrent"
  • 设置后台运行及开机自启动:

较新版本的 qBittorrent 提供了 systemd 的配置文件/usr/lib/systemd/system/qbittorrent-nox@.service,无需自己编写,运行时需要指定一个启动程序的用户作为参数。
这个文件在:github:qbittorrent-nox%40.service.in,如果系统中没有可以直接在这里复制。

1
2
3
4
5
6
7
8
9
10
# 启动,'@'后为指定的参数,由哪个用户运行 qbittorrent-nox
sudo systemctl start qbittorrent-nox@ubuntu
# 停止
sudo systemctl stop qbittorrent-nox@ubuntu
# 查看状态
sudo systemctl status qbittorrent-nox@ubuntu
# 开机自启动
sudo systemctl enable qbittorrent-nox@ubuntu
# 关闭开机自启动
sudo systemctl disable qbittorrent-nox@ubuntu

使用独立的用户运行

  • 创建用户

创建一个非特权的新用户来运行 qbittorrent-nox,这里指定--system参数创建系统用户,系统用户拥有更少的权限,默认 shell 是/usr/sbin/nologin,即不允许从终端和 SSH 登录,也不需要密码。用--group参数创建用户组,对于系统用户如果不指定则会不创建新组。添加--home参数创建用户 home 目录。

1
sudo adduser --system --group --home /home/qbtuser qbtuser

注意创建用户命令adduseruseradd是不同的两个命令,useradd更底层,adduser更友好一些;

创建用户组是为了后面协助解决权限问题;

需要 home 目录是因为 qbittorrent-nox 启动时会在启动用户的 home 目录保存设置信息和种子数据;

注意建立系统用户在不同系统可能有不同的行为,提前用 man adduser确认。如 Debian12 中如果不指定--home则不会创建 home 目录,但在 Ubuntu22.04 中,不指定--home也会创建 home 目录。

如果没有指定--system参数,创建的是普通用户,需禁止用户从终端和 SSH 登录,使用命令sudo usermod -s /usr/sbin/nologin qbtuser,如需要恢复该用户的登录权限,使用命令sudo usermod -s /bin/bash qbtuser

  • 解决权限问题

一般可能会遇到两处权限问题:

  1. 使用 qbtuser 启动的程序只能往 qbtuser 具有写入权限的目录中下载文件。
  2. 使用 qbtuser 启动的程序下载的文件权限属于 qbtuser,其他用户不能访问。

如果下载的东西都存在 qbtuser home 目录中,且 home 目录足够大,第一个问题不需要处理。

如果需要向其他用户拥有的目录下载,比如我使用当前用户 ubuntu 挂载的硬盘目录nvssd,需要单独设置挂载目录的写入权限:

1
sudo setfacl -R -m "u:qbtuser:rwx" /home/ubuntu/nvssd

该命令递归地给予用户 qbtuser 对目录/home/ubuntu/nvssd及其所有子目录和文件的读、写和执行权限,允许用户 qbtuser 完全访问和操作这些文件和目录,而不影响其他用户的权限设置。

也可以像挂载硬盘中提到的那样,使用sudo chown qbtuser:qbtuser /home/ubuntu/nvssd将挂载目录的所有权转移至 qbtuser 用户,但这样又会让其他用户(如当前用户 ubuntu)无法访问nvssd,也就是变成了第二个问题那种情况,需要进一步将需要读取文件的用户加入到 qbtuser 用户组,让其他用户可以访问属于 qbtuser 的文件和目录。

1
2
3
4
5
6
# 使用adduser将已存在的用户ubuntu加入到已存在的用户组qbtuser中
sudo adduser ubuntu qbtuser
# 或者使用usermod命令 -a表示append
sudo usermod -aG qbtuser ubuntu
# 查看用户是否成功加入组
groups ubuntu
  • 运行及开机自动运行

参考使用当前用户运行中的命令,将所有用户名替换成新的系统用户用户名 qbtuser。

1
2
sudo systemctl start qbittorrent-nox@qbtuser
sudo systemctl enable qbittorrent-nox@qbtuser

6.3 设置 qBittorrent

设置 qBittorrent 在 WebUI 中进行,这部分设置内容需要参考 PT 站的要求结合个人习惯设置,这里列出部分我觉得有用的设置。

部分设置参考了用户 @ColderCoder 发布在各 PT 站的帖子,在此表示感谢!

  • 下载页面
    • 勾选为所有文件预分配磁盘空间;
    • 修改默认保存路径到挂载的硬盘目录;
  • 连接页面
    • 监听端口设置为 10000-65535 之间的数,不要过小,也不要随机;
    • 取消勾选使用 UPnP/NAT-PMP,自己在路由器设置端口转发;
    • IP 过滤可以写一个.dat文件过滤掉所有 IPv4 地址,文件内容只需写入:0.0.0.0-255.255.255.255即可;
  • 速度页面
    • 有些 PT 站会有最大速度要求,可以在这里加全局限制防止违规被 ban;
  • BitTorrent 页面
    • 隐私部分全部取消勾选(针对 PT);
    • 取消勾选 Torrent 排队;
    • 取消做种限制(按需);
  • RSS 页面
    • 考虑到近期 qBittorrent 的漏洞,取消勾选所有 RSS 功能;
  • WebUI 页面
    • 设置语言为中文;
    • 端口修改为不常用的端口;
    • 取消勾选使用 UPnP/NAT-PMP,自己设置端口转发,使用 WireGuard 时,通过虚拟专用网络隧道访问,无需端口转发;
    • 建议启用 HTTPSTODO;即便是用 WireGuard,仍然建议配置 HTTPS(来自 AI 的建议,但我觉得没什么用);
    • 验证部分的用户名和密码就是登录 WebUI 的用户名和密码,建议设置复杂密码;
    • 不要开启两个跳过身份验证功能;为什么不要使用 qBittorrent WebUI 的跳过身份验证功能
  • 高级页面
    • 网络接口选为无线网络接口,即有 IPv6 地址的接口;
    • 绑定到的可选 IP 地址选为所有 IPv6;
    • 磁盘 IO 类型设置为 POSIX 可以减少内存占用,需要 libtorrent 版本在 2.0 及以上,用ldd /usr/bin/qbittorrent-nox | grep libtorrent查看 qbittorrent-nox 依赖的库版本;
    • 勾选允许来自同一 IP 地址的多个连接;
    • 增大最大并行 HTTP 发布,直接加两个 0;

标记为TODO的内容以可能后会单独补充。

再次提醒

qBittorrent 的设置建议参考 PT 站的新手教程,谨慎修改不知道是什么意思的设置。

6.4 备份与恢复

使用当前用户运行部分提到过 qBittorrent 的设置信息和种子数据保存在当前用户的 home 目录中:

1
2
QBT_DATA_DIR="$HOME/.local/share/qBittorrent/BT_backup"
QBT_CONFIG_DIR="$HOME/.config/qBittorrent"

qBittorrent 的备份和恢复只需要关心这两个目录中的文件。这里分享一个 ChatGPT 帮我写的备份程序,使用前注意修改为你自己的路径:

备份qBittorrent_backup.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
# 指定保存备份文件的目录
BACKUP_DIR="$HOME/qbittorrent_backup"
# 确保备份目录存在,不存在则创建
if [ ! -d "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
fi
# 需要备份的qBittorrent设置和数据目录
QBT_DATA_DIR="$HOME/.local/share/qBittorrent/BT_backup"
QBT_CONFIG_DIR="$HOME/.config/qBittorrent"
# 检查目录是否存在
if [ ! -d "$QBT_DATA_DIR" ] || [ ! -d "$QBT_CONFIG_DIR" ]; then
echo "qBittorrent data or config directory does not exist."
exit 1
fi
# 获取当前时间戳
TIMESTAMP=$(date +%Y%m%d%H%M%S)
# 备份,备份文件名添加备份时的时间戳
echo "Starting backup of qBittorrent settings and data..."
tar -czf "$BACKUP_DIR/qbittorrent_data_${TIMESTAMP}.tar.gz" -C "$QBT_DATA_DIR" .
tar -czf "$BACKUP_DIR/qbittorrent_config_${TIMESTAMP}.tar.gz" -C "$QBT_CONFIG_DIR" .
echo "Backup completed successfully."

7 配置 SMB 共享

开始提到我还有一台 OpenWRT 软路由在使用中,给我的一些其他设备提供了一个局域网环境,主要是给一些不能直接连接校园网 WiFi 的物联网设备提供网络,也可以让其他局域网主机连接 NAS。这台下载机同样需要接入到路由器的局域网中,因为我需要用 Windows 主机查看下载的内容,也需要将值得收藏的资源传输到 NAS 中保存。

SMB 部分网络结构
SMB 部分网络结构

网络结构是下载机使用网线连接路由器,网线接口只用于下载机和内网其他主机(Windows 主机、NAS)之间传输文件。下载机的下载和上传以及连接 PT 站通过无线网卡直接连接校园网 WiFi 获取 IPv6。

原本计划在下载机配置 SMB 共享,将下载目录共享出去,Windows 主机和 NAS 挂载这个共享目录,可以实现 Windows 主机读写下载机、NAS 读写下载机的目的。但是实际测试发现 NAS 挂载 CIFS(SMB)共享目录并不稳定,传输文件时会经常卡住。

最后方案修改为:

最终 SMB 共享方案
最终 SMB 共享方案
  • 下载机通过 SMB 共享下载目录/home/ubuntu/nvssd,实现与 Windows 主机的文件传输;
  • NAS 中创建一个单独的目录/PTShare和一个低权限(只对/PTShare目录有读写权限)的 SMB 用户ptuser,专门用于下载机与 NAS 之间的文件传输,由下载机将 NAS 的共享目录挂载到/home/ubuntu/NAS_PTShare

该方案虽然比较“将就”,但测试下来还是能够稳定的满足需求的。

下面7.17.27.37.4介绍下载机作为 SMB 服务端,安装并配置 SMB 服务,让 Windows 客户端能够访问下载机的 SMB 共享目录。7.5介绍下载机作为 SMB 客户端,挂载 NAS 上 SMB 服务器共享的目录。

7.1 安装 Samba

SMB 协议是“客户端 - 服务器”类型的协议,客户端通过该协议可以访问服务器上的共享文件系统,打印机等资源。Samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件。在 Ubuntu 系统中可以直接使用apt包管理器安装:

1
sudo apt install samba -y

7.2 修改 Samba 配置

Samba 的配置文件位于/etc/samba/smb.conf,修改后可以使用命令testparm来测试配置文件是否存在错误,修改配置文件后建议重启 Samba 服务使文件修改生效。

配置文件由若干小节(section)组成,默认配置文件中一般包含[global][homes][printers][print$]。在我安装的版本中(Version 4.15.13-Ubuntu),[homes]部分已经被注释掉了,在一些旧版本中,[homes]部分默认是开启的。

[global]部分定义了一些全局配置,通常是规定了 Samba 服务器的行为,也可能包含一些“共享资源”参数的默认值。除[global]之外的所有小节都定义了一个“共享资源”,这些共享资源要么是文件共享服务(即将创建的共享目录就是这种),要么是可打印服务(如[printers][print$])。

首先修改[global]部分,修改两处原有的配置,追加两条新增的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 原配置文件中为yes,这里改为no;
# 这个配置会影响后面创建文件和目录的权限设置,修改为no即可
obey pam restrictions = no

# 原配置文件中为yes,这里改为no;
# 该配置允许共享在没有身份验证的情况下被访问,通常用于让网络中的任何人都能访问某些公开的资源,不需要输入用户名和密码
usershare allow guests = no

# 以下两条配置为新增配置,放在[global]部分最后即可
# 设置SMB协议版本不低于SMB3,设置前确保所有客户端都支持SMB3
server min protocol=SMB3
# 安全模式设置为user,要求连接的客户端提供有效的用户名和密码,实际上这是默认的安全模式,不设置这一条也可以
security=user

如果客户端挂载时出现连接问题,可以考虑删除server min protocol=SMB3试一下,我在用 NAS 挂载下载机的 SMB 共享时,NAS 上的 SMB 客户端就不支持 SMB3 协议。

然后处理[homes][printers][print$],如果没有明确的理由需要使用这些功能,建议全部注释掉以关闭 home 目录的共享和打印机共享。我这里全部注释。

最后增加要共享的目录,我这里直接将硬盘的挂载目录共享出去,以目录/home/ubuntu/nvssd为例:

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
26
27
28
29
30
31
32
33
[NVSSD]
# 资源描述信息
comment = NVMe SSD 500G
# 共享的目录
path = /home/ubuntu/nvssd
# 允许连接的主机
hosts deny = 0.0.0.0/0
hosts allow = 192.168.50.0/24 192.168.70.0/24
# 允许访问的用户(多用户用逗号隔开,"@组名"可以指定一组用户)
valid users = ubuntu
# 禁止访问的用户
# invalid users = root
# 允许写入的用户
# write list = ubuntu
# 共享目录可被浏览(
# 设置为no后访问主机地址看不到path目录,但访问包含目录的地址可以打开目录
browseable = yes
# 共享目录是否可写
writable = yes
# 是否允许guest用户访问
guest ok = no
# 新建文件的最高权限(DOS权限->UNIX权限后与该参数按位与得到UNIX权限)
# 文件0664与Ubuntu默认用户权限相同
create mode = 0664
# 新建目录的最高权限(DOS权限->UNIX权限后与该参数按位与得到UNIX权限)
# 目录0775与Ubuntu默认用户权限相同
directory mode = 0775
# 新建文件的最低权限(将上一步得到的UNIX权限与该参数按位或得到最终权限)
# 默认值为0000,Windows创建的权限与Linux显示的权限不一致时可以启用该参数强制修改权限
force create mode = 0664
# 新建目录的最低权限(将上一步得到的UNIX权限与该参数按位或得到最终权限)
# 默认值为0000,Windows创建的权限与Linux显示的权限不一致时可以启用该参数强制修改权限
force directory mode = 0775

设置项的含义和用途基本已在注释中说明,这里说明两处细节:

  • 访问控制

出于安全性考虑,使用hosts denyhosts allow限定了允许连接的主机 IP 段,即先拒绝所有 IP 的连接,然后放通内网网段(192.168.50.0/24)和 WireGuard 内网网段(192.168.70.0/24)的连接。

hosts denyhosts allow也可以在[global]部分设置,但是与其他参数惯用的:“共享资源”中的设置优先于(覆盖)“全局默认”的设置不同,对于可连接的主机设置是[global]会覆盖“共享资源”中对应的条目。此外如果再加上仅有hosts deny或者仅有hosts allow时的特殊规则,会让 Samba 的访问控制逻辑变得十分复杂。Samba 访问控制的详细分析可以访问文末相关的参考链接。

配置后可以使用命令testparm /etc/samba/smb.conf pc 192.168.1.11测试配置文件中设置的访问控制的有效性,pc是待测试的客户端主机名,可以使用任意字符串,192.168.1.11是待测试的客户端的 IP,可以测试当前的客户端 IP 能否访问共享的资源。

我这里用简单明确的方式,不在[global]设置,仅在具体的“共享资源”中设置,缺点就是如果需要修改则需要逐个修改所有共享。

  • 权限控制

配置文件中使用了create modedirectory mode分别控制在共享目录中创建文件和目录的权限,按照文档描述,新建的文件或目录的权限是在完成 DOS 权限模型到 UNIX 权限模型的映射后,将得到的权限值与该参数按位与得到新建文件的权限。

二进制运算中,经常用按位与运算x = x & (~mask)来将x中对应mask为 1 的那些位修改为 0,而不影响对应mask为 0 的那些位,这里将映射后的权限与该参数按位与,就是将该参数没有指定的(为 0 的)那些权限移除,计算后的权限一定不包含该参数没有的那些权限,可以认为这个参数限制了新建文件和目录的最高权限。

文档中同时说明了force create modeforce directory mode的用途,即将create modedirectory mode产生的权限结果再和force参数做一次按位或,按位或运算x = x | mask用于将x中对应mask为 1 的那些位修改为 1,而不影响对应mask为 0 的那些位,这里使用按位或运算添加了该参数所指定的权限,也就是最终权限中一定包含该参数所指定的那些权限。可以认为这个参数限制了新建文件和目录的最低权限。

总结:

  • create modedirectory mode用来移除权限,客户端创建文件或目录的权限经过这两个参数移除之后,得到不超过这两个参数的权限;
  • force create modeforce directory mode用来增加权限,上一步得到的权限经过这两个参数增加后,得到不低于这两个参数指定的权限;
  • create modedirectory mode设置的权限高于force create modeforce directory mode设置的权限是没有意义的。

举个例子:Windows 客户端创建一个文件,假定初始权限是 644(我并没有深入了解 DOS 权限到 UNIX 权限是如何转换的,这里仅假设一个权限说明权限参数的作用),文件所有者有读写权限,组内用户和其他用户有读权限。首先和create mask = 0604按位与得到权限为 0604,移除了组用户的读权限,然后和force create mode = 0741按位或运算得到最终权限 0745,给所有者和其他用户添加了可执行权限,给组内用户增加了可执行权限。

可以用计算器(八进制模式)计算结果。

计算权限结果
计算权限结果

也可以按照以上例子中的参数设置,新建文件验证文件权限(但是这个设置完全是我为了举例子瞎编的,完全不合理,测试一下即可,不要使用!)。

新建文件测试权限设置有效
新建文件测试权限设置有效

这里有一个坑点,文档中说明create mask等同于create modedirectory mask等同于directory mode。但是,带force的参数只有force create modeforce directory mode,没有force create maskforce directory mask

错误的使用了force create maskforce directory masktestparm时会提示未知参数被忽略,但我起初没注意到这个错误提示……

提示 force create mask 是未知参数
提示 force create mask 是未知参数

另外在[global]设置处提到,如果设置了obey pam restrictions = yes,最终权限也可能不符合预期计算的结果,参考:Samba permissions being ignored

实际上,搭配使用不带force的参数和带force的参数,不论初始权限是什么最终权限总能修改成所需要的权限。

我这里将两参数指定为相同的权限,最终得到的效果就是不论是从什么类型的客户端新建或上传文件,权限都会强制修改为 Ubuntu 当前用户 ubuntu 的默认权限,文件为 664,目录为 775。

Ubuntu 用户的新建文件和目录的权限是怎么得到的?

Linux 用户新建文件的默认权限是用 umask(用户文件创建模式掩码)计算的,通过屏蔽掉特定权限位来决定新文件和目录的默认权限。可以用umask命令查看当前用户的 umask 值,也可以指定参数umask -S查看 umask 值对应的权限信息。

Ubuntu 默认的umask=002

  • 对于目录,起始权限为777,目录有可执行权限表示被打开,用umask=002表示移除了其他用户的写权限,得到最终权限775
  • 对于文件,起始权限为666,因为大部分文件不需要执行权限,用umask=002表示移除了其他用户的写权限,得到最终权限664

计算过程是起始权限modeumask按位取反的值按位与,即mode & (~umask),也可以直接理解成mode - umask

所以,Ubuntu 用户的新建文件和目录的权限分别为 664 和 775。

7.3 启动 Samba 服务

启动服务之前,还需要添加客户端登录 Samba 服务器的用户名和密码,只能使用系统中存在的用户,如果想使用独立的用户访问 SMB 服务,先添加新用户,添加新用户的方法在使用独立的用户运行中介绍过。

我这里直接使用当前用户 ubuntu,添加时提示输入的密码是登录 SMB 服务器的密码,不是登录终端和 SSH 的密码

1
2
# 添加Samba用户
sudo smbpasswd -a ubuntu

其他可能用得到的命令:

1
2
3
4
5
6
7
8
# 列出所有Samba用户
sudo pdbedit -L
# 禁用Samba用户
smbpasswd -d ubuntu
# 启用Samba用户
smbpasswd -e ubuntu
# 删除Samba用户
smbpasswd -x ubuntu

Samba 启动停止和自启动等也用systemctl管理:

1
2
3
4
5
6
7
8
9
10
# 启动
sudo systemctl start smbd
# 停止
sudo systemctl stop smbd
# 查看状态
sudo systemctl status smbd
# 开机自启动
sudo systemctl enable smbd
# 关闭开机自启动
sudo systemctl disable smbd

启动后在 Windows 上访问\\192.168.50.219(下载机局域网 IP 地址),输入 Samba 用户名和密码后,就可以查看下载机的共享目录了。

7.4 修复默认路由问题

受限于网络环境,我的下载机同时连接了网线和 WiFi。网线接口禁用了 IPv6,仅用于局域网内的 SMB 文件互传;无线网卡负责访问外网,包括常规的 IPv4 流量和连接 PT 站的 IPv6 流量。

Ubuntu Desktop 22.04 默认用 NetworkManager 管理网络连接(Sever 版似乎用 netplan),有线网络和无线网络都会自动创建默认网关,而有线网络的优先级默认高于无线网络(参考:NetworkManager 管理多个默认网关)。有线网络 Ethernet 默认的 Metric 为 100,无线网络 Wi-Fi 的默认 Metric 为 600,数值越小优先级越高。

默认设置
默认设置

图中第一条网关为192.168.50.1(OpenWRT 路由器),接口为enp0s31f6的路由规则应当被删除,并且以后也不自动创建这条路由。

修改有线网卡的连接配置让其不再自动添加默认网关:

显示所有连接:

1
nmcli connection show
显示所有连接
显示所有连接

设置连接'Wired connection 1'ipv4.never-default值为yes

1
sudo nmcli connection modify 'Wired connection 1' ipv4.never-default yes

重启'Wired connection 1'连接:

1
2
sudo nmcli connection down 'Wired connection 1'
sudo nmcli connection up 'Wired connection 1'
修改后重启连接
修改后重启连接

最后查看路由表,现在的路由表符合预期:

1
route -n
路由表设置成功
路由表设置成功

7.5 挂载其他主机的 SMB 共享

这里将 Ubuntu 下载机(IP:192.168.50.219)作为 SMB 客户端,挂载 NAS(IP:192.168.50.233)上 SMB 服务器共享的目录,用于下载机与 NAS 之间的文件传输。虽然在 Linux 主机中使用 NFS (Network File System) 挂载可能更合理,但是 NAS 先前已经设置好了 SMB 服务器,此处为了减少工作量也使用了 SMB 方式。

挂载 NAS 的 SMB 共享
挂载 NAS 的 SMB 共享

首先在 NAS 中创建一个单独的共享目录PTShare和一个专门让下载机登录的 SMB 用户ptuserptuser用户设置为只对PTShare目录具有读写权限。

然后在 Ubuntu 下载机操作,挂载 NAS 上的共享目录PTShare,首先安装必要的工具包:

1
sudo apt install cifs-utils

挂载,将 NAS 上的远程目录PTShare挂载到本地的目录/home/ubuntu/NAS_PTShare,本地目录需要提前创建:

1
2
mkdir -p /home/ubuntu/NAS_PTShare
sudo mount -t cifs -o uid=1000,gid=1000,username=ptuser //192.168.50.233/PTShare /home/ubuntu/NAS_PTShare

挂载命令中的挂载参数uid=1000,也可以直接使用用户名uid=ubuntu,设置这个参数指定挂载目录中文件的默认所有权,如果不设置默认为uid=0,即root用户。

输入挂载命令后,会提示输入密码,这个密码是在 NAS 中创建的 SMB 用户ptuser的登录密码。密码也可以直接使用参数password=xxxxx的方式指定,但如果包含,则会出错,更推荐的做法是将登录信息写在凭证文件中。

建立凭证文件,如/root/.ptuser.smb_credit,安全起见最好将这个文件设置为仅有 root 用户可以读写,这里放在 root 用户的 home 目录中,并将权限设置为 600:

1
2
3
4
5
6
sudo vim /root/.ptuser.smb_credit
# 写入SMB用户名和密码
username=ptuser
password=xxxxxx
# 修改权限为600
sudo chmod 600 /root/.ptuser.smb_credit

挂载命令修改为:

1
sudo mount -t cifs -o uid=1000,gid=1000,credentials=/root/.ptuser.smb_credit //192.168.50.233/PTShare /home/ubuntu/NAS_PTShare

查看挂载情况:

1
df -hT

还可以使用参数指定 SMB 协议版本为 SMB3 及以上(可选):

1
2
# 使用SMB3.0
sudo mount -t cifs -o uid=1000,gid=1000,seal,vers=3.0,credentials=/root/.ptuser.smb_credit //192.168.50.233/PTShare /home/ubuntu/NAS_PTShare

取消挂载方式与挂载硬盘相同:

1
sudo umount /home/ubuntu/NAS_PTShare

至此完成了在 Ubuntu 下载机挂载 NAS 上的 SMB 共享目录的过程,注意这种挂载是临时的,重启后会失效,这与普通硬盘的挂载是相同的。设置自动挂载的方式也一样,通过将挂载信息添加到/etc/fstab文件实现开机自动挂载,参考挂载硬盘,我这里并没有设置自动挂载,给出参考写法:

1
2
# 添加到/etc/fstab
//192.168.50.233/PTShare /home/ubuntu/NAS_PTShare cifs _netdev,nofail,uid=1000,gid=1000,credentials=/root/.ptuser.smb_credit 0 0

与直接执行mount命令相比增加了两个参数,_netdev表明这是一个网络设备,系统会在网络就绪之后再尝试挂载;nofail表示不报告错误,不指定这个参数时如果挂载出错可能导致系统无法启动。

至此基本完成了下载机的配置,本来还计划记录一些提高安全性的内容,这里也标记为DONE后面再单独写吧。已完成,见提高 PT 下载机安全性的配置

参考


本站由 @gsh1209 使用 Stellar 主题创建
Copyright © 2023 - BG3LNT.XYZ
Favicon图标来自 @ChenCJ
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处
正在计算运行时间...

蒙ICP备2022000455号-2