#!/usr/bin/env bash # ============================================================================ # MAX BBR — BBR 拥塞控制启用 + 网络参数优化 # 原创脚本,自动检测内核支持、启用 BBR、优化 TCP/IP 参数 # # 风险等级: 🟡 修改系统配置 — 修改 sysctl 参数 # 用法: bash <(curl -fsSL https://dl.unvmax.com/linux/scripts/max-tools/max-bbr.sh) # ============================================================================ set -e R='\033[1;31m' G='\033[1;32m' Y='\033[1;33m' B='\033[1;34m' C='\033[1;36m' M='\033[1;35m' W='\033[1;37m' N='\033[0m' GR='\033[90m' echo -e "${B}┌─────────────────────────────────────────────┐${N}" echo -e "${B}│${N} ${G}MAX BBR 启用 + 网络参数优化${N} ${GR}(修改配置)${N}" echo -e "${B}└─────────────────────────────────────────────┘${N}" echo # ── 检测内核版本 ── kernel=$(uname -r) echo -e " ${C}内核版本:${N} ${W}$kernel${N}" # 检查 BBR 模块是否可用 if modprobe tcp_bbr 2>/dev/null; then echo -e " ${G}✔ tcp_bbr 内核模块可用${N}" elif lsmod | grep -q tcp_bbr; then echo -e " ${G}✔ tcp_bbr 模块已加载${N}" else echo -e " ${R}✘ tcp_bbr 模块不可用${N}" echo -e " ${Y} 当前内核可能不支持 BBR,建议升级内核至 4.9+${N}" echo -e " ${Y} 尝试: apt install linux-image-$(uname -r | cut -d. -f1-2)-amd64${N}" exit 1 fi # 检查当前拥塞控制算法 current_cc=$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null || echo "unknown") current_qdisc=$(sysctl -n net.core.default_qdisc 2>/dev/null || echo "unknown") echo -e " ${C}当前拥塞控制:${N} ${Y}$current_cc${N}" echo -e " ${C}当前队列算法:${N} ${Y}$current_qdisc${N}" echo # ── 功能菜单 ── echo -e " ${M}请选择操作:${N}" echo -e " ${C}1${N}) ${G}启用 BBR + 全面网络优化${N} ${GR}(推荐)${N}" echo -e " ${C}2${N}) ${G}仅启用 BBR${N} ${GR}(不修改其他网络参数)${N}" echo -e " ${C}3${N}) ${Y}查看当前 BBR 状态${N} ${GR}(只读)${N}" echo -e " ${C}4${N}) ${R}关闭 BBR,恢复默认${N} ${GR}(cubic + pfifo_fast)${N}" echo -e " ${C}q${N}) 退出" echo read -r -p "$(echo -e " ${C}选择 (1-4/q): ${N}")" choice apply_sysctl() { local key="$1" val="$2" # 写入 /etc/sysctl.d/ 避免直接改 /etc/sysctl.conf local confd="/etc/sysctl.d" if [ ! -d "$confd" ]; then confd="/etc/sysctl.d"; mkdir -p "$confd" 2>/dev/null || true; fi local file="$confd/90-max-bbr.conf" # 如果文件已存在且有该 key,用 sed 替换;否则追加 if grep -q "^$key" "$file" 2>/dev/null; then sed -i "s|^$key.*|$key = $val|" "$file" else echo "$key = $val" >> "$file" fi sysctl -w "$key=$val" >/dev/null 2>&1 || true } case "$choice" in 1) echo -e "\n ${Y}应用 BBR + 全面网络参数优化...${N}\n" # 确保 sysctl.d 目录存在 mkdir -p /etc/sysctl.d 2>/dev/null || true # BBR 核心设置 apply_sysctl "net.core.default_qdisc" "fq" apply_sysctl "net.ipv4.tcp_congestion_control" "bbr" # TCP 缓冲区优化 (单位: bytes) apply_sysctl "net.core.rmem_default" "262144" # 默认读缓冲 256KB apply_sysctl "net.core.wmem_default" "262144" # 默认写缓冲 256KB apply_sysctl "net.core.rmem_max" "16777216" # 最大读缓冲 16MB apply_sysctl "net.core.wmem_max" "16777216" # 最大写缓冲 16MB apply_sysctl "net.ipv4.tcp_rmem" "4096 131072 16777216" # TCP 读缓冲: min default max apply_sysctl "net.ipv4.tcp_wmem" "4096 65536 16777216" # TCP 写缓冲: min default max # TCP 连接优化 apply_sysctl "net.ipv4.tcp_fastopen" "3" # 启用 TFO (client+server) apply_sysctl "net.ipv4.tcp_slow_start_after_idle" "0" # 空闲后不重置 cwnd apply_sysctl "net.ipv4.tcp_mtu_probing" "1" # 启用 MTU 探测 apply_sysctl "net.ipv4.tcp_sack" "1" # 选择性确认 apply_sysctl "net.ipv4.tcp_window_scaling" "1" # 窗口缩放 # 连接 backlog 优化 apply_sysctl "net.core.somaxconn" "65535" # 最大连接队列 apply_sysctl "net.ipv4.tcp_max_syn_backlog" "65535" # SYN 队列 apply_sysctl "net.core.netdev_max_backlog" "65535" # 网卡队列 # 保活与超时 (适合服务器) apply_sysctl "net.ipv4.tcp_keepalive_time" "600" # 保活间隔 10min apply_sysctl "net.ipv4.tcp_keepalive_intvl" "30" # 保活重试间隔 apply_sysctl "net.ipv4.tcp_keepalive_probes" "3" # 保活探测次数 apply_sysctl "net.ipv4.tcp_fin_timeout" "15" # FIN 超时 apply_sysctl "net.ipv4.tcp_tw_reuse" "1" # 复用 TIME_WAIT echo -e "\n ${G}✔ 配置已写入 /etc/sysctl.d/90-max-bbr.conf${N}" echo -e " ${G}✔ BBR + 网络优化已生效${N}" ;; 2) echo -e "\n ${Y}仅启用 BBR...${N}\n" mkdir -p /etc/sysctl.d 2>/dev/null || true apply_sysctl "net.core.default_qdisc" "fq" apply_sysctl "net.ipv4.tcp_congestion_control" "bbr" echo -e "\n ${G}✔ BBR 已启用${N}" ;; 3) echo -e "\n ${M}BBR 状态检查${N}" echo -e " ${GR}───${N}" echo -e " ${C}当前拥塞控制:${N} ${W}$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null)${N}" echo -e " ${C}当前队列算法:${N} ${W}$(sysctl -n net.core.default_qdisc 2>/dev/null)${N}" # 验证 BBR 是否加载 if lsmod | grep -q tcp_bbr; then echo -e " ${C}BBR 模块:${N} ${G}已加载${N}" else echo -e " ${C}BBR 模块:${N} ${Y}未加载${N}" fi # 显示可用拥塞控制算法 available=$(sysctl -n net.ipv4.tcp_available_congestion_control 2>/dev/null) echo -e " ${C}可用算法:${N} ${GR}$available${N}" # 检查 sysctl.d 配置 for f in /etc/sysctl.d/*.conf /etc/sysctl.conf; do [ -f "$f" ] && grep -q "tcp_congestion_control\|default_qdisc" "$f" 2>/dev/null && \ echo -e " ${C}配置来源:${N} ${GR}$f${N}" done ;; 4) echo -e "\n ${Y}恢复默认拥塞控制 (cubic + pfifo_fast)...${N}\n" apply_sysctl "net.core.default_qdisc" "pfifo_fast" apply_sysctl "net.ipv4.tcp_congestion_control" "cubic" # 移除其他 BBR 相关优化(恢复默认缓冲区) local confd="/etc/sysctl.d" [ ! -d "$confd" ] && confd="/etc/sysctl.d" local file="$confd/90-max-bbr.conf" if [ -f "$file" ]; then # 备份原配置 cp "$file" "${file}.bak.$(date +%Y%m%d%H%M%S)" 2>/dev/null || true rm -f "$file" echo -e " ${G}✔ 已移除 $file${N}" fi echo -e "\n ${G}✔ 已恢复默认拥塞控制算法${N}" echo -e " ${Y}⚠ 建议重启或手动检查 sysctl 配置${N}" ;; q|Q) echo -e " ${GR}退出${N}" exit 0 ;; *) echo -e " ${R}无效选择${N}" exit 1 ;; esac # 验证最终状态 echo echo -e " ${M}验证结果:${N}" sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc 2>/dev/null | while read -r line; do echo -e " ${G}✔${N} ${GR}$line${N}" done echo echo -e "${GR}👉 网络诊断: max-netstat.sh | HTTP 测试: max-httpdiag.sh | 实时 Ping: max-pingmon.sh${N}" echo -e "${GR}👉 一键执行: bash <(curl -fsSL https://dl.unvmax.com/linux/scripts/max-tools/max-bbr.sh)${N}"