跳到主要内容

Debian 13 首次上线后:SSH 密钥、nftables、Fail2ban、BBR 一次配好

一台新的 Debian 13 小鸡开出来之后,第一件事最好不是装面板,而是先把最基础的安全项补齐。

这篇文章给你一套比较朴素、但足够实用的初始加固流程:

  • 只保留 SSH 密钥登录
  • 打开最基础的 nftables 规则
  • 启动 Fail2ban 阻挡暴力尝试
  • 顺手启用 BBR 改善 TCP 拥塞控制

适用场景 #

这套配置适合下面这些情况:

  • 新开一台 Debian 13 VPS
  • 你暂时只需要博客、站点或 API 的基础防护
  • 你不想引入太复杂的安全组件

第一步:新建普通用户并导入 SSH 密钥 #

如果你现在还是直接用 root 登录,建议先补一个普通用户,再把公钥导进去:

adduser deploy
usermod -aG sudo deploy
install -d -m 700 /home/deploy/.ssh
cp /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys

做完之后,先新开一个终端窗口,确认你能用这个普通用户正常登录,再继续下一步。不要在没验证成功前就关掉 root 会话。

SSH 用户、nftables 与基础规则设置示意

第二步:关闭 SSH 密码登录 #

编辑 /etc/ssh/sshd_config,至少确认下面几项:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

保存后重启 SSH:

systemctl restart ssh

如果你的云厂商默认端口不是 22,记得把实际端口一并同步到后面的 nftables 规则里。

第三步:启用 nftables #

Debian 13 上我更建议直接用 nftables,规则清楚,而且后面扩展端口和协议也更灵活。

先安装:

apt update
apt install -y nftables

然后写一个最小可用配置:

cat >/etc/nftables.conf <<'EOF'
#!/usr/sbin/nft -f
flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0;
    policy drop;

    iif "lo" accept
    ct state established,related accept
    tcp dport 22 accept
    tcp dport { 80, 443 } accept
    ip protocol icmp accept
    ip6 nexthdr ipv6-icmp accept
  }

  chain forward {
    type filter hook forward priority 0;
    policy drop;
  }

  chain output {
    type filter hook output priority 0;
    policy accept;
  }
}
EOF

nft -f /etc/nftables.conf
systemctl enable --now nftables
nft list ruleset

这份规则的思路比较朴素:

  • 回环放行
  • 已建立连接放行
  • 仅开放 22 / 80 / 443
  • 默认拒绝其他进入流量

如果你后面还会挂别的服务,比如面板、数据库、监控端口,就按实际需求补规则,不要一上来全开。

第四步:启用 Fail2ban #

安装并写一个最小可用配置:

apt install -y fail2ban
cat >/etc/fail2ban/jail.local <<'EOF'
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
EOF

systemctl enable --now fail2ban

然后检查状态:

fail2ban-client status
fail2ban-client status sshd

nftables、Fail2ban 与 BBR 状态示意

第五步:开启 BBR #

如果这台 Debian 13 主要拿来跑博客、站点或者代理服务,顺手把 BBR 开起来通常是值得的。

先写 sysctl 配置:

sudo nano /etc/sysctl.d/99-bbr.conf

内容如下:

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

保存后执行:

sudo sysctl --system

然后检查是否已经生效:

sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc

正常情况下,你应该能看到:

  • net.ipv4.tcp_congestion_control = bbr
  • net.core.default_qdisc = fq

第六步:做一次自检 #

配置完成后,建议顺手检查这几项:

  • ss -tulpn 看监听端口是否符合预期
  • nft list ruleset 看当前规则是否已经加载
  • journalctl -u ssh -b 看 SSH 重启有没有报错
  • fail2ban-client status sshd 看 jail 是否已加载
  • sysctl net.ipv4.tcp_congestion_control 看 BBR 是否已经生效

常见坑 #

先关了密码登录,结果自己进不去了 #

这是最常见的问题。正确顺序一定是:

  1. 新用户 + 公钥
  2. 新终端实测登录成功
  3. 再禁用密码和 root

开了 nftables 后网站打不开 #

一般就是漏开了:

  • 80/tcp
  • 443/tcp

如果你的 SSH 不在 22 端口,或者还有额外服务端口,也要记得同步补进规则。

Fail2ban 装了但没有效果 #

优先检查两件事:

  • backend = systemd 是否写了
  • sshd jail 是否真的 enabled

BBR 看起来没生效 #

优先检查:

  • sysctl --system 是否执行过
  • sysctl net.ipv4.tcp_congestion_control 输出是不是 bbr
  • 内核是不是已经加载了对应拥塞控制模块

小结 #

对个人博客或小型业务机来说,这一套已经足够挡住不少低级扫描和暴力尝试。它当然不是“完整安全方案”,但很适合作为 Debian 13 的第一层基础配置。

后面如果你还要继续往上加,可以再补:

  • 自动安全更新
  • sudo 审计
  • 更细的 nftables 规则
  • 登录日志告警