一台新的 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 密码登录 #
编辑 /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
第五步:开启 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 = bbrnet.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 是否已经生效
常见坑 #
先关了密码登录,结果自己进不去了 #
这是最常见的问题。正确顺序一定是:
- 新用户 + 公钥
- 新终端实测登录成功
- 再禁用密码和 root
开了 nftables 后网站打不开 #
一般就是漏开了:
80/tcp443/tcp
如果你的 SSH 不在 22 端口,或者还有额外服务端口,也要记得同步补进规则。
Fail2ban 装了但没有效果 #
优先检查两件事:
backend = systemd是否写了sshdjail 是否真的 enabled
BBR 看起来没生效 #
优先检查:
sysctl --system是否执行过sysctl net.ipv4.tcp_congestion_control输出是不是bbr- 内核是不是已经加载了对应拥塞控制模块
小结 #
对个人博客或小型业务机来说,这一套已经足够挡住不少低级扫描和暴力尝试。它当然不是“完整安全方案”,但很适合作为 Debian 13 的第一层基础配置。
后面如果你还要继续往上加,可以再补:
- 自动安全更新
sudo审计- 更细的 nftables 规则
- 登录日志告警