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硬盘同样已经在报废的笔记本中使用了近十年,用在这里刚好;

未来如果容量不够仍然会用USB硬盘盒,我还有两块状况类似的硬盘闲置中……

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: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: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