mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
859 字
2 分钟
服务器安全加固实战:从被攻击到全面防护
2026-06-09

服务器安全加固实战:从被攻击到全面防护#

一、背景#

作为一名网络安全学习者,我搭建了一个个人博客网站用于记录学习笔记。然而,网站上线后不久就遭到了大量自动化扫描和暴力破解攻击。本文记录了我从发现问题到全面防护的完整过程。

二、攻击现象#

2.1 SSH 暴力破解#

服务器日志显示大量 SSH 登录失败记录:

Failed password for invalid user admin from 103.189.235.176
Failed password for invalid user root from 45.148.10.121
Failed password for invalid user test from 36.93.249.106

攻击者使用常见用户名字典进行暴力破解:

  • admin, root, test, ubuntu, deploy
  • ftpuser, oracle, steam, minecraft

2.2 Web 漏洞扫描#

Nginx 访问日志中发现大量探测请求:

GET /wp-admin HTTP/1.1" 404
GET /phpmyadmin HTTP/1.1" 404
GET /.env HTTP/1.1" 404
GET /config HTTP/1.1" 404

2.3 攻击来源分析#

地区占比特征
美国40%云服务器扫描
俄罗斯20%自动化工具
中国20%被入侵主机
印尼13%IoT 扫描
荷兰7%漏洞探测

三、安全加固方案#

3.1 Nginx 安全配置#

# 隐藏版本号
server_tokens off;
# 安全响应头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;
# 敏感路径拦截
location ~* /(wp-admin|phpmyadmin|\.env|config) {
return 444;
}
# 静态资源缓存
location ~* \.(css|js|png|jpg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}

3.2 WAF 配置#

使用宝塔免费 WAF,配置如下:

{
"cc": {
"open": true,
"limit": 120,
"cycle": 60,
"endtime": 300,
"status": 444
},
"scan": {
"open": true,
"status": 444
},
"drop_abroad": {
"open": false
}
}

关键参数说明

  • limit: 120 - 每分钟允许 120 次请求(避免误封正常用户)
  • cycle: 60 - 统计周期 60 秒
  • endtime: 300 - 封禁时间 5 分钟

3.3 fail2ban 配置#

[sshd]
enabled = true
port = 22222
maxretry = 3
bantime = 7200
[nginx-badbots]
enabled = true
port = http,https
maxretry = 20
findtime = 600
bantime = 3600
[nginx-req-limit]
enabled = true
port = http,https
maxretry = 10
bantime = 7200

调优经验

  • maxretry 不能太低,否则正常用户会被误封
  • 建议从 20 开始,根据实际情况调整
  • 设置 ignoreip 排除自己的 IP

3.4 内核安全参数#

/etc/sysctl.conf
# 防 SYN Flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
# 禁止 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# 反向路径过滤
net.ipv4.conf.all.rp_filter = 1

四、踩坑记录#

4.1 WAF 海外封锁导致无法访问#

问题:启用了 WAF 的”禁止海外访问”功能后,自己也无法访问网站。

原因:WAF 通过 IP 地理位置判断,如果使用 VPN 或代理,会被识别为海外 IP。

解决:关闭海外封锁,改用 CC 防护限制异常请求。

4.2 fail2ban 误封正常用户#

问题:用户反馈无法访问网站,检查发现被 fail2ban 封禁。

原因:浏览器加载页面时会同时请求多个静态资源,触发了 nginx-badbots 的检测规则。

解决

  1. 提高 maxretry 到 20
  2. 设置 ignoreip 排除常用 IP
  3. 禁用过于敏感的规则

4.3 CC 防护阈值设置#

问题:CC 防护阈值设置过低(60次/分钟),导致正常浏览被拦截。

解决:提高到 120 次/分钟,既能防护攻击又不影响正常访问。

五、监控与告警#

5.1 日志监控脚本#

/root/scripts/security-monitor.sh
#!/bin/bash
LOG="/www/wwwlogs/access.log"
# 统计最近 5 分钟的异常
COUNT_444=$(tail -1000 "$LOG" | grep -c " 444 ")
COUNT_4XX=$(tail -1000 "$LOG" | grep -cE " 4[0-9]{2} ")
if [ "$COUNT_444" -gt 50 ]; then
echo "[ALERT] 发现 $COUNT_444 个 444 响应" >> /var/log/security.log
fi

5.2 自动封禁脚本#

/root/scripts/auto-ban.sh
#!/bin/bash
LOG="/www/wwwlogs/access.log"
THRESHOLD=300
# 统计高频 IP
awk '{print $1}' "$LOG" | sort | uniq -c | sort -rn | head -20 | \
while read count ip; do
if [ "$count" -gt "$THRESHOLD" ]; then
iptables -I INPUT -s "$ip" -j DROP
echo "[BLOCKED] $ip - $count requests" >> /var/log/blocked.log
fi
done

六、总结#

6.1 防护效果#

指标加固前加固后
SSH 暴破每天 100+ 次0 次
Web 扫描每天 50+ 次被 WAF 拦截
误封用户频繁基本无

6.2 经验教训#

  1. 安全与便利的平衡:防护不能太严格,否则影响正常用户
  2. 日志很重要:定期分析日志,及时发现攻击
  3. 分层防护:WAF + fail2ban + iptables 多层防护
  4. 持续优化:根据实际情况调整防护策略

6.3 后续计划#

  • 配置 SSH 密钥认证,禁用密码登录
  • 部署 CDN,隐藏源站 IP
  • 配置自动备份
  • 部署入侵检测系统

参考资料

声明:本文涉及的 IP 地址、域名均为示例,已做脱敏处理。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

服务器安全加固实战:从被攻击到全面防护
https://lansame.top/posts/server-security-hardening/
作者
Lansame
发布于
2026-06-09
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录