Docker 百度网盘 智能流量控制部署

2025-12-23T07:01:43.png

听说 Docker 版的百度网盘会偷跑上传流量,emm... 虽然我测试了没有发现异常,但是,但是,反正闲着也是闲着,搞个智能流量控制思路,希望是多此一举。

主要特性

  • ✅ 智能限速:根据时间段自动调整上传速度(128-512kbit/s)
  • ✅ VNC 检测:检测到远程连接时自动解除限速
  • ✅ 随机波动:每 10-30 分钟随机调整速度,模拟真实用户行为
  • ✅ 日志轮转:自动管理日志文件,防止磁盘占满
  • ✅ 开机自启:容器启动时自动运行,无需手动干预

限速策略

时间段速度范围说明
工作日 9:00-18:00128-256 kbit/s工作时间低速
凌晨 2:00-6:00256-512 kbit/s深夜高速
其他时间192-384 kbit/s常规速度
VNC 连接时不限速15秒内自动检测并解除

部署步骤

1. 按照官方docker镜像的映射目录,在config下创建控制脚本

在宿主机百度网盘配置目录(如 /mnt/user/appdata/baidudisk/config/)创建脚本:

cd /your/baidudisk/config/path
nano tc-smart-control.sh

粘贴以下内容:

#!/bin/bash

LOG_FILE="/config/tc-control.log"
MAX_LOG_SIZE=$((5 * 1024 * 1024))  # 5MB
VNC_PORT=5800
CHECK_INTERVAL=15

log_msg() {
    # 日志轮转
    if [ -f "$LOG_FILE" ]; then
        local size=$(stat -f%z "$LOG_FILE" 2>/dev/null || stat -c%s "$LOG_FILE" 2>/dev/null)
        if [ "$size" -gt "$MAX_LOG_SIZE" ]; then
            mv "$LOG_FILE" "${LOG_FILE}.old"
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] 日志已轮转(旧日志: ${LOG_FILE}.old)" > "$LOG_FILE"
        fi
    fi
  
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

check_vnc_active() {
    ss -tn 2>/dev/null | grep "ESTAB" | grep -q ":$VNC_PORT"
    return $?
}

remove_tc() {
    tc qdisc del dev eth0 root 2>/dev/null
    log_msg "✓✓✓ 限速已移除 - 检测到 VNC 连接 ✓✓✓"
}

apply_random_tc() {
    local hour=$(date +%H)
    local day=$(date +%u)
  
    # 时间段策略
    if [ $day -le 5 ] && [ $hour -ge 9 ] && [ $hour -lt 18 ]; then
        MIN=128; MAX=256  # 工作日白天
    elif [ $hour -ge 2 ] && [ $hour -lt 6 ]; then
        MIN=256; MAX=512  # 凌晨
    else
        MIN=192; MAX=384  # 其他时间
    fi
  
    RATE=$((MIN + RANDOM % (MAX - MIN + 1)))
    BURST=$((RATE / 8))
  
    tc qdisc del dev eth0 root 2>/dev/null
    tc qdisc add dev eth0 root tbf rate ${RATE}kbit burst ${BURST}kbit latency 400ms
  
    log_msg "✓ 应用限速: ${RATE}kbit/s (范围: ${MIN}-${MAX}kbit)"
}

log_msg "========== 智能流量控制启动 =========="
log_msg "监控端口: $VNC_PORT | 检查间隔: ${CHECK_INTERVAL}秒"

STATE=""
LAST_ADJUST=0

while true; do
    CURRENT_TIME=$(date +%s)
  
    if check_vnc_active; then
        if [ "$STATE" != "active" ]; then
            remove_tc
            STATE="active"
        fi
    else
        if [ "$STATE" != "limited" ]; then
            apply_random_tc
            STATE="limited"
            LAST_ADJUST=$CURRENT_TIME
        else
            TIME_DIFF=$((CURRENT_TIME - LAST_ADJUST))
            ADJUST_INTERVAL=$((600 + RANDOM % 1200))  # 10-30分钟
          
            if [ $TIME_DIFF -ge $ADJUST_INTERVAL ]; then
                apply_random_tc
                LAST_ADJUST=$CURRENT_TIME
            fi
        fi
    fi
  
    sleep $CHECK_INTERVAL
done

保存并设置权限:

chmod +x tc-smart-control.sh

2. 修改 Docker Compose 配置

编辑 docker-compose.yml(或 Unraid 的容器模板):

version: '3'
services:
  baidudisk:
    image: johngong/baidudisk:latest
    container_name: baidudisk
    volumes:
      - /your/config/path:/config
      - /your/downloads/path:/config/baidunetdiskdownload
    ports:
      - 5800:5800
      - 5900:5900
    environment:
      - VNC_PASSWORD=your_password
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    entrypoint: >
      sh -c "
        apt-get update -qq &&
        apt-get install -y --no-install-recommends iproute2 inetutils-tools procps &&
        apt-get clean &&
        rm -rf /var/lib/apt/lists/* &&
        chmod +x /config/tc-smart-control.sh &&
        nohup /config/tc-smart-control.sh > /config/tc-startup.log 2>&1 &
        exec /init
      "

关键配置说明:

  • cap_add: - NET_ADMIN - 授予网络管理权限(必需)
  • entrypoint - 自动安装依赖并启动控制脚本

3. 启动容器

docker-compose up -d
# 或者
docker restart baidudisk

验证运行状态

检查脚本是否运行

docker exec baidudisk ps aux | grep tc-smart-control

预期输出:

root   123  0.0  0.0  3928  3052 ?  S  14:22  0:00 /bin/bash /config/tc-smart-control.sh

检查限速是否生效

docker exec baidudisk tc qdisc show dev eth0

预期输出:

qdisc tbf 8001: root refcnt 2 rate 180Kbit burst 22Kb lat 400ms

查看实时日志

docker exec baidudisk tail -f /config/tc-control.log

正常输出示例:

[2025-12-23 14:22:59] ========== 智能流量控制启动 ==========
[2025-12-23 14:22:59] 监控端口: 5800 | 检查间隔: 15秒
[2025-12-23 14:22:59] ✓ 应用限速: 131kbit/s (范围: 128-256kbit)
[2025-12-23 14:23:29] ✓✓✓ 限速已移除 - 检测到 VNC 连接 ✓✓✓
[2025-12-23 14:24:44] ✓ 应用限速: 177kbit/s (范围: 128-256kbit)

测试 VNC 连接检测

保持 VNC 连接打开:

docker exec baidudisk bash -c 'ss -tn 2>/dev/null | grep "ESTAB" | grep -q ":5800" && echo "检测到连接" || echo "未检测到"'
# 输出:检测到连接

docker exec baidudisk tc qdisc show dev eth0
# 输出:qdisc noqueue ... (无限速)

关闭 VNC 连接后等待 15-30 秒:

docker exec baidudisk tc qdisc show dev eth0
# 输出:qdisc tbf ... (已恢复限速)

常见问题

1. 提示 RTNETLINK answers: Operation not permitted

原因:容器缺少网络管理权限

解决:确保 docker-compose.yml 中有:

cap_add:
  - NET_ADMIN

2. 脚本未运行

# 手动启动测试
docker exec baidudisk bash -c "nohup /config/tc-smart-control.sh > /config/tc-startup.log 2>&1 &"

# 查看启动日志
docker exec baidudisk cat /config/tc-startup.log

3. 修改限速范围

编辑 tc-smart-control.sh 中的策略部分:

if [ $day -le 5 ] && [ $hour -ge 9 ] && [ $hour -lt 18 ]; then
    MIN=128; MAX=256  # ← 修改这里
elif [ $hour -ge 2 ] && [ $hour -lt 6 ]; then
    MIN=256; MAX=512  # ← 或这里
else
    MIN=192; MAX=384  # ← 或这里
fi

重启容器生效:

docker restart baidudisk

4. 修改检测间隔

编辑脚本顶部:

CHECK_INTERVAL=15  # 检测 VNC 连接的间隔(秒)

修改随机调整间隔(脚本第 64 行):

ADJUST_INTERVAL=$((600 + RANDOM % 1200))  # 10-30分钟
# 改为 5-15 分钟:
ADJUST_INTERVAL=$((300 + RANDOM % 600))

卸载

移除限速功能

# 停止脚本
docker exec baidudisk pkill -f tc-smart-control

# 移除限速规则
docker exec baidudisk tc qdisc del dev eth0 root

# 删除脚本和日志
rm /your/config/path/tc-smart-control.sh
rm /your/config/path/tc-control.log*

恢复原始 Docker Compose 配置

移除 cap_add 和 entrypoint,然后:

docker-compose up -d --force-recreate

技术原理

  • 流量控制:使用 Linux tc (Traffic Control) 的 TBF (Token Bucket Filter) 算法
  • 连接检测:通过 ss 命令监测 TCP 连接状态(ESTABLISHED 状态的 5800 端口)
  • 随机化:使用 $RANDOM 生成伪随机数,避免固定速度特征
  • 日志管理:超过 5MB 自动轮转为 .old 文件
  • 原则上类似的控流思路适用于任何容器或主机,可以举一反三 。

免责声明

本教程仅供学习交流使用,请遵守相关服务条款和法律法规。作者不对使用本方案产生的任何后果负责。


本文链接:

https://blog.coffox.cc/archives/45/
1 + 7 =
快来做第一个评论的人吧~