问答题423/1053在Nginx中,如何使用未定义的服务器名称来阻止处理请求?

难度:
2021-11-02 创建

参考答案:

在Nginx中,可以通过配置一个默认服务器来处理未定义的服务器名称的请求,并返回一个特定的错误响应(如403、444等)或丢弃这些请求,从而实现阻止未定义的服务器名称处理请求的目的。


方法一:使用默认服务器返回特定状态码

可以通过设置一个server块,监听所有未定义的服务器名称,并返回错误码或自定义响应。

1server { 2 listen 80 default_server; # 将此服务器设置为默认服务器 3 server_name _; # 匹配所有未定义的服务器名称 4 5 return 444; # 直接丢弃请求(Nginx内置444状态码) 6}
  • default_server:指定当前server块为默认服务器,当没有其他server_name匹配时处理请求。
  • server_name __是一个特殊的值,用于匹配任何未定义的服务器名称。
  • return 444:Nginx内置的非标准状态码,用于关闭连接而不发送任何响应。

方法二:使用默认服务器返回403 Forbidden

如果想返回HTTP标准的错误状态码,可以使用return 403

1server { 2 listen 80 default_server; 3 server_name _; 4 5 return 403; # 返回403 Forbidden状态码 6}

客户端会看到一个标准的403错误响应,而不是直接断开连接。


方法三:黑洞处理(丢弃请求)

配置一个空的默认服务器,直接忽略所有请求。

1server { 2 listen 80 default_server; 3 server_name _; 4 5 # 不做任何处理 6 location / { 7 return 444; # 丢弃请求,不返回任何内容 8 } 9}

此配置对未知域名的请求不返回任何响应,直接断开连接,适合拒绝恶意流量。


方法四:仅允许定义的域名,拒绝所有其他域名

明确列出允许的域名,对于其他未匹配的请求返回错误。

1server { 2 listen 80 default_server; 3 server_name _; 4 5 return 444; # 拒绝所有未定义的域名 6} 7 8server { 9 listen 80; 10 server_name example.com www.example.com; 11 12 location / { 13 proxy_pass http://backend; 14 } 15}

在这里:

  • 请求example.comwww.example.com会被正常处理。
  • 其他所有域名都会被丢弃。

注意事项

  1. 防止滥用
    未定义服务器名称的请求可能是恶意流量,例如爬虫、探测等,丢弃(return 444)更安全。

  2. 默认服务器优先级
    Nginx会优先匹配server_name,如果没有匹配,则使用default_server配置。

  3. 监听多个端口
    如果需要对多个端口(如80和443)同时进行处理,需要分别设置默认服务器。

最近更新时间:2024-12-23