我有一个服务器块,它监听特定服务器名称上的80个端口请求以及一些位置指令.我如何让nginx处理任何不匹配的请求,好像它没有收到它,那就让它超时?目前,这些请求被处理404错误
有一种方法可以忽略每个请求并告诉 nginx 什么都不响应:
server {
  listen 80 default_server;
  return 444;
}
记录在这里:http : //nginx.org/en/docs/http/ngx_http_rewrite_module.html
非标准代码 444 关闭连接而不发送响应头。
如何让 nginx 将任何不匹配的请求视为未收到,即让它超时?
你无法放松时钟。为了找出正在请求的服务器名称(从 TLS-SNI 和/或Host标头),nginx 必须首先accept建立连接(这将导致操作系统的 TCP/IP 堆栈将 SYN-ACK 数据包发送回请求者,以便提前 TCP 握手)。一旦连接被接受,对方就知道有东西正在监听。所以你已经放弃了连接超时的机会。
不可挽回地失去这个机会后,您的下一个机会就是触发套接字接收超时。由于客户端将等待服务器响应某些内容,因此理论上您可以通过根本不响应来触发其接收超时。目前标准 nginx 中没有任何机制可以让它坐在那里,暂时不执行任何操作,但是如果您也愿意使用另一个软件,那么您可以使用该proxy_pass指令或类似指令将该责任转移到另一台服务器。但请注意,这将使您的服务器在连接生命周期内保留一定数量的操作系统资源。Nginx 在套接字上运行,而不是原始数据包,并且操作系统管理这些套接字。
回答完问题后,我认为最好质疑问题的前提。为什么要让客户端超时?如果您的目标是扰乱或“报复”恶意攻击者,那么 nginx 是错误的工具。这是计算机安全领域,您将需要使用在网络堆栈较低层运行的工具。Nginx 被设计为一个网络服务器,而不是一个蜜罐。
如果您的目标只是隐藏有服务器正在侦听的事实,那么使用当前 HTTP 的工作方式就不可能实现您的目标。防火墙只能通过在连接被接受之前拒绝连接来实现重影。因此,TCP 握手永远不会进行,没有 SYN-ACK 数据包发送回客户端,并且据任何人所知,整个端口是一个黑洞。但在确定所请求的服务器名称后就无法执行此操作。IP 地址和端口可从第一个数据包中获取;服务器名称不是。
在不久的将来,HTTP 可能会使用 UDP 而不是 TCP,并且请求参数(例如服务器名称)可能会出现在第一个数据包的前面。然而,除非这成为常态,否则我上面描述的情况将持续存在。
| 归档时间: | 
 | 
| 查看次数: | 3060 次 | 
| 最近记录: |