对话笔记直发: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 22PermitRootLogin yesPasswordAuthentication yesPubkeyAuthentication 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,再更新系统”的顺序,以尽量避免把自己锁在门外。
过程摘要
本次工作按以下阶段推进:
-
读取参考文章,提炼其核心加固项:
- 更新系统
- 创建普通管理员用户
- SSH 加固
- 防火墙
- Fail2ban
- 时区设置
- SSH 密钥登录
-
对目标服务器做只读基线核查。 重点看了:
- 系统版本
- 当前 SSH 配置
- 当前监听端口
- 用户与 sudo 组
- 防火墙状态
- fail2ban 状态
- 时区与待更新包
-
与用户确认最终加固策略。 曾讨论两种方案:
- 标准更安全方案:以后只用普通用户
feng通过密钥登录,禁用 root 远程登录 - 保守简化方案:保留
root公钥登录,只禁用密码登录
用户明确选择了第二种方案,因此执行目标定为:
- SSH 端口改为
2255 PermitRootLogin prohibit-passwordPasswordAuthentication no- 保留
PubkeyAuthentication yes
- 标准更安全方案:以后只用普通用户
-
修改并验证 SSH。 在远端备份
sshd_config后,使用最小化修改将 SSH 政策切换到:Port 2255PermitRootLogin prohibit-passwordPasswordAuthentication noPubkeyAuthentication yes
随后用新的会话验证:
ssh -p 2255 root@vps可以正常连接- 22 端口不再监听
-
安装并启用 UFW。 考虑到机器上已有
xray使用443,且此前没有成体系的 UFW 规则,因此采用最小放行策略:- 默认拒绝所有入站
- 默认允许所有出站
- 放行
2255/tcp - 放行
443/tcp
不放行
80/tcp,因为当前没有明确对外 HTTP 需求。 -
验证防火墙没有误伤现有服务。 通过本地
curl -k -I https://vps验证到443仍有响应,返回HTTP/1.0 400 Bad Request,说明入口仍通,虽然上层应用没有为该 Host 提供正常页面,但防火墙并未阻断它。 -
安装并配置 Fail2ban。 初次配置
jail.local时只写了最小sshd配置,但服务启动失败。排查日志后发现:
- 错误原因:
Have not found any log file for sshd jail - 当前 Debian 机器上的 SSH 日志主要通过
systemd journal提供,而不是传统/var/log/auth.log
因此调整
jail.local:backend = systemdjournalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshdport = 2255
调整后
fail2ban成功启动并能正常显示sshdjail 状态。 - 错误原因:
-
更新系统软件包。 执行了系统升级,升级了 80 多个包,包括:
openssh-serveropenssh-clientsudosystemd- 多个基础库和系统组件
升级完成后检查结果:
- 当前无
reboot-required - 仍有 1 个包保留升级:
linux-image-amd64
-
设置时区。 最终将系统时区从
Etc/UTC调整为Asia/Shanghai。 -
根据用户后续要求,为
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
- 创建
关键结论
- 用户最终选择的是“保留 root 公钥登录,仅禁用密码登录”的保守加固方案,而不是彻底禁 root 远程登录。
- SSH 已成功从
22切换到2255,并且密码登录已被禁用。 root当前只能使用公钥登录,对应PermitRootLogin prohibit-password。- 防火墙已启用,当前仅放行
2255/tcp与443/tcp。 fail2ban已启用,并针对sshd做了 journal 模式适配。- 系统软件包已大面积更新,当前无立即重启要求。
- 时区已切换为
Asia/Shanghai。 feng已配置公钥登录成功,可作为普通管理员账户使用。feng目前仍需要输入自己的密码才能执行sudo,这是默认且更安全的行为。
执行动作
- 读取本地参考文章并提炼加固思路
- 远程只读检查服务器系统、SSH、防火墙、fail2ban、时区、待更新包
- 结合用户偏好确定采用 root 公钥登录保留方案
- 备份并修改
/etc/ssh/sshd_config - 验证
2255端口 SSH 连通性并确认22不再监听 - 安装
ufw并启用最小入站放行规则 - 验证
443未被误封 - 安装
fail2ban - 发现默认日志路径不适用后,切换为
systemdbackend 并修复sshdjail - 执行系统升级
- 调整时区到
Asia/Shanghai - 为
feng安装公钥并验证登录与 sudo 状态
执行命令记录
- 基线检查服务器信息
ssh root@vps "hostnamectl; whoami; id; uptime"作用:确认系统版本、当前用户和基础运行状态。
结果:确认系统是 Debian 12,当前通过 root 登录。
- 检查 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。
- 修改 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。
- 验证新 SSH 端口
ssh -p 2255 root@vps "whoami; id; hostnamectl --static"作用:验证新端口可以正常登录。
结果:成功以 root 登录,说明切换成功。
- 安装并启用 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。
- 验证 443 入口仍可达
curl.exe -k -I --max-time 15 "https://vps"作用:确认防火墙没有误伤正在 443 上运行的服务。
结果:返回 HTTP/1.0 400 Bad Request,说明 TCP/HTTPS 入口可达。
- 安装并配置 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 加固]]