本文记录了在Ubuntu 22.04 (WSL)上部署BitTorrent Tracker服务器的完整过程,包括遇到的问题及解决方案。

1. 环境准备

1.1 安装Node.js

首先需要安装较新版本的Node.js:

# 移除旧版本Node.js(如有)
sudo apt remove nodejs
sudo apt autoremove

# 安装依赖
sudo apt update
sudo apt install -y ca-certificates curl gnupg

# 添加NodeSource官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

# 添加NodeSource仓库
NODE_MAJOR=22
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

# 安装Node.js 22.x
sudo apt update
sudo apt install -y nodejs

# 验证安装
node --version
npm --version

1.2 创建项目目录

mkdir -p ~/bittorrent-tracker-server
cd ~/bittorrent-tracker-server

1.3 WSL网络配置(高级桥接模式)

WSL默认采用NAT网络模式,这会导致以下问题:

  • 局域网其他设备无法直接访问WSL中的服务
  • 需要在Windows主机上设置复杂的端口转发
  • NAT无法正确转发UDP流量,BitTorrent需要UDP协议支持

在本配置中,我们使用了WSLAttachSwitch工具为WSL2添加直接连接到Hyper-V虚拟交换机的网络接口:

# 在Windows PowerShell中创建虚拟交换机(示例)
# New-VMSwitch -Name "WSL Bridge" -AllowManagementOS $true -NetAdapterName "Wi-Fi"

# 在WSL中使用WSLAttachSwitch工具连接到虚拟交换机
# cmd.exe /c "path\to\WSLAttachSwitch.exe" "WSL Bridge"

# 在WSL中启用新添加的网络接口
ip link set eth1 up

# 配置DHCP获取IP地址
dhclient eth1

网络流量路径

  1. WSL2虚拟机内的应用程序(BitTorrent Tracker)
  2. 通过WSL的eth1接口直接连接到Hyper-V虚拟交换机
  3. 虚拟交换机直接连接到物理网络适配器(如Wi-Fi或以太网)
  4. 数据直接进入局域网,无需经过Windows主机的NAT或路由层

这种配置使WSL2在网络上表现为一个独立设备,与局域网中的其他设备没有区别,所有流量都绕过了Windows防火墙。

注意:桥接模式可能会导致笔记本无线网卡性能下降,因为物理网卡需要同时处理Windows主机和WSL2的网络流量。如果遇到网络卡顿,可以在不使用tracker时关闭桥接模式。

1.4 配置防火墙

在这种高级桥接配置下,Windows防火墙对WSL2网络流量没有控制能力,因为流量直接通过虚拟交换机走,绕过了Windows的网络筛选层。

需要在WSL2内部配置防火墙:

# 检查WSL内防火墙状态
sudo ufw status

# 如果需要启用防火墙并开放特定端口
sudo ufw allow 8000/tcp
sudo ufw allow 8000/udp

# 启用防火墙(如果需要)
# sudo ufw enable

大多数情况下,WSL内的防火墙默认是未启用的,tracker服务可以直接工作,无需额外配置。

2. 安装BitTorrent Tracker

2.1 安装依赖包

# 初始化npm项目
npm init -y

# 安装bittorrent-tracker包
npm install bittorrent-tracker

安装过程中会看到以下警告,这不影响使用:

added 83 packages, and audited 84 packages in 27s
19 packages are looking for funding
run `npm fund` for details
2 high severity vulnerabilities
To address all issues, run:
npm audit fix
Run `npm audit` for details.

3. 配置和启动Tracker服务器

3.1 尝试使用命令行工具启动(遇到问题)

# 全局安装bittorrent-tracker命令行工具
npm install -g bittorrent-tracker

# 尝试启动tracker服务器
nohup bittorrent-tracker --port 8000 --http --udp --ws > tracker.log 2>&1 &

问题1: 命令执行后进程很快退出,退出码127表示"命令未找到"

[1]+  Exit 127                nohup bittorrent-tracker --port 8000 --http --udp --ws > tracker.log 2>&1

3.2 使用编程API方式启动(成功解决)

创建服务器启动脚本:

cat > start-tracker.js << 'EOF'
import { Server } from 'bittorrent-tracker'

const server = new Server({
  udp: true,
  http: true,
  ws: true,
  stats: true
})

server.on('error', function (err) {
  console.error('错误:', err.message)
})

server.on('listening', function () {
  console.log('Tracker 服务器启动成功!')
  
  // HTTP
  if (server.http) {
    const httpAddr = server.http.address()
    const httpHost = httpAddr.address !== '::' ? httpAddr.address : 'localhost'
    const httpPort = httpAddr.port
    console.log(`HTTP tracker: http://${httpHost}:${httpPort}/announce`)
  }
  
  // UDP
  if (server.udp) {
    const udpAddr = server.udp.address()
    const udpHost = udpAddr.address
    const udpPort = udpAddr.port
    console.log(`UDP tracker: udp://${udpHost}:${udpPort}`)
  }
  
  // WebSocket
  if (server.ws) {
    const wsAddr = server.ws.address()
    const wsHost = wsAddr.address !== '::' ? wsAddr.address : 'localhost'
    const wsPort = wsAddr.port
    console.log(`WebSocket tracker: ws://${wsHost}:${wsPort}`)
  }
})

// 使用随机端口
const port = 8000
server.listen(port)
EOF

为使用ES模块语法,需要在package.json中添加type字段:

# 修改package.json,添加type: module
sed -i '/"main":/a \ \ "type": "module",' package.json

启动服务器:

node start-tracker.js

问题2: 第一次尝试时遇到错误:错误: bind EINVAL 0.0.0.0:8000解决方法: 后续再次尝试启动脚本成功,可能是端口被临时占用或需要一些时间释放。

3.3 配置systemd服务实现后台运行

为了使Tracker服务在后台持续运行,并在系统重启后自动启动,可以创建一个systemd服务:

# 创建服务文件
sudo nano /etc/systemd/system/bittorrent-tracker.service

在文件中添加以下内容:

[Unit]
Description=BitTorrent Tracker Server
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/bittorrent-tracker-server
ExecStart=/usr/bin/node /root/bittorrent-tracker-server/start-tracker.js
Restart=on-failure

[Install]
WantedBy=multi-user.target

启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable bittorrent-tracker
sudo systemctl start bittorrent-tracker

检查服务状态:

sudo systemctl status bittorrent-tracker

4. 验证Tracker服务器

成功启动后,可以通过浏览器访问tracker的统计页面:

http://[服务器IP]:8000/stats

初始状态显示:

0 torrents (0 active)
Connected Peers: 0
Peers Seeding Only: 0
Peers Leeching Only: 0
Peers Seeding & Leeching: 0
IPv4 Peers: 0
IPv6 Peers: 0
Clients:

5. 使用qBittorrent创建Torrent文件

  1. 在qBittorrent中,选择"制作Torrent"选项

  2. 选择要分享的文件或文件夹

  3. 勾选"私有torrent"选项,防止通过DHT网络分享

  4. 在"Tracker URL"字段填写服务器地址:

    http://[服务器IP]:8000/announce
    
  5. 点击"制作Torrent"按钮创建种子文件

6. 验证Torrent创建和连接

创建Torrent并开始做种后,再次检查tracker统计页面,可以看到:

1 torrents (1 active)
Connected Peers: 1
Peers Seeding Only: 1
Peers Leeching Only: 0
Peers Seeding & Leeching: 0
IPv4 Peers: 1
IPv6 Peers: 0
Clients:
* **qBittorrent** 5.0.4 : 1

这表明Torrent文件已成功创建并注册到tracker服务器,且客户端已连接并处于做种状态。

7. 总结

遇到的主要问题

  1. 命令行工具问题: 尽管全局安装了bittorrent-tracker,但命令行工具无法正常工作,可能与环境变量或Node.js版本有关。
  2. 端口绑定问题: 偶尔会遇到端口绑定错误,多尝试几次或更换端口可解决。
  3. WSL网络配置: 默认NAT模式下需要复杂的端口转发才能使局域网其他设备访问服务,高级桥接模式是更好的选择。
  4. 网络性能: 使用桥接模式可能导致笔记本无线网卡性能下降,特别是在处理大量网络流量时。这是因为物理网卡需要同时处理Windows和WSL2的网络流量。