Nginx 状态码 444 + 497 屏蔽 DDOS 响应 提升 HTTPS/TLS/SSL Web服务安全性
网络安全防护至关的重要,特别是在对外提供 HTTPS 服务时。本文介绍如何使用 Nginx 的状态码 444 来防止未授权访问和潜在安全问题。
444 是 Nginx 特有的状态码,用于强制关闭客户端连接,不返回任何响应,有效拒绝了不合法请求,避免信息泄露。在提供 HTTPS 私密服务时,非法用户可能尝试探测端口,这不仅浪费资源,还可能带来安全风险。通过 Nginx 配置状态码 444,可以隐藏服务存在,保护隐私。
下面是使用状态码 444 保护 HTTPS 服务的基本 Nginx 配置:
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
location / {
return 444;
}
error_page 497 = @close;
location @close {
return 444;
}
}
其中
- listen 443 ssl;:监听 443 端口,启用 SSL。
- location / { return 444; }:根路径请求直接返回 444,拒绝访问。
- error_page 497 = @close;:HTTP 访问 HTTPS 端口时重定向到 @close。
- location @close { return 444; }:497 错误时返回 444,关闭连接。
使用 Nginx 状态码 444 是保护 HTTPS 服务的方法,有以下好处:
1. 隐蔽性:状态码 444 使非法用户无法探测服务,减少自动扫描和攻击风险。
2. 资源节约:拒绝不必要请求,避免性能下降。
3. 安全性提升:限制访问,只允许授权用户连接,降低安全威胁。
这种方法可以隐藏服务存在,节省资源,增强安全性。
业务现象
有几个域名都是解析到同一个服务器,同时访问都是同一个nginx,但是一个就比较正常,另外一个直接看不到http 状态信息(通过浏览器),刚开始以为是解析配置的有问题,通过链路的分析发现应该是同一个nginx,那就比较怪了,正常情况下应用是至少能看到nginx 返回的一些信息的,然后就顺着产品使用nginx 查看配置,之后发现了一个比较有意思的http 444 状态码的使用
- 一段参考配置
location / {
if ($bad_bot) {
return 444;
}
# normal processing…
}
在参考相关资料之后,发现通过浏览器打开的效果与实际配置的nginx 444 是对应上了
nginx http 444 的处理
当遇到return 444,内部会进行日志记录,然后直接关闭连接,不会发送http 状态行,头以及body,客户端的现象是Empty reply from server
nginx http 444 的一些使用场景
- 拦截无效或者恶意请求
- 防爬虫
说明
使用好nginx 的http 444 还是比较有用的,可以减少一些攻击的持续探测,同时还能减少带宽,但是对于日常拍错也是会有一些影响的,所以注意查看配置。
Nginx 444 状态码
444 状态码是 nginx 自己定义的,不在标准HTTP状态码范围内。它的核心含义是:
Nginx 服务器主动关闭连接,不向客户端发送任何响应。
相比返回一个完整的错误页面(如 403 或 404, 502),直接关闭连接消耗的服务器资源(CPU、内存、带宽)更少,尤其是在面对大量无效或恶意请求时。甚好,非常符合我的需求。
Nginx 配置示例
# 在 server 或 http 块中
if ($http_user_agent ~* (BadBot|Scanner|Spammer)) {
return 444;
}
reload Nginx 配置
确认配置文件格式正确,并 reload Nginx 配置,使 444 状态码的配置生效。
sudo nginx -t
sudo nginx -s reload
😮💨,感觉搭建服务器时不能有精神洁癖,被攻击就被攻击吧,只要服务器负载没有问题,你刷你的。 我也不咋纠结了。