防止特定IP段端口扫描需“提前拦截+精准识别+多层设防”:一、Nginx中deny已知恶意IP段;二、配置default_server返回444屏蔽IP直连;三、用UFW/iptables底层拦截;四、通过limit_req限制请求频率抑制探测。

防止特定 IP 段对服务器进行端口扫描,核心思路是「提前拦截 + 精准识别 + 多层设防」。Nginx 本身不直接检测端口扫描行为(那是防火墙或 IDS 的职责),但它能高效拦截已知恶意源的 HTTP/HTTPS 层请求,并配合系统级防护形成合力。
一、在 Nginx 中封禁已知扫描 IP 段
适用于已掌握恶意扫描者 IP 范围的情况(如 Censys、Shodan 官方公布的扫描段)。操作简单、生效快:
- 编辑 Nginx 主配置文件(通常为 /www/server/nginx/conf/nginx.conf 或站点 conf 文件)
- 在 http{} 块内添加如下规则(支持 CIDR 格式):
deny 167.94.138.0/24; deny 167.94.140.0/24; deny 167.94.142.0/24;
注意:多条 deny 规则需按顺序写入,且必须放在所有 allow 规则之后;若只留 deny 不加 allow all,会默认放行其余流量。
二、禁止通过 IP 直接访问,切断扫描入口
大量端口扫描器会直接用 IP 请求 80/443 端口,试图获取证书信息或默认页面。屏蔽这类请求可大幅减少暴露面:
- 新增一个默认 server 块,监听 80 和 443,匹配任意未声明的域名或纯 IP 访问
- 返回 444(Nginx 特有关闭连接状态码)或 403,不返回任何响应体
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate /www/server/panel/vhost/cert/default/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/default/privkey.pem;
return 444;
}
该配置让扫描器无法获得有效响应,也避免了 HTTPS 下因 SNI 缺失导致的证书泄露风险。
三、结合系统防火墙(UFW/iptables)做底层拦截
Nginx 运行在应用层,而端口扫描最先触达的是内核网络栈。用防火墙在更早阶段丢包,效率更高、资源消耗更低:
- Ubuntu/Debian 推荐使用 UFW:
sudo ufw deny from 167.94.138.0/24 to any - 启用后立即生效,无需重启服务
- Censys 当前(2026年中)主要扫描段仍集中在 167.94.138.0/24、167.94.140.0/24、167.94.142.0/24,建议优先拉黑
四、限制请求频率,抑制自动化探测
即使 IP 不在黑名单中,高频试探性请求(如每秒多次访问 /、/robots.txt、/.git/config)也极可能是扫描行为。可用 Nginx 的 limit_req 模块应对:
- 在 http{} 块定义限流区:
limit_req_zone $binary_remote_addr zone=scan:10m rate=5r/s; - 在 server 或 location 中启用:
limit_req zone=scan burst=10 nodelay; - 这样单个 IP 超过 5 次/秒的请求会被延迟排队,超出队列则直接 503


















