Nginx ssl 终止后调试镜像

Nginx ssl 终止后调试镜像

我如何告诉 nginx 输出给定的所有传入流量server{}到特定/附加/冗余位置解密(如端口镜像在路由器上),以便进行分析并排除故障?

我需要调试进入 https 网站的流量。服务器是无头的,我宁愿

  1. 无需为 wireshark 安装 GUI
  2. 不要将我的私钥移出服务器,以便稍后使用 wireshark 在本地 GUI 上进行分析

因此,wireshark(用于解密 https 流的最常用解决方案)不是一个解决方案。我想要一个仅限 CLI 且需要在服务器上实时完成的最少工具。我检查了tcpdump的 https 支持;它不存在,但你可以结合大量其他工具并使其发挥作用,但这并不完全理想。

我的 Web 服务器是 nginx。我想知道是否有某种方式可以设置 nginx,以便除了它通常处理给定块的流量的方式之外server{},还可以将解密的流量发送到某个镜像(仅用于调试),然后我可以直接使用它进行分析tcpdump,最好是实时分析。

是否可以将proxy_pass镜像添加到 nginxserver{}块,以便 nginx 像往常一样处理流量将解密后的流量发送到某个“调试”位置(可能只是一个nc -l 8080或其他东西)?

答案1

我最近发现,nginx 从 1.13.4 版开始确实具有此功能。使用该mirror指令,您可以将每个请求的副本转发到不同的 HTTP 服务器。响应(如果有)将被忽略。

在您想要镜像请求的server或中,添加一个指令,其中包含永远不会出现在您网站上的 URL 路径。然后,添加一个新指令,该指令完全服务于该路径并将请求传递给其他服务器。locationmirrorlocation

一个简单的例子:

server {
    location / {
        mirror /Jahg3bioshes;
        # ... the rest of your directives
    }

    location = /Jahg3bioshes {
        internal;
        proxy_pass http://sink.server.example$request_uri;
    }
}

请注意,虽然 nginx 会忽略响应,但它不会忽略响应所需的时间,如果镜像服务器响应缓慢,它也会减慢原始请求的速度。它可能只是一些简单的服务器,例如,使用发行版默认配置的新安装的 Web 服务器。

答案2

nginx 支持 lua 作为脚本语言。因此,您可以编写自己的函数来操作和保存数据,方法是调用 ngx.var.request_body 和 ngx.var.echo_request_body,或者使用现有的函数,例如https://github.com/thinkinside-LQ/httpdump

答案3

我能想到两种方法来实现你想要的效果。要么使用 SSLKEYLOG 和 tshark,要么安装反向 TLS 代理。

选项 1:SSLKEYLOG + TSHARK

第一个选项是将 SSL 主密钥记录到SSL密钥日志文件,用tcpdump捕获加密流量,并用tshark(Wireshark的命令行版本)进行分析。

选项 2:反向 TLS 代理

第二种选择是安装支持“反向代理”模式的 TLS 检查代理,该代理会解密传入流量,然后在将其转发到 Web 服务器之前重新加密。代理还必须支持以某种方式将解密模式下的流量副本发送到外部接口。

你可以使用以下方式执行“选项 2”SSLsplit,但我不确定。我知道你可以用极地代理不过(免责声明:PolarProxy 是由 Netresec 开发的)。我们有一篇博客文章叫做反向代理和 TLS 终止解释了如何设置反向代理。然后您可以使用tcpreplay将解密的流量推送到网络接口。

相关内容