Linux服务器安全加固实战:从SSH到Fail2ban的完整防护体系

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 no

Ed25519密钥比RSA更快更安全,是现代服务器的首选。禁用密码登录后,暴力破解就彻底失效了——没有密码可猜。

1.3 限制登录用户

不是每个系统用户都需要SSH登录权限:

# 只允许特定用户SSH登录
AllowUsers deploy www-admin
# 或只允许特定组
AllowGroups sshusers

1.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 verbose

2.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防护日志

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.log

3.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-upgrades

4.2 禁用不必要的服务

# 查看所有监听端口
ss -tlnp
# 关闭不需要的服务
sudo systemctl disable --now avahi-daemon
sudo systemctl disable --now cups

4.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 today

5.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-data

6.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段的自动化脚本,只要你的服务器比隔壁的难攻破,他们就会去找下一个目标。

Last modification:July 12th, 2026 at 11:05 am

Leave a Comment