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

听说 Docker 版的百度网盘会偷跑上传流量,emm... 虽然我测试了没有发现异常,但是,但是,反正闲着也是闲着,搞个智能流量控制思路,希望是多此一举。
主要特性
- ✅ 智能限速:根据时间段自动调整上传速度(128-512kbit/s)
- ✅ VNC 检测:检测到远程连接时自动解除限速
- ✅ 随机波动:每 10-30 分钟随机调整速度,模拟真实用户行为
- ✅ 日志轮转:自动管理日志文件,防止磁盘占满
- ✅ 开机自启:容器启动时自动运行,无需手动干预
限速策略
| 时间段 | 速度范围 | 说明 |
|---|---|---|
| 工作日 9:00-18:00 | 128-256 kbit/s | 工作时间低速 |
| 凌晨 2:00-6:00 | 256-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.sh2. 修改 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_ADMIN2. 脚本未运行
# 手动启动测试
docker exec baidudisk bash -c "nohup /config/tc-smart-control.sh > /config/tc-startup.log 2>&1 &"
# 查看启动日志
docker exec baidudisk cat /config/tc-startup.log3. 修改限速范围
编辑 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 baidudisk4. 修改检测间隔
编辑脚本顶部:
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文件 原则上类似的控流思路适用于任何容器或主机,可以举一反三 。
免责声明
本教程仅供学习交流使用,请遵守相关服务条款和法律法规。作者不对使用本方案产生的任何后果负责。