Linux 服务器防火墙配置与入侵检测实战指南
前言
对于个人站长来说,服务器安全往往是被忽视的环节。很多站长忙于优化网站性能和内容建设,直到某天发现网站被挂马、数据库被脱库、服务器被挖矿,才意识到安全的重要性。实际上,绝大多数入侵事件都是可以预防的,只要做好基础的安全配置就能挡住 99% 的攻击。本文将从防火墙配置和入侵检测两个维度,教你如何加固自己的 Linux 服务器。
一、防火墙基础:iptables 与 nftables
Linux 防火墙的核心是 Netfilter 框架,它提供了数据包过滤、网络地址转换等功能。操作 Netfilter 的传统工具是 iptables,而较新的发行版已经转向 nftables。不过,对于个人站长来说,使用更上层的工具如 UFW(Uncomplicated Firewall)和 firewalld 会更方便。
1.1 使用 UFW 快速配置防火墙
UFW 是 Ubuntu 系统上最流行的防火墙管理工具,它的设计理念就是简单易用:
# 安装 UFW(Ubuntu/Debian)
sudo apt-get install ufw
# 设置默认策略:拒绝所有入站连接,允许所有出站连接
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 SSH 连接(务必先允许 SSH,否则你会把自己锁在门外)
sudo ufw allow ssh
# 允许 HTTP 和 HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 如果使用 Docker,需要允许 Docker 需要的端口
sudo ufw allow 2375/tcp
# 启用防火墙
sudo ufw enable
# 查看状态
sudo ufw status verbose
# 查看规则编号
sudo ufw status numbered
# 删除规则(按编号)
sudo ufw delete 31.2 使用 firewalld(CentOS/Rocky Linux)
# 安装 firewalld
sudo yum install firewalld
sudo systemctl enable firewalld
sudo systemctl start firewalld
# 添加服务规则
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 重新加载使规则生效
sudo firewall-cmd --reload
# 查看所有规则
sudo firewall-cmd --list-all1.3 高级 iptables 规则
如果你需要更精细的控制,可以编写 iptables 规则。以下是一些实用的高级规则:
# 防止 SYN Flood 攻击
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 防止端口扫描
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# 限制每 IP 的并发连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
# 只允许特定 IP 访问 SSH
iptables -A INPUT -p tcp --dport 22 -s 你的IP地址 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 保存 iptables 规则
sudo apt-get install iptables-persistent
sudo netfilter-persistent save二、Fail2ban:自动防御暴力破解
Fail2ban 是一款日志监控工具,它会扫描系统日志,当检测到多次失败的登录尝试时,自动将攻击者的 IP 加入防火墙黑名单。
# 安装 Fail2ban
sudo apt-get install fail2ban
# 创建本地配置文件(覆盖默认配置)
sudo tee /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
# 封禁时间:24 小时(单位:秒)
bantime = 86400
# 监控窗口:10 分钟
findtime = 600
# 最大尝试次数:5 次
maxretry = 5
# 忽略的 IP 段(你的常用 IP)
ignoreip = 127.0.0.1/8 你的IP地址
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 10
EOF
# 启动 Fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 查看状态
sudo fail2ban-client status
# 查看 SSH jail 的状态
sudo fail2ban-client status sshd
# 手动解封 IP
sudo fail2ban-client set sshd unbanip 攻击者IP三、入侵检测系统:AIDE 与 RKHunter
3.1 AIDE(高级入侵检测环境)
AIDE 通过为系统文件建立哈希数据库,定期比对文件完整性来检测入侵行为:
# 安装 AIDE
sudo apt-get install aide
# 初始化数据库(首次运行会比较慢)
sudo aideinit
# 将生成的数据库复制到工作目录
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 执行检查
sudo aide --check
# 配置定时检查(每天凌晨 3 点)
sudo crontab -e
# 添加以下行:
0 3 * * * /usr/bin/aide --check | mail -s "AIDE 每日检查报告" your@email.com3.2 RKHunter(Rootkit 检测)
RKHunter 专门用于检测 rootkit、后门和本地提权漏洞:
# 安装 RKHunter
sudo apt-get install rkhunter
# 更新检测规则
sudo rkhunter --update
# 执行全面扫描
sudo rkhunter --check --skip-keypress
# 设置为每日自动扫描
sudo crontab -e
0 4 * * * /usr/bin/rkhunter --check --cronjob --report-warnings-only | mail -s "RKHunter 报告" your@email.com四、Nginx 安全配置要点
Nginx 是个人站长最常使用的 Web 服务器,以下安全配置可以有效抵御常见攻击:
# 隐藏 Nginx 版本号
server_tokens off;
# 禁用不必要的 HTTP 方法
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
# 限制请求体大小(防止大文件上传攻击)
client_max_body_size 10m;
# 关闭目录列表
autoindex off;
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;
# 启用 XSS 防护
add_header X-XSS-Protection "1; mode=block" always;
# 防止 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff" always;
# 限制单个 IP 的连接速率
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_conn conn_limit 10;
# 限制请求速率
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=30r/s;
limit_req zone=req_limit burst=50 nodelay;
# 禁止访问隐藏文件和敏感目录
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~* (wp-config|config\.inc|\.env|\.git|\.svn) {
deny all;
}
# SQL 注入和 XSS 防护(简单过滤)
location ~* (union.*select.*from|select.*from.*where|eval\(|base64_) {
deny all;
}五、MySQL 安全加固
数据库安全同样不容忽视,以下是 MySQL 的安全配置清单:
# /etc/mysql/my.cnf 或 /etc/my.cnf
[mysqld]
# 仅监听本地连接
bind-address = 127.0.0.1
# 禁用 LOCAL INFILE 功能
local-infile = 0
# 启用慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 使用安全的认证插件
default_authentication_plugin = mysql_native_password
# 限制用户最大连接数
max_user_connections = 30同时执行安全加固脚本:
sudo mysql_secure_installation这个交互式脚本会帮助你完成以下安全设置:
- 设置 root 密码强度
- 删除匿名用户
- 禁止 root 远程登录
- 删除测试数据库
六、日志审计与异常检测
定期检查日志是发现入侵的最直接方法:
# 检查 SSH 登录失败记录
sudo lastb | head -20
# 查看最近的登录记录
sudo last | head -20
# 检查可疑的系统用户
sudo awk -F: '$3 == 0 {print $1}' /etc/passwd
# 检查近期修改过的文件(过去24小时内)
sudo find /etc -mtime -1 -type f
# 检查 SUID 文件(可能有提权后门)
sudo find / -perm -4000 -type f 2>/dev/null
# 检查所有用户的 SSH 公钥
sudo cat /home/*/.ssh/authorized_keys
# 分析 Nginx 访问日志中的异常请求
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20七、自动化安全巡检脚本
将以上检查整合成一个定时任务,每天自动执行:
#!/bin/bash
# /usr/local/bin/security_check.sh
echo "=== 安全巡检报告 $(date) ==="
echo "--- 登录失败记录 ---"
lastb | head -5
echo "--- 开放端口 ---"
ss -tlnp | grep LISTEN
echo "--- 可疑系统用户 ---"
awk -F: '($3 == 0) {print $1}' /etc/passwd
echo "--- 最近修改的配置文件 ---"
find /etc -mtime -1 -type f -name "*.conf" -o -name "*.php" 2>/dev/null
echo "--- SUID 文件变更 ---"
find / -perm -4000 -type f 2>/dev/null
echo "--- 磁盘使用率 ---"
df -h | grep -E '(/$|/home|/var)'
echo "--- 内存使用 ---"
free -h
echo "--- Fail2ban 状态 ---"
fail2ban-client status sshd 2>/dev/null | grep "Total banned"将此脚本加入 crontab:
chmod +x /usr/local/bin/security_check.sh
echo "0 6 * * * /usr/local/bin/security_check.sh | mail -s '每日安全巡检' your@email.com" | sudo crontab -总结
服务器安全不是一劳永逸的工作,它需要持续的关注和维护。记住一个原则:最小权限原则——只开放必要的端口,只给予必要的权限,只安装必要的软件。本文介绍的防火墙配置、Fail2ban、入侵检测和日志审计构成了一个完整的安全防护体系。从今天开始实施这些措施,你的服务器安全性将提升至少两个等级。