← 返回脚本列表

开启BBR

参数优化
bbr

开启BBR

curl -sSL bash.ss-wiki.com/raw/bbr | bash
脚本
#!/bin/bash
# 只处理 BBR 开/关 + 检测
# 支持大多数现代 Linux (内核 ≥4.9)

set -e

# ======================
# 颜色
# ======================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

info()  { echo -e "${GREEN}[INFO]${NC} $1"; }
warn()  { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1" >&2; exit 1; }

# ======================
# 检查内核是否支持 tcp_bbr
# ======================
check_bbr_support() {
    if ! modinfo tcp_bbr >/dev/null 2>&1; then
        error "当前内核没有 tcp_bbr 模块(需要 Linux 内核 ≥ 4.9)"
    fi
}

# ======================
# 获取当前拥塞控制算法
# ======================
get_current_cc() {
    sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null || echo "unknown"
}

# ======================
# 判断 BBR 是否已启用
# ======================
is_bbr_enabled() {
    local cc
    cc=$(get_current_cc)
    [ "$cc" = "bbr" ]
}

# ======================
# 显示当前状态
# ======================
show_status() {
    local cc=$(get_current_cc)
    local avail=$(sysctl -n net.ipv4.tcp_available_congestion_control 2>/dev/null)

    echo
    if [[ "$cc" = "bbr" ]]; then
        echo -e "${GREEN}当前已使用 BBR${NC}"
    elif [[ "$avail" =~ "bbr" ]]; then
        echo -e "${YELLOW}BBR 模块可用,但当前未启用(当前: $cc)${NC}"
    else
        echo -e "${RED}BBR 不可用(模块缺失或内核太旧)${NC}"
    fi
    echo "当前拥塞控制 : $cc"
    echo "可用算法       : $avail"
    echo
}

# ======================
# 临时启用 BBR(本次开机有效)
# ======================
enable_bbr_temp() {
    info "临时启用 BBR(本次重启后失效)..."
    modprobe tcp_bbr 2>/dev/null || true
    sysctl -w net.ipv4.tcp_congestion_control=bbr
    if is_bbr_enabled; then
        info "临时启用成功"
    else
        warn "临时启用失败,请检查内核模块"
    fi
}

# ======================
# 永久启用 BBR(推荐)
# ======================
enable_bbr_permanent() {
    info "设置永久启用 BBR..."

    # 加载模块(开机自动加载)
    if [[ -d /etc/modules-load.d ]]; then
        echo "tcp_bbr" | tee /etc/modules-load.d/tcp_bbr.conf >/dev/null
    elif [[ -f /etc/modules ]]; then
        grep -q "^tcp_bbr$" /etc/modules || echo "tcp_bbr" >> /etc/modules
    fi

    # sysctl 配置
    local conf="/etc/sysctl.d/98-tcp-bbr.conf"
    cat > "$conf" << 'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF

    sysctl -p "$conf" 2>/dev/null || true
    info "已写入配置:$conf"
    info "重启后完全生效(或手动执行:sysctl -p $conf)"
}

# ======================
# 主逻辑
# ======================
main() {
    check_bbr_support
    show_status

    if is_bbr_enabled; then
        warn "BBR 已经启用,无需操作。"
        exit 0
    fi

    echo -n "是否现在启用 BBR?[y/N] "
    read -r answer
    if [[ ! "$answer" =~ ^[Yy]$ ]]; then
        info "已取消"
        exit 0
    fi

    enable_bbr_temp
    show_status

    echo -n "是否设置为永久启用(推荐)?[y/N] "
    read -r answer
    if [[ "$answer" =~ ^[Yy]$ ]]; then
        enable_bbr_permanent
    fi

    info "操作完成"
    echo "验证命令:"
    echo "  sysctl net.ipv4.tcp_congestion_control"
    echo "  lsmod | grep bbr"
}

main "$@"
# 查看当前是否在使用 bbr
sysctl net.ipv4.tcp_congestion_control

# 查看可用拥塞控制算法列表
sysctl net.ipv4.tcp_available_congestion_control

# 查看是否加载了 bbr 模块
lsmod | grep -i bbr

# 临时切换成 bbr(测试用)
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr