Linux服务器安全加固实战:从SSH到Fail2ban的完整防护体系
前言
作为一个草根站长,服务器安全是不可忽视的生命线。我在过去十年里管理过几十台服务器,踩过无数安全方面的坑:被暴力破解SSH、网站被挂马、数据库被勒索……每次都是血泪教训。今天这篇文章,我将系统性地梳理一套经过生产环境验证的Linux服务器安全加固方案。
无论你用的是阿里云、腾讯云还是Hetzner的VPS,这套方案都适用。全程只需要命令行,不需要安装任何商业软件。

一、SSH加固:第一道防线
SSH是服务器的大门,也是最常被攻击的目标。默认的22端口每天都会收到成百上千次暴力破解尝试。
1.1 修改默认端口
# 编辑SSH配置
sudo vim /etc/ssh/sshd_config
# 修改 Port 22 为其他端口,比如 2222
Port 2222改完端口后不要急着重启SSH,先确保防火墙规则已经更新,否则你会被锁在外面。
1.2 禁用密码登录,只用密钥
这是我能给出的最重要建议:
# 在本地生成密钥对
ssh-keygen -t ed25519 -C "your_server_name"
# 将公钥复制到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your_server
# 在服务器上禁用密码登录
sudo vim /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication noEd25519密钥比RSA更快更安全,是现代服务器的首选。禁用密码登录后,暴力破解就彻底失效了——没有密码可猜。
1.3 限制登录用户
不是每个系统用户都需要SSH登录权限:
# 只允许特定用户SSH登录
AllowUsers deploy www-admin
# 或只允许特定组
AllowGroups sshusers1.4 配置空闲超时
# 5分钟无操作自动断开
ClientAliveInterval 300
ClientAliveCountMax 0二、防火墙配置:UFW与iptables

2.1 使用UFW快速配置
Ubuntu/Debian系统推荐UFW,简单直观:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp # SSH新端口
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
sudo ufw status verbose2.2 iptables进阶规则
对于需要精细控制的场景,直接用iptables:
# 限制SSH连接速率,防止暴力破解
iptables -A INPUT -p tcp --dport 2222 -m state --state NEW \
-m recent --set --name SSH
iptables -A INPUT -p tcp --dport 2222 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP这条规则的含义是:同一个IP在60秒内最多发起4次新的SSH连接,超过就丢弃。
三、Fail2ban:自动封禁恶意IP

Fail2ban是每个服务器都该安装的工具。它会监控日志文件,发现异常行为(如多次登录失败)后自动在防火墙层面封禁该IP。
3.1 安装与基础配置
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local编辑/etc/fail2ban/jail.local:
[DEFAULT]
bantime = 3600 # 封禁1小时
findtime = 600 # 10分钟窗口
maxretry = 3 # 最多3次失败
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log3.2 为Nginx添加防护
[nginx-botsearch]
enabled = true
port = 80,443
logpath = /var/log/nginx/access.log
maxretry = 2这会自动封禁那些扫描WordPress登录页、phpMyAdmin等常见漏洞的IP。
四、系统加固
4.1 保持系统更新
# 配置自动安全更新(仅安全补丁)
sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades4.2 禁用不必要的服务
# 查看所有监听端口
ss -tlnp
# 关闭不需要的服务
sudo systemctl disable --now avahi-daemon
sudo systemctl disable --now cups4.3 配置内核参数
在/etc/sysctl.conf中添加:
# 防止SYN洪水攻击
net.ipv4.tcp_syncookies = 1
# 忽略ICMP广播
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 记录异常包
net.ipv4.conf.all.log_martians = 1五、日志监控与告警
安全不是一次性配置完就万事大吉的。你需要持续的监控。
5.1 使用logwatch汇总日志
sudo apt install logwatch
# 每日邮件报告
sudo logwatch --detail High --mailto admin@yourdomain.com --range today5.2 关键文件完整性检查
# 安装AIDE
sudo apt install aide
sudo aideinit
# 定期检查
sudo aide.wrapper --check六、最小权限原则
6.1 不要用root运行服务
每个Web应用、数据库都应该有自己专用的系统用户:
sudo useradd -r -s /bin/false mysql
sudo useradd -r -s /bin/false www-data6.2 文件权限审计
# 查找可写目录
find /var/www -type d -perm -o+w
# 修复不当权限
find /var/www -type f -exec chmod 644 {} \;
find /var/www -type d -exec chmod 755 {} \;结语
安全是一个持续的过程,不是一次性的配置。上面这些措施是我在一台服务器上线后24小时内必须完成的基线操作。它们不需要额外花钱,只需要你花一两个小时认真配置一次。
我曾在凌晨三点被PagerDuty叫醒处理入侵事件,那种感觉真的不想再经历第二次。希望这篇文章能帮你少走一些弯路。
记住安全领域的黄金法则:你不需要跑得比熊快,只需要跑得比其他人快。 大多数攻击者都是扫描整个IP段的自动化脚本,只要你的服务器比隔壁的难攻破,他们就会去找下一个目标。