很多站长买完服务器第一件事就是装面板、传网站,却忽略了系统层的基础安全。结果服务器上线没几天,日志里全是 SSH 爆破记录、可疑进程、异常外连。服务器被入侵不只是数据丢失的问题,还可能被拿去挖矿、发垃圾邮件,甚至成为攻击别人的跳板。
站在攻击者的视角,一台裸奔的服务器几乎等于待宰的羔羊:先全端口扫描找开放服务,再对 SSH 做字典爆破,进不去就试面板、试数据库端口,一旦拿到权限就植入挖矿程序或勒索病毒。理解了这套攻击路径,加固的顺序就清晰了——先把最常被利用的入口封死,再逐步缩小暴露面。本文以 CentOS Stream / Rocky Linux 环境为例,从 SSH 加固、防火墙规则、Fail2ban 暴力破解防护三个层面,给出可直接落地的加固命令。
一、SSH 安全加固:密钥登录 + 禁用密码登录
SSH 是攻击者最先盯上的入口。默认的 22 端口加密码登录,等于把大门钥匙挂在门框上。加固第一步是启用密钥登录并关闭密码认证:
# 1. 在本地电脑生成密钥对(Windows 可用 Git Bash,macOS/Linux 直接执行)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 一路回车,默认保存到 ~/.ssh/id_ed25519
# 2. 将公钥上传到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@你的服务器IP
# 3. 修改 SSH 服务端配置 /etc/ssh/sshd_config
# 建议修改以下参数:
Port 22022 # 修改默认端口,降低被扫描概率
PermitRootLogin prohibit-password # 禁止 root 密码登录,仅允许密钥
PubkeyAuthentication yes
PasswordAuthentication no # 关闭密码登录(确认密钥可用后再执行)
MaxAuthTries 3 # 限制认证尝试次数
LoginGraceTime 30 # 30 秒内未完成认证则断开
AllowUsers youruser # 只允许指定用户登录,多个用户用空格分隔
# 4. 检查配置并重启服务
sshd -t
systemctl restart sshd
注意:务必先测试新端口和密钥登录可用,再关闭密码登录,否则可能把自己锁在门外。建议另开一个终端保持连接,确认无误后再执行最后一步。
二、防火墙规则优化:只放行必要端口
服务器默认开放所有端口是最大的风险点。使用 firewalld 或宝塔安全组,把入口收敛到业务必需的最小集合:
# 启用 firewalld
systemctl enable --now firewalld
# 只放行业务端口(示例:SSH 22022、Web 80/443、数据库仅内网)
firewall-cmd --permanent --remove-service=ssh # 移除默认 22
firewall-cmd --permanent --add-port=22022/tcp # 新 SSH 端口
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --remove-service=mysql # 数据库不对外
# 限制管理端口来源 IP(只允许公司/家里出口 IP 访问 SSH)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" port port="22022" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="22022" protocol="tcp" reject'
# 重新加载并查看生效规则
firewall-cmd --reload
firewall-cmd --list-all
如果用的是云服务器,还需要在云控制台的安全组里同步收紧:只放行 80、443 和必要的管理端口,并尽可能给管理端口加 IP 白名单。安全组 + 系统防火墙双层限制,即使某一层配置失误,另一层也能兜底。
三、Fail2ban 防护:自动封禁暴力破解 IP
即使关闭了密码登录,日志里仍然会有大量扫描尝试。Fail2ban 的作用是监控日志,发现异常尝试后自动调用防火墙封禁来源 IP:
# 1. 安装 Fail2ban
dnf install -y fail2ban
# 2. 编写本地配置 /etc/fail2ban/jail.local
# 以下配置对 SSH 服务开启防护
[sshd]
enabled = true
port = 22022 # 与 sshd_config 的端口保持一致
filter = sshd
logpath = /var/log/secure
maxretry = 5 # 5 次失败即触发
bantime = 3600 # 封禁 1 小时
findtime = 600 # 10 分钟内累计
# 3. 启动并查看封禁状态
systemctl enable --now fail2ban
fail2ban-client status sshd
# 4. 手动解封误封 IP
fail2ban-client set sshd unbanip 1.2.3.4
如果 Web 站点被高频请求骚扰,也可以给 Nginx 访问日志单独建一个 jail:把 maxretry 调大(如 60 次)、findtime 缩短(60 秒),重点打击突发性高频请求,同时避免误伤正常用户。
四、系统层面的补充加固
前三步做完,基础防线已经建立。再补几个低成本高收益的动作:
# 1. 保持系统更新(每月至少一次)
dnf update -y
# 2. 创建普通用户并加入 wheel 组,日常用普通用户操作
useradd deploy
usermod -aG wheel deploy
# 3. 关键目录权限收紧
chmod 700 /root
chmod 600 /etc/ssh/sshd_config
# 4. 关闭不常用的系统服务(按需执行,先确认业务依赖)
systemctl disable --now rpcbind
systemctl disable --now avahi-daemon
# 5. 查看当前监听端口,确认没有多余对外服务
ss -tlnp
另外,把服务器的登录告警配起来:在 /etc/ssh/sshrc 或借助监控工具,在 root 登录时推送通知,入侵者刚进门你就能收到消息,处理时间差就是安全差距。
五、日志审计与日常巡检
加固做完不等于一劳永逸,安全是持续的过程。养成定期看日志的习惯,很多入侵在早期都有迹可循。重点关注三个文件:登录日志 /var/log/secure、系统消息 /var/log/messages、Web 访问日志(Nginx 的 access.log)。出现以下信号需要警惕:凌晨时段的异常登录成功记录、短期内大量 404 请求、可疑进程长期占用高 CPU、服务器主动外连陌生 IP。
# 查看最近登录成功的记录
last -20
# 统计登录失败次数最多的来源 IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
# 检查对外监听的端口是否有异常新增
ss -tlnp
# 检查计划任务里是否有可疑项(入侵者常在这里留后门)
crontab -l
ls -la /etc/cron.d/ /var/spool/cron/
建议把巡检脚本化,每天自动执行并把结果推送到邮箱或企业微信;也可以借助云厂商的告警服务,对登录成功、异常外连、端口变化实时提醒。发现问题时先断开外网、保留现场日志,再逐项排查,切忌在没保留证据的情况下直接重装系统,否则攻击入口和损失范围都无从追溯。
总结
服务器加固没有一劳永逸,核心思路是”收敛暴露面 + 增加攻击成本”:SSH 用密钥、端口收敛、防火墙白名单、Fail2ban 自动封禁,四件事做完,绝大多数自动化攻击就会被挡在门外。需要提醒的是,系统层加固解决的是”主机被入侵”的问题,网站应用层的 SQL 注入、CC 攻击还需要 WAF 和流量清洗来兜底。速度网络提供高防服务器与 DDoS/CC 攻击防护服务,源站防护、流量清洗、攻击溯源一体化,新购高防服务器还支持免费安全加固代配,需要的话可以联系了解。
