刚上线就有不断的恶意扫描加固一下
刚发布了网站,就一直被扫描。
原来这个IP就一直被扫描,安了一个雷池的WAF,但我小机,有点带不动,加上昨天把nginx搞坏了,干脆恢复了快照,不用雷池WAF了,上Nginx 严格配置和 fail2ban 吧,看下效果怎么样?
干中学
在 Nginx 中禁止通过 IP 直接访问,本质上是设置一个“默认拦截器”。当请求头中的 Host 字段不匹配你绑定的域名时,Nginx 会将其分配给这个拦截器并拒绝服务。 操作步骤如下:
1. 找到主配置文件
通常在 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default。
2. 添加“默认 server”配置块
在 http { … } 块内部的最前面,添加以下内容。这段配置的作用是捕捉所有未在其他 server_name 中定义的请求(包括直接访问 IP):
# 拦截 HTTP (80端口) 的 IP 直接访问server { listen 80 default_server; listen [::]:80 default_server; # 支持 IPv6 server_name _; # 下划线表示匹配所有不匹配的域名/IP
# 直接切断连接,不给任何响应,最节省资源 return 444;}
# 拦截 HTTPS (443端口) 的 IP 直接访问 (如果有证书)server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _;
# 必须指定一对有效的证书路径,否则 Nginx 无法启动 # 可以直接复用你现有域名的证书 ssl_certificate /etc/nginx/ssl/your_cert.pem; ssl_certificate_key /etc/nginx/ssl/your_cert.key;
return 444;}3. 参数详解
default_server: 关键参数。告诉 Nginx,如果请求的 Host 没能匹配到任何其他 server 块,就由这个块来处理。 server_name _: 这里的下划线是一个无效的域名占位符,专门用来捕获 IP 访问或乱指向你服务器的恶意域名。 return 444: 这是 Nginx 的特殊非标准状态码。它会立即关闭连接,连 HTTP 响应头都不发回。这比返回 403 或 404 更安全,因为攻击者完全拿不到你服务器的任何信息。
4. 确保你的真实网站有 server_name
确保你存放网页的那个 server 块配置了正确的域名:
server { listen 80; server_name www.yourdomain.com; # 只有通过这个域名访问才会被这里处理 root /var/www/html; ...}5. 验证并重启
检查语法:
sudo nginx -t重载配置:
sudo nginx -s reload6. 测试效果
在本地电脑浏览器或终端输入:
curl -I http://你的服务器IP预期结果:终端显示 curl: (52) Empty reply from server 或浏览器提示“连接重置”,这说明拦截成功。 为什么在 2026 年必须这么做? 现在的自动化扫描器(如你日志里的 zgrab)会全网扫描 IP 段的 80/443 端口。如果你不设置默认拦截,Nginx 可能会默认把 IP 访问分配给你列表里的第一个网站,从而暴露你的网站结构和后端漏洞。设置 444 是目前最高效的防护手段。
解决事
我给GOOGLE AI 了一段日志, 答:
这是非常典型的全网自动化扫描。你需要明白一个残酷的事实:在 2026 年,任何一个公网 IP 只要上线并开放了 80/443 端口,平均在 60 秒内就会被全球的扫描器(Botnet)发现并开始尝试攻击。 针对你的疑问,详细解答如下:
1. 他是怎么知道我刚配置好网站的?
他并不一定知道你“刚配置好”,但他一直在盲扫:
- IP 段轮询:黑客租用大量 VPS(如你日志中的 52.147.68.81 属于微软 Azure 数据中心),不停地对全球 IPv4 地址进行循环扫描。
- 证书透明度 (CT) 日志:如果你为域名申请了 SSL 证书(如 Let’s Encrypt),证书信息会立刻进入公开的 CT 日志。扫描器监控到新域名证书发放,会立即发起定向扫描。
- 指纹探测:扫描器发现你的 80/443 有响应,就会立刻触发“WordPress 漏洞字典”,尝试访问 /wp-admin 等路径,看看你是不是在用 WordPress。
2. 这种扫描的危害
- 消耗资源:虽然你的服务器返回的是 404,但每个请求都会占用 Nginx 连接数和带宽。
- 寻找后门:日志中的 wso.php 是著名的 PHP Webshell。他在搜你有没有前人留下的木马,或者你是不是安装了有漏洞的插件。
- 伪造来源:注意日志里的 Referer 是 yahoo.com, google.de,这是伪造的,目的是误导日志分析或绕过简单的安全过滤。
3. 你该怎么做?(实操建议)
如果你不是用 WordPress 建站,这些扫描对你只是“噪音”,但仍建议封禁。
- 方案 A:利用 Nginx 快速屏蔽 WordPress 探测 在你的子站点配置文件 server 块中加入以下正则,直接拒绝对这些敏感目录的访问:
location ~* ^/(wp-admin|wp-content|wp-includes|wp-config|phpmyadmin) { deny all; access_log off; # 不记录这些烦人的 403 日志,减少 IO log_not_found off;}-
方案 B:部署 Fail2Ban(强烈推荐) 针对这种在 1 秒钟内疯狂尝试几十个路径的行为,Fail2Ban 是杀手锏。 1.安装:sudo apt install fail2ban 2.配置:开启 nginx-botsearch。 3.效果:当 52.147.68.81 连续请求 5 个不存在的路径(404)时,Fail2Ban 会直接在操作系统防火墙层面禁止该 IP 访问,你的 Nginx 甚至都不会再收到它的请求。
-
方案 C:使用云平台“安全组” 海外流量拦截:如果你的业务只针对国内,直接在云服务商(腾讯云/阿里云/华为云)的安全组/防火墙中屏蔽掉海外 IP。你日志中的微软 Azure IP 大多来自海外数据中心,屏蔽后服务器会瞬间清净 95% 以上。 总结 这不代表你的服务器不安全,这只是互联网的背景噪音。只要你做好了: 禁止 IP 直接访问(前面教你的 default_server 配置)。 非 WordPress 目录屏蔽。 Fail2Ban 自动封禁持续扫描者。 你的服务器就能在 2026 年复杂的网络环境中稳如泰山。
Fail2Ban
部署 Fail2Ban 我要怎么做详细说一下。
在 2026 年的 Linux 运维实践中,部署 Fail2Ban 是对抗自动化扫描(如你之前看到的 WordPress 漏洞探测)最标准的手段。它通过读取 Nginx 日志,发现恶意行为后,直接调用防火墙封禁对方 IP。 以下是针对 Ubuntu/Debian 系统的详细部署步骤:
- 安装 Fail2Ban
sudo apt updatesudo apt install fail2ban -y- 创建本地配置文件
Fail2Ban 的默认配置文件是 /etc/fail2ban/jail.conf,但不要直接修改它。我们应该创建一个 .local 文件,它的优先级更高且在软件更新时不会被覆盖。
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local- 配置针对 Nginx 的防护规则
编辑该文件:sudo nano /etc/fail2ban/jail.local。 找到或添加 [nginx-botsearch] 和 [nginx-http-auth] 部分,按以下建议修改:
[DEFAULT]# 封禁时长(1天)bantime = 1d# 统计时长(在 10 分钟内达到次数就封禁)findtime = 10m# 最大尝试次数maxretry = 5
[nginx-http-auth]enabled = trueport = http,httpslogpath = /var/log/nginx/error.log
[nginx-botsearch]# 专门对付你日志里那种扫描不存在的 wp-admin 等行为enabled = trueport = http,httpsfilter = nginx-botsearchlogpath = /var/log/nginx/access.logmaxretry = 3- 针对 WordPress 扫描的自定义强化 (可选)
如果你想专门针对你刚才日志里那种 /wp-content/ 等路径的密集扫描,可以自定义一个过滤器。 创建过滤器文件: sudo nano /etc/fail2ban/filter.d/nginx-forbidden-paths.conf 写入正则规则:
[Definition]failregex = ^<HOST> -.*GET .*(wp-admin|wp-content|wp-includes|wp-config|phpmyadmin|etc/passwd|bin/sh)ignoreregex =在 jail.local 中启用它:
[nginx-forbidden-paths]enabled = trueport = http,httpsfilter = nginx-forbidden-pathslogpath = /var/log/nginx/access.logmaxretry = 2- 启动并验证
# 启动并设置开机自启sudo systemctl enable fail2bansudo systemctl restart fail2ban
# 查看 Fail2Ban 运行状态sudo fail2ban-client status
# 查看具体的 Nginx 封禁监狱(能看到被封禁的 IP 列表)sudo fail2ban-client status nginx-botsearch- 常用维护命令 (非常实用)
手动解封某个 IP: sudo fail2ban-client set nginx-botsearch unbanip 52.147.68.81 手动封禁某个 IP: sudo fail2ban-client set nginx-botsearch banip [IP地址] 实时查看 Fail2Ban 日志: sudo tail -f /var/log/fail2ban.log (当有 IP 被封时,这里会显示 [nginx-botsearch] Ban 52.147.68.81)
- 2026 年的特别建议
配合后端加固:Fail2Ban 是“事后处理”。配合你之前做的 return 444;(禁止 IP 访问),攻击者甚至连产生大量 404 日志的机会都没有,这能极大减轻服务器压力。
白名单:记得在 jail.local 的 [DEFAULT] 下设置 ignoreip = 127.0.0.1/8 ::1 [你的办公室/家里固定IP],防止你自己因为输错密码或频繁刷新被封禁。
发布于: 2026年1月2日