859 字
2 分钟
服务器安全加固实战:从被攻击到全面防护
服务器安全加固实战:从被攻击到全面防护
一、背景
作为一名网络安全学习者,我搭建了一个个人博客网站用于记录学习笔记。然而,网站上线后不久就遭到了大量自动化扫描和暴力破解攻击。本文记录了我从发现问题到全面防护的完整过程。
二、攻击现象
2.1 SSH 暴力破解
服务器日志显示大量 SSH 登录失败记录:
Failed password for invalid user admin from 103.189.235.176Failed password for invalid user root from 45.148.10.121Failed 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" 404GET /phpmyadmin HTTP/1.1" 404GET /.env HTTP/1.1" 404GET /config HTTP/1.1" 4042.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 = trueport = 22222maxretry = 3bantime = 7200
[nginx-badbots]enabled = trueport = http,httpsmaxretry = 20findtime = 600bantime = 3600
[nginx-req-limit]enabled = trueport = http,httpsmaxretry = 10bantime = 7200调优经验:
maxretry不能太低,否则正常用户会被误封- 建议从 20 开始,根据实际情况调整
- 设置
ignoreip排除自己的 IP
3.4 内核安全参数
# 防 SYN Floodnet.ipv4.tcp_syncookies = 1net.ipv4.tcp_max_syn_backlog = 8192
# 禁止 ICMP 重定向net.ipv4.conf.all.accept_redirects = 0net.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 的检测规则。
解决:
- 提高
maxretry到 20 - 设置
ignoreip排除常用 IP - 禁用过于敏感的规则
4.3 CC 防护阈值设置
问题:CC 防护阈值设置过低(60次/分钟),导致正常浏览被拦截。
解决:提高到 120 次/分钟,既能防护攻击又不影响正常访问。
五、监控与告警
5.1 日志监控脚本
#!/bin/bashLOG="/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.logfi5.2 自动封禁脚本
#!/bin/bashLOG="/www/wwwlogs/access.log"THRESHOLD=300
# 统计高频 IPawk '{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 fidone六、总结
6.1 防护效果
| 指标 | 加固前 | 加固后 |
|---|---|---|
| SSH 暴破 | 每天 100+ 次 | 0 次 |
| Web 扫描 | 每天 50+ 次 | 被 WAF 拦截 |
| 误封用户 | 频繁 | 基本无 |
6.2 经验教训
- 安全与便利的平衡:防护不能太严格,否则影响正常用户
- 日志很重要:定期分析日志,及时发现攻击
- 分层防护:WAF + fail2ban + iptables 多层防护
- 持续优化:根据实际情况调整防护策略
6.3 后续计划
- 配置 SSH 密钥认证,禁用密码登录
- 部署 CDN,隐藏源站 IP
- 配置自动备份
- 部署入侵检测系统
参考资料:
声明:本文涉及的 IP 地址、域名均为示例,已做脱敏处理。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
服务器安全加固实战:从被攻击到全面防护
https://lansame.top/posts/server-security-hardening/ 部分信息可能已经过时
相关文章 智能推荐






