Debian 12+ 深度安全加固与系统优化

本卡片记录适用于 Debian 12+ 系统的深度安全防护、网络 BBR 优化、静态 DNS 防劫持锁及 Chrony 高精度时间同步一键部署规程。


一、 一键加固脚本 (secure.sh)

cat << 'EOF' > secure.sh
#!/bin/bash
 
# ==========================================
# Debian 12+ 深度安全加固、网络优化与 Chrony 时间同步脚本
# 核心逻辑:改端口 + 强制密钥 + Fail2Ban + UFW + BBR + 静态DNS + 强制UTC与Chrony
# ==========================================
 
# 1. 权限校验
if [ "$EUID" -ne 0 ]; then
  echo "❌ 错误: 请使用 root 权限运行此脚本。"
  exit 1
fi
 
echo "=========================================="
echo "开始执行 Debian 系统深度加固与底层优化..."
echo "=========================================="
 
# 2. 公钥状态检测与交互式导入
if [ ! -f ~/.ssh/authorized_keys ] || [ ! -s ~/.ssh/authorized_keys ]; then
    echo "⚠️ 警告: 未检测到 SSH 公钥 (~/.ssh/authorized_keys)。"
    echo "关闭密码登录前必须配置公钥,否则将导致服务器永久失联。"
    
    read -p "请在此处粘贴您的 SSH 公钥并按回车: " USER_PUBKEY
    
    if [[ -z "$USER_PUBKEY" ]] || ! [[ "$USER_PUBKEY" =~ ^(ssh-rsa|ssh-ed25519|ecdsa-sha2-nistp256|sk-ssh-ed25519@openssh.com) ]]; then
        echo "❌ 致命错误: 公钥格式无效或为空,加固已终止以防止失联。"
        exit 1
    fi
    
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    echo "$USER_PUBKEY" > ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    echo "✅ 公钥导入成功!"
else
    echo "✅ 检测到已存在 SSH 公钥,跳过导入步骤。"
fi
 
# 3. 交互式获取 SSH 端口与额外业务端口
read -p "请输入新的 SSH 端口号 (10000-65535): " NEW_PORT
if ! [[ "$NEW_PORT" =~ ^[0-9]+$ ]] || [ "$NEW_PORT" -lt 10000 ] || [ "$NEW_PORT" -gt 65535 ]; then
    echo "❌ 错误: 端口号无效,建议使用 10000-65535 之间的高端口。"
    exit 1
fi
 
echo "💡 提示: UFW 防火墙将默认放行新 SSH 端口、$NEW_PORT、80 和 443 端口。"
read -p "请输入需要额外放行的 TCP 端口(如 3306,8888,多个用逗号分隔,无则直接回车): " EXTRA_PORTS
 
# 4. 强制 UTC 时区与旧时间组件清理
echo "[1/7] 正在将时区锁定为 UTC 并清理冲突时间组件..."
timedatectl set-timezone UTC
systemctl disable --now systemd-timesyncd 2>/dev/null || true
apt-get purge -y systemd-timesyncd ntp 2>/dev/null || true
echo "   -> 时区已成功锁定为: $(cat /etc/timezone)"
 
# 5. 静态 DNS 安全锁定
echo "[2/7] 正在配置并锁定静态 DNS 解析..."
chattr -i /etc/resolv.conf 2>/dev/null || true
cat > /etc/resolv.conf <<EOF_DNS
# Generated by Security Script
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver 2606:4700:4700::1111
EOF_DNS
chattr +i /etc/resolv.conf
echo "   -> DNS 已切换至 1.1.1.1 / 8.8.8.8 并锁定防篡改。"
 
# 6. 安装现代防护组件与 Chrony
echo "[3/7] 正在安装防护组件 (ufw, fail2ban) 与 Chrony..."
apt update -q
apt install -y fail2ban ufw sudo curl chrony -q
 
# 7. 配置 Chrony 高精度时间同步
echo "[4/7] 正在配置 Chrony 时间同步策略..."
cp /etc/chrony/chrony.conf /etc/chrony/chrony.conf.bak_$(date +%F) 2>/dev/null || true
cat > /etc/chrony/chrony.conf <<EOF_INNER
server time.google.com iburst minpoll 4 maxpoll 8
server time.cloudflare.com iburst minpoll 4 maxpoll 8
pool 2.debian.pool.ntp.org iburst maxsources 2
pool ntp.ubuntu.com iburst maxsources 2
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
logdir /var/log/chrony
makestep 1 3
rtcsync
EOF_INNER
 
# 8. SSHD 深度加固 (使用 .d 目录隔离配置)
echo "[5/7] 正在配置 SSH 强制密钥鉴权并修改端口..."
mkdir -p /etc/ssh/sshd_config.d/
cat > /etc/ssh/sshd_config.d/99-custom-security.conf <<EOF_INNER
Port $NEW_PORT
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
GSSAPIAuthentication no
EOF_INNER
 
# 9. 配置 Fail2Ban 与 BBR 拥塞控制
echo "[6/7] 正在部署 Fail2Ban 规则与 BBR 网络优化..."
cat > /etc/fail2ban/jail.local <<EOF_INNER
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
banaction = ufw
backend = systemd
 
[sshd]
enabled = true
port    = $NEW_PORT
bantime  = 86400
findtime = 600
maxretry = 3
EOF_INNER
 
cat > /etc/sysctl.d/99-bbr-tcp.conf <<EOF_INNER
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_window_scaling = 1
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
EOF_INNER
sysctl --system >/dev/null 2>&1
 
# 10. UFW 防火墙智能配置
echo "[7/7] 正在配置 UFW 防火墙策略..."
ufw --force reset >/dev/null 2>&1
ufw default deny incoming
ufw default allow outgoing
 
ufw allow $NEW_PORT/tcp
ufw allow 80/tcp
ufw allow 443/tcp
 
if [ -n "$EXTRA_PORTS" ]; then
    IFS=',' read -ra PORT_ARRAY <<< "$EXTRA_PORTS"
    for port in "${PORT_ARRAY[@]}"; do
        port=$(echo "$port" | tr -d ' ')
        if [[ "$port" =~ ^[0-9]+$ ]]; then
            ufw allow "$port"/tcp >/dev/null 2>&1
            echo "   -> 已放行额外端口: $port/tcp"
        fi
    done
fi
echo "y" | ufw enable >/dev/null 2>&1
 
# 11. 应用与重启
echo "正在重启所有安全与网络服务..."
systemctl restart ssh
systemctl restart fail2ban
systemctl restart chrony
systemctl enable fail2ban >/dev/null 2>&1
systemctl enable ufw >/dev/null 2>&1
systemctl enable chrony >/dev/null 2>&1
 
# 强制 Chrony 步进同步
chronyc makestep >/dev/null 2>&1
 
echo "=========================================="
echo "✅ 综合加固与优化完成!"
echo "✅ TCP BBR 状态: $(sysctl net.ipv4.tcp_congestion_control | awk '{print $3}')"
echo "✅ 当前系统时间 (UTC): $(date)"
echo ""
echo "🚨 【生死校验】请勿立即关闭当前终端窗口!"
echo "请打开一个新的终端测试登录:"
echo "ssh -i /你的私钥路径/id_rsa root@你的IP -p $NEW_PORT"
echo "确认新窗口能通过【密钥】成功登录后,方可关闭当前窗口。"
echo "=========================================="
EOF
 
chmod +x secure.sh

二、 核心加固与优化原理解析

1. 时间子系统重构 (Chrony)

  • 原理:弃用老旧、不精确的 ntp 以及易受网络阻断影响的 systemd-timesyncd,替换为高精度且支持快速平滑补偿(makestep)的 Chrony 服务,并选用 Google 和 Cloudflare 优质授时服务器作为源。
  • UTC 强制:系统时区强制锁定为 UTC 标准,保证日志及多系统微服务之间的时间戳完全一致。

2. 网络底层穿透与拥塞控制 (TCP BBR)

  • 开启 Linux 内核原生的 BBR 算法 并配置 fq(公平队列)排队规则,在网络丢包率较高或海外 VPS 直连场景下,实现吞吐量的大幅提升及网络连接抖动的降低。

3. SSH 强制密钥与端口掩蔽

  • SSHD 目录隔离:通过在新版 SSH 推荐的 /etc/ssh/sshd_config.d/ 隔离配置目录写入加固项,避免后续 Debian 升级时因覆盖主 sshd_config 而导致配置失效。
  • 强制关闭密码鉴权 PasswordAuthentication no
  • 将端口更改为 10000 后的高位匿名端口,过滤 99% 针对 22 默认端口的黑客扫描机器人。

4. 静态 DNS 安全锁定

  • 使用 chattr +i/etc/resolv.conf 静态锁定为 Cloudflare 与 Google 官方 DNS。防范了因系统重启(DHCP 覆盖)或网络劫持导致的 DNS 解析篡改。

相关链接