IT 相关 · 2019 年 11 月 8 日

配置 Nginx 禁止 IP 访问以防恶意解析

修改默认访问的站点配置文件,添加以下代码即可。

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 会提示连接超时。