修改默认访问的站点配置文件,添加以下代码即可。
return 408;
当然改成502、403等其它状态码都可以,如果想把这部分流量导入到指定网站,添加以下代码即可实现301跳转。
rewrite ^(.*) https://www.jiangdefu.com permanent;
若要禁止HTTPS访问,添加监听端口443并配置任意的SSL证书即可。
2025年1月30日补充更新:
如果需要隐藏存在Web服务,建议使用不会返回任何响应的状态码444,这样可防止攻击者嗅探到存在Web服务。
| 特性 | 408(Request Timeout) | 444(Nginx 直接关闭连接) |
|---|---|---|
| 是否返回响应 | 是,返回 408 状态码和响应头 | 否,直接关闭连接,不返回任何数据 |
| 是否符合标准 | 是,HTTP 标准状态码 | 否,Nginx 特有状态码 |
| 客户端感知 | 客户端会收到 408 状态码 | 客户端只会发现连接被关闭 |
| 攻击者感知 | 攻击者知道服务器存在并返回了 408 | 攻击者无法判断服务器是否存在 |
| 适用场景 | 客户端请求超时 | 隐藏服务器存在,丢弃非法请求 |
为了进一步迷惑攻击者进行嗅探,可以延迟一段时间后再返回状态码,攻击者可能会认为网络延迟或服务器性能问题导致了连接关闭,而不是服务器主动拒绝请求。
实现代码:
access_by_lua_block {
ngx.sleep(60) -- 延迟 60 秒
ngx.exit(444) -- 返回 444
}
使用前需要确认 Nginx 安装了 Lua 模块(OpenResty 默认支持)。
主流浏览器的默认超时时间是30秒和60秒,为了提高迷惑性因此延迟60秒
1. Chrome
Chrome浏览器的默认超时时间通常为30秒。如果在30秒内无法建立连接,Chrome会显示ERR_CONNECTION_TIMED_OUT错误。
2. Firefox
Firefox浏览器的默认超时时间也通常是30秒。如果连接请求在30秒内没有响应,Firefox会提示连接超时。
3. Edge
Edge浏览器的默认超时时间与Chrome类似,也是30秒。如果连接请求在30秒内没有响应,Edge会显示ERR_CONNECTION_TIMED_OUT错误。
4. Safari
Safari浏览器的默认超时时间通常为60秒。如果连接请求在60秒内没有响应,Safari会提示连接超时。
2026年3月20日补充更新:
原方案中固定 60 秒延迟存在被指纹化识别的风险——若嗅探者观察到所有请求均精确 60 秒后断开,可推断此为人为延迟而非真实网络不通。
现优化为基于 IP 的随机延迟策略:通过 CRC32 哈希使同 IP 延迟保持一致(模拟网络路径特征),不同 IP 延迟分散在 25-94 秒区间(模拟真实网络的不稳定性),从而避免固定时间被模式识别,增强”无服务”的迷惑性。
access_by_lua_block {
local ip = ngx.var.remote_addr
-- 基础 30-89s(IP 一致性)+ 随机抖动 ±5s
local delay = 30 + (ngx.crc32_long(ip) % 60) + math.random(-5, 5)
ngx.sleep(delay)
ngx.exit(444)
}
关键改进:真实网络不通本就呈现随机超时特征,此方案更贴近实际,使嗅探者难以区分”人为延迟”与”网络不通”。