mobile wallpaper 1
mobile wallpaper 2
mobile wallpaper 3
mobile wallpaper 4
209 字
1 分钟
服务器安全加固实战:从被攻击到全面防护
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 日志监控脚本

#!/bin/bash
# /root/scripts/security-monitor.sh

LOG=“/www/wwwlogs/access.log”

统计最近 5 分钟的异常#

COUNT_444=(tail−1000"(tail -1000 "LOG” | grep -c ” 444 ”) COUNT_4XX=(tail−1000"(tail -1000 "LOG” | grep -cE ” 4[0-9]{2} ”)

if [ “COUNT444"−gt50];thenecho"[ALERT]发现COUNT_444" -gt 50 ]; then echo "[ALERT] 发现 COUNT_444 个 444 响应” >> /var/log/security.log fi

5.2 自动封禁脚本

#!/bin/bash
# /root/scripts/auto-ban.sh

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"count" -gt "THRESHOLD” ]; then iptables -I INPUT -s “ip"−jDROPecho"[BLOCKED]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

部分信息可能已经过时

目录