# qBittorrent SOCKS5 代理 + BT 入站转发配置文档

## 架构总览

```
                    出站（SOCKS5 代理）
qBittorrent(192.168.1.200)                                 互联网
    ↓ SOCKS5 旁路由:1080 (socks-lan)                         ↑
    ↓ Xray routing → to_beijing_direct                       │
    ↓ Reality(VLESS, SNI=www.bilibili.com)                     │
    ↓ 北京VPS:443 → Nginx分流                                │
    ↓ proxy_from_lan:9445 → direct(freedom) ─────────────────┘

                    入站（端口转发）
Peer → 北京VPS:51413 → external_qbit → portal
    → bridge隧道 → 旁路由 → to_qbit → 192.168.1.200:51413
```

---

## 设备清单

| 设备 | IP | 角色 |
|---|---|---|
| 北京VPS | `salmonstill.cn` / `49.232.242.90` | 公网出口 + 入站入口 |
| 旁路由 | `192.168.1.199` | Xray 桥接 + SOCKS5 代理 |
| NAS | `192.168.1.188` | Docker 宿主机 |
| qBittorrent 容器 | `192.168.1.200` | macvlan 独立 IP，PT 专用 |

---

## 第一部分：北京 VPS 配置

### 1.1 Nginx Stream SNI 分流 `beijing-vps-stream.conf`

新增 `www.bilibili.com` SNI 映射（用于旁路由 Mihomo 直连代理）：

```nginx
stream {
    map $ssl_preread_server_name $backend {
        www.apple.com xray;            # 旁路由反向代理隧道
        www.microsoft.com mihomo;      # 外部客户端代理 → 东京出口
        www.bilibili.com xray_lan;       # 旁路由 Mihomo 北京直连代理
        drive.salmonstill.cn nas;      # 绿联云服务
        default npm;                   # Nginx Proxy Manager
    }
    upstream xray      { server 127.0.0.1:9443; }
    upstream mihomo    { server 127.0.0.1:9444; }
    upstream xray_lan  { server 127.0.0.1:9445; }   # 新增
    upstream nas       { server 127.0.0.1:38653; }
    upstream npm       { server 127.0.0.1:8443; }

    server {
        listen 443 reuseport;
        listen [::]:443 reuseport;
        ssl_preread on;
        proxy_pass $backend;
    }
}
```

### 1.2 Xray 配置 `xray-北京vps-config.json`

#### 新增入站 `proxy_from_lan`（北京直连出口）

```json
{
  "tag": "proxy_from_lan",
  "listen": "127.0.0.1",
  "port": 9445,
  "protocol": "vless",
  "settings": {
    "clients": [
      {
        "id": "113e167a-a2be-4b46-9010-60020108626c",
        "flow": "xtls-rprx-vision"
      }
    ],
    "decryption": "none"
  },
  "streamSettings": {
    "network": "raw",
    "security": "reality",
    "realitySettings": {
      "show": false,
      "target": "www.apple.com:443",
      "serverNames": ["www.bilibili.com"],
      "privateKey": "GGT9LfN_2JdQG68cwrULgUK-adfT6wIokLzWjaB0fXs",
      "shortIds": ["7c947a71b94f369e"]
    }
  }
}
```

> Reality 公私钥复用已有的 `interconn` 入站 keypair，`serverNames` 用新的 `www.bilibili.com` 与 Nginx 对应。
> `target` 设为 `www.apple.com:443`，Reality 从此地址偷取真实 TLS 证书用于伪装。

#### 新增入站 `external_qbit`（BT 入站端口）

```json
{
  "tag": "external_qbit",
  "listen": "0.0.0.0",
  "port": 51413,
  "protocol": "dokodemo-door",
  "settings": {
    "address": "127.0.0.1",
    "port": 51413,
    "network": "tcp"
  }
}
```

> 仅 TCP——Xray portal 反向代理对 UDP 支持不完善，BT 的 μTP(UDP) 走不了，需要在 qBittorrent 里关闭。

#### 新增路由规则

```json
{ "type": "field", "inboundTag": ["proxy_from_lan"], "outboundTag": "direct" },
{ "type": "field", "inboundTag": ["external_qbit"],  "outboundTag": "portal" }
```

### 1.3 腾讯云防火墙

新开端口：

| 端口 | 协议 | 用途 |
|---|---|---|
| 51413 | TCP | BT 入站 |

---

## 第二部分：旁路由 Xray SOCKS5 出站代理

### 2.1 配置 `xray-旁路由-config.json`

qBittorrent 出站不走 Mihomo 透明代理，而是通过旁路由上 Xray 的 `socks-lan` 入站（`:1080`），直接转发到北京 VPS 直连出口。

#### SOCKS5 入站

```json
{
  "tag": "socks-lan",
  "port": 1080,
  "listen": "0.0.0.0",
  "protocol": "socks",
  "settings": {
    "auth": "noauth",
    "udp": true
  }
}
```

#### 出站 `to_beijing_direct`

```json
{
  "tag": "to_beijing_direct",
  "protocol": "vless",
  "settings": {
    "vnext": [
      {
        "address": "salmonstill.cn",
        "port": 443,
        "users": [
          {
            "id": "113e167a-a2be-4b46-9010-60020108626c",
            "flow": "xtls-rprx-vision",
            "encryption": "none"
          }
        ]
      }
    ]
  },
  "streamSettings": {
    "network": "raw",
    "security": "reality",
    "realitySettings": {
      "fingerprint": "chrome",
      "serverName": "www.bilibili.com",
      "publicKey": "62y5gDjPrdeuePGl-D2IW4Cw9Kb8_bSBBTmArvL7Nhs",
      "shortId": "7c947a71b94f369e"
    }
  }
}
```

#### 路由规则

```json
{ "type": "field", "inboundTag": ["socks-lan"], "outboundTag": "to_beijing_direct" }
```

> 路径：`qBittorrent → SOCKS5 旁路由:1080 → to_beijing_direct → 北京VPS:443(SNI=www.bilibili.com) → proxy_from_lan:9445 → direct → 互联网`

---

## 第三部分：旁路由 Xray 51413 转发

### 3.1 配置 `xray-旁路由-config.json`

#### 新增加出站 `to_qbit`

```json
{
  "tag": "to_qbit",
  "protocol": "freedom",
  "settings": {
    "redirect": "192.168.1.200:51413"
  }
}
```

#### 新增路由规则

```json
{
  "type": "field",
  "inboundTag": ["bridge"],
  "port": "51413",
  "outboundTag": "to_qbit"
}
```

> 放在 bridge 下——从北京 VPS 的 portal 通过反向隧道过来的 BT 入站流量，由 bridge 接收后按端口 51413 匹配到此规则，转发到 qBittorrent 容器。

---

## 第四部分：NAS qBittorrent Docker

### 4.1 创建 macvlan 网络

```bash
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.199 \
  --ip-range=192.168.1.200/32 \
  -o parent=eth0 \
  qbit_macvlan
```

> `--gateway=192.168.1.199`：qBittorrent 的默认网关设为旁路由，确保出站流量经过旁路由。
> `--ip-range=192.168.1.200/32`：固定 IP。

### 4.2 启动容器

```bash
docker run -d \
  --name qbittorrent \
  --network qbit_macvlan \
  --ip 192.168.1.200 \
  -e WEBUI_PORT=8090 \
  -p 8090:8090 \
  -v /path/to/downloads:/downloads \
  lscr.io/linuxserver/qbittorrent:latest
```

### 4.3 qBittorrent 设置

| 设置项 | 值 |
|---|---|
| 监听端口 | `51413` |
| UPnP/NAT-PMP | **禁用** |
| SOCKS5 代理 | `192.168.1.199` / 端口 `1080` |
| 连接协议 | **仅 TCP**（关闭 μTP） |
| DHT | 可选（建议开） |
| PEX | 可选（建议开） |

> 关闭 μTP(UDP)：Xray portal 反向代理不支持 UDP，BT 的 μTP 走 UDP 会导致入站失败。

### 4.4 定时做种调度（crontab）

让 qBittorrent 只在夜间（01:00-07:00）做种，白天暂停以节省带宽：

```bash
crontab -e
```

添加以下两行（在 NAS 或任意可访问 192.168.1.200 的设备上）：

```
0 1 * * * curl -s -X POST "http://192.168.1.200:8888/api/v2/torrents/start" --data "hashes=all"
0 7 * * * curl -s -X POST "http://192.168.1.200:8888/api/v2/torrents/stop"  --data "hashes=all"
```

| 时间 | 操作 | 含义 |
|---|---|---|
| 凌晨 01:00 | `/torrents/start` `hashes=all` | 启动全部种子开始做种 |
| 早上 07:00 | `/torrents/stop` `hashes=all` | 停止全部种子 |

---

## 第五部分：部署顺序

```
1. 腾讯云防火墙 → 开放 51413/tcp
2. scp beijing-vps-stream.conf     → 北京VPS /etc/nginx/stream.conf.d/
3. scp xray-北京vps-config.json     → 北京VPS /usr/local/etc/xray/config.json
4. 北京VPS: nginx -t && systemctl reload nginx
5. 北京VPS: systemctl restart xray
6. scp 旁路由的mihomo config.yaml   → 旁路由 /opt/mihomo/config.yaml
7. scp xray-旁路由-config.json      → 旁路由 /etc/xray/config.json
8. 旁路由: /etc/init.d/mihomo restart
9. 旁路由: /etc/init.d/xray restart
10. NAS: 创建 macvlan 网络 + 启动 qBittorrent 容器
11. NAS: 配置 qBittorrent 监听端口 51413，关闭 μTP
```

---

## 第六部分：验证

### 6.1 SOCKS5 代理出站验证

```bash
# 在 NAS 上执行，应返回北京 VPS 的公网 IP
docker exec qbittorrent curl --socks5 192.168.1.199:1080 https://ip.sb
```

### 6.2 Xray 日志确认

```bash
# 旁路由上查看 Xray 日志，确认 socks-lan 流量转发正常
tail -f /var/log/xray.log | grep socks-lan
```

### 6.3 BT 入站验证

```bash
# 北京 VPS 上确认端口监听
ss -tlnp | grep 51413

# 从外部测试端口可达
nc -zv salmonstill.cn 51413
```

### 6.4 端到端 BT 测试

下载一个热门 Ubuntu torrent 种子，观察：
- qBittorrent WebUI → 连接 → 应显示 DHT 节点数增长
- 跟踪器页面 → 应显示 "Working"
- 下载速度应有上传来确认入站工作

---

## 第七部分：故障排查

| 现象 | 排查 |
|---|---|
| qBittorrent curl ip.sb 返回真实 IP | SOCKS5 代理未生效，检查 qBittorrent 设置中代理配置 |
| 代理连不上 | 确认 旁路由 Xray 正在运行且 `socks-lan` 入站监听 :1080 |
| 入站无上传 | 检查北京 VPS ufw/腾讯云安全组已放行 51413/tcp |
| xray 报错 `reverse-proxy.xray.internal` | portal/bridge 域名不匹配，两边必须一致 |
| 下载有速度、无上传 | μTP 没关或 portal UDP 不支持，qBittorrent 设置仅 TCP |

---

## 第八部分：文件清单

| 文件 | 位置 | 作用 |
|---|---|---|
| `beijing-vps-stream.conf` | 北京VPS `/etc/nginx/stream.conf.d/` | Nginx SNI分流（含 www.bilibili.com → 9445） |
| `xray-北京vps-config.json` | 北京VPS `/usr/local/etc/xray/config.json` | Xray 入站+路由（含 proxy_from_lan + external_qbit） |
| `xray-旁路由-config.json` | 旁路由 `/etc/xray/config.json` | Xray bridge + to_qbit(51413) + socks-lan(1080) → to_beijing_direct |
