用于 ssl 终止的 nginx 流代理与 http 代理

fre*_*kre 7 nginx reverse-proxy

我正在运行一个 HTTP 服务并希望将nginxSSL 终止放在前面。这可以通过两种方式完成;要么作为stream代理

stream {
    server {
        listen               443 ssl;
        ssl_certificate      /certs/fullchain.pem;
        ssl_certificate_key  /certs/privkey.pem;
        proxy_pass           ip-for-backend-service:80;
    }
}
Run Code Online (Sandbox Code Playgroud)

或作为http代理

http {
    server {
        listen 443 ssl;
        ssl_certificate      /certs/fullchain.pem;
        ssl_certificate_key  /certs/privkey.pem;

        location / {
            proxy_pass       http://ip-for-backend-service:80;
            proxy_set_header ...;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

乍一看,stream代理的配置似乎简单得多,因为您不必添加一堆额外的标头(proxy_set_header等)和其他配置。

我试图了解这两种方法之间的优缺点,特别是我有以下问题:

  1. 这两种方法是否会泄漏有关后端服务的更多信息?例如,是否ip-for-backend-service可见?

  2. 这两种方法都能更好地抵御攻击吗?我想如果后端服务有缺陷,它会通过这两个选项可见/可利用吗?

  3. 哪个选项更有效?我认为stream选项可能会更快,因为它只是路由流量并且中间没有 http 服务器?

Pio*_*asz 6

使用这两种方法,上游 IP 地址将保持隐藏。

至于其余的:

  • stream肯定更快,因为执行的代码更少。然而,两者都是精心编写的 C 代码,当您将其与网络延迟进行比较时,差异可能并不明显。
  • stream上游日志将只包含一个客户端 IP 地址(代理服务器的地址)。这可以通过proxy_bind指令更改,但需要额外的网络设置。另一方面X-Forwarded-For,在http设置中添加标题很简单:

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    Run Code Online (Sandbox Code Playgroud)
  • stream手动配置上游服务器需要考虑传入连接的安全性:例如Tomcat的需要加入的scheme="https"secure="true"所述上<Connector>元件。使用http代理和X-Forwarded-Proto标头,上游服务器可以决定是否在每个连接的基础上使用HTTPHTTPS使用。

设置的安全性问题非常基于意见:

  • 使用http代理,您可以限制将被代理的 URI 路径,因此您不会向公众公开您网站的管理部分,
  • 另一方面,通过在您的系统上增加额外的计算压力(而不是直接访问上游服务器),您更容易受到 DDoS 攻击。