对话笔记直发:5.4 VPS 安全加固与 SSH-Fail2ban 配置。分类:网络基建。

VPS 安全加固与 SSH-Fail2ban 配置

时间

2026-05-04

用户目标

用户提供了一台 VPS 服务器 vps 的 SSH 入口 ssh root@vps,并给出一篇关于新 VPS 基础安全加固的参考文章,希望根据文章思路对服务器进行实际安全加固。

后续用户进一步明确了偏好与约束:

  • 已经在 root 用户目录下放入本地 Windows 电脑的 SSH 公钥
  • 手动创建了用户 feng 并加入管理员组
  • 目标 SSH 端口希望改为 2255
  • 最终选择的方案不是完全禁用 root 远程登录,而是:
    • 保留 root 的公钥登录
    • 禁止密码登录
    • 启用防火墙
    • 启用 fail2ban
    • 更新系统与调整时区

背景与上下文

对话一开始先读取了用户提供的参考文章: C:\Users\fengx\onedrive\Apps\remotely-save\feng\000_Raw\30_剪藏\2026-05-02\拿到新的小鸡(VPS)后,你应该先做什么?(入门安全篇).md

随后对服务器做了只读检查,确认系统并不是文章中的 Ubuntu,而是 Debian 12,但加固思路基本一致。

初始只读检查结论:

  • 系统:Debian GNU/Linux 12 (bookworm)
  • 当前登录方式:root 通过 SSH 登录
  • SSH 初始配置有效值:
    • Port 22
    • PermitRootLogin yes
    • PasswordAuthentication yes
    • PubkeyAuthentication yes
  • ufw 未安装
  • fail2ban 未启用
  • 时区初始为 Etc/UTC
  • 有大量待升级包,包含 openssh-server
  • 机器上 443/tcp 已被一个 xray 进程占用,说明后续加固不能误伤现有服务

用户后续说明:

  • root 已经可以通过公钥登录
  • 已手动建好用户 feng 并加入 sudo
  • 期望 SSH 改为 2255

进一步只读核查发现:

  • feng 的确存在并在 sudo 组中
  • 但当时 feng 还没有自己的 authorized_keys
  • sshd_config 实际仍是默认生效状态,2255 并没有真正监听
  • /etc/ssh/sshd_config.d/ 为空,没有 drop-in 配置覆盖

因此最终执行策略采用了“先改 SSH 并验证,再开防火墙,再装 fail2ban,再更新系统”的顺序,以尽量避免把自己锁在门外。

过程摘要

本次工作按以下阶段推进:

  1. 读取参考文章,提炼其核心加固项:

    • 更新系统
    • 创建普通管理员用户
    • SSH 加固
    • 防火墙
    • Fail2ban
    • 时区设置
    • SSH 密钥登录
  2. 对目标服务器做只读基线核查。 重点看了:

    • 系统版本
    • 当前 SSH 配置
    • 当前监听端口
    • 用户与 sudo 组
    • 防火墙状态
    • fail2ban 状态
    • 时区与待更新包
  3. 与用户确认最终加固策略。 曾讨论两种方案:

    • 标准更安全方案:以后只用普通用户 feng 通过密钥登录,禁用 root 远程登录
    • 保守简化方案:保留 root 公钥登录,只禁用密码登录

    用户明确选择了第二种方案,因此执行目标定为:

    • SSH 端口改为 2255
    • PermitRootLogin prohibit-password
    • PasswordAuthentication no
    • 保留 PubkeyAuthentication yes
  4. 修改并验证 SSH。 在远端备份 sshd_config 后,使用最小化修改将 SSH 政策切换到:

    • Port 2255
    • PermitRootLogin prohibit-password
    • PasswordAuthentication no
    • PubkeyAuthentication yes

    随后用新的会话验证:

    • ssh -p 2255 root@vps 可以正常连接
    • 22 端口不再监听
  5. 安装并启用 UFW。 考虑到机器上已有 xray 使用 443,且此前没有成体系的 UFW 规则,因此采用最小放行策略:

    • 默认拒绝所有入站
    • 默认允许所有出站
    • 放行 2255/tcp
    • 放行 443/tcp

    不放行 80/tcp,因为当前没有明确对外 HTTP 需求。

  6. 验证防火墙没有误伤现有服务。 通过本地 curl -k -I https://vps 验证到 443 仍有响应,返回 HTTP/1.0 400 Bad Request,说明入口仍通,虽然上层应用没有为该 Host 提供正常页面,但防火墙并未阻断它。

  7. 安装并配置 Fail2ban。 初次配置 jail.local 时只写了最小 sshd 配置,但服务启动失败。

    排查日志后发现:

    • 错误原因:Have not found any log file for sshd jail
    • 当前 Debian 机器上的 SSH 日志主要通过 systemd journal 提供,而不是传统 /var/log/auth.log

    因此调整 jail.local:

    • backend = systemd
    • journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd
    • port = 2255

    调整后 fail2ban 成功启动并能正常显示 sshd jail 状态。

  8. 更新系统软件包。 执行了系统升级,升级了 80 多个包,包括:

    • openssh-server
    • openssh-client
    • sudo
    • systemd
    • 多个基础库和系统组件

    升级完成后检查结果:

    • 当前无 reboot-required
    • 仍有 1 个包保留升级:linux-image-amd64
  9. 设置时区。 最终将系统时区从 Etc/UTC 调整为 Asia/Shanghai。

  10. 根据用户后续要求,为 feng 配置 SSH 公钥登录。 在服务器上:

    • 创建 /home/feng/.ssh
    • 将 /root/.ssh/authorized_keys 复制到 /home/feng/.ssh/authorized_keys
    • 修正属主与权限为 feng:feng、目录 700、文件 600

    验证结果:

    • ssh -p 2255 feng@你的服务器IP(已脱敏)“ 能成功登录
    • feng 在 sudo 组中,可使用 sudo
    • 但 sudo -n whoami 返回 sudo: a password is required,说明 feng 是标准 sudo 行为,不是免密 sudo

关键结论

  1. 用户最终选择的是“保留 root 公钥登录,仅禁用密码登录”的保守加固方案,而不是彻底禁 root 远程登录。
  2. SSH 已成功从 22 切换到 2255,并且密码登录已被禁用。
  3. root 当前只能使用公钥登录,对应 PermitRootLogin prohibit-password。
  4. 防火墙已启用,当前仅放行 2255/tcp 与 443/tcp。
  5. fail2ban 已启用,并针对 sshd 做了 journal 模式适配。
  6. 系统软件包已大面积更新,当前无立即重启要求。
  7. 时区已切换为 Asia/Shanghai。
  8. feng 已配置公钥登录成功,可作为普通管理员账户使用。
  9. feng 目前仍需要输入自己的密码才能执行 sudo,这是默认且更安全的行为。

执行动作

  1. 读取本地参考文章并提炼加固思路
  2. 远程只读检查服务器系统、SSH、防火墙、fail2ban、时区、待更新包
  3. 结合用户偏好确定采用 root 公钥登录保留方案
  4. 备份并修改 /etc/ssh/sshd_config
  5. 验证 2255 端口 SSH 连通性并确认 22 不再监听
  6. 安装 ufw 并启用最小入站放行规则
  7. 验证 443 未被误封
  8. 安装 fail2ban
  9. 发现默认日志路径不适用后,切换为 systemd backend 并修复 sshd jail
  10. 执行系统升级
  11. 调整时区到 Asia/Shanghai
  12. 为 feng 安装公钥并验证登录与 sudo 状态

执行命令记录

  1. 基线检查服务器信息
ssh root@vps "hostnamectl; whoami; id; uptime"

作用:确认系统版本、当前用户和基础运行状态。 结果:确认系统是 Debian 12,当前通过 root 登录。

  1. 检查 SSH 配置与监听端口
ssh root@vps "sshd -T | grep -E '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication) '; ss -tulpn | grep sshd || true"

作用:确认 SSH 的有效配置和监听端口。 结果:早期检查表明 SSH 仍生效为 port 22、permitrootlogin yes、passwordauthentication yes。

  1. 修改 SSH 配置
ssh root@vps "cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak-opencode && sed -i 's/^Port .*/Port 2255/; s/^PermitRootLogin .*/PermitRootLogin prohibit-password/; s/^#\?PasswordAuthentication .*/PasswordAuthentication no/; s/^#\?PubkeyAuthentication .*/PubkeyAuthentication yes/' /etc/ssh/sshd_config && sshd -t && systemctl restart ssh && sleep 2 && sshd -T | grep -E '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication) '"

作用:以最小改动方式切换 SSH 策略并做语法检查。 结果:SSH 最终生效为 port 2255、permitrootlogin without-password、passwordauthentication no、pubkeyauthentication yes。

  1. 验证新 SSH 端口
ssh -p 2255 root@vps "whoami; id; hostnamectl --static"

作用:验证新端口可以正常登录。 结果:成功以 root 登录,说明切换成功。

  1. 安装并启用 UFW
ssh -p 2255 root@vps "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y ufw && ufw default deny incoming && ufw default allow outgoing && ufw allow 2255/tcp && ufw allow 443/tcp && yes | ufw enable && ufw status verbose"

作用:安装防火墙并收紧入站规则。 结果:UFW 启用成功,仅放行 2255/tcp 和 443/tcp。

  1. 验证 443 入口仍可达
curl.exe -k -I --max-time 15 "https://vps"

作用:确认防火墙没有误伤正在 443 上运行的服务。 结果:返回 HTTP/1.0 400 Bad Request,说明 TCP/HTTPS 入口可达。

  1. 安装并配置 fail2ban
ssh -p 2255 root@vps "DEBIAN_FRONTEND=noninteractive apt-get install -y fail2ban && printf '[DEFAULT]\nbantime = 1h\nfindtime = 10m\nmaxretry = 5\n[sshd]\nenabled = true\nport = 2255\n' > /etc/fail2ban/jail.local && systemctl enable fail2ban && systemctl restart fail2ban && sleep 2 && f
 
---
 
> 注:本文涉及的服务器公网 IP / Tailnet / 局域网 IP 已脱敏,请替换为你自己的地址。
 
---
**相关**: [[00-索引-网络基建索引]] [[5.21 腾讯云服务器 Docker Nginx 部署与 SSH 加固]]