nginx 流代理与 http 代理在 SSL 终止方面的比较

nginx 流代理与 http 代理在 SSL 终止方面的比较

我正在运行 HTTP 服务,并希望将其nginx置于 SSL 终止之前。这可以通过两种方式完成;或者作为stream代理

stream {
    server {
        listen               443 ssl;
        ssl_certificate      /certs/fullchain.pem;
        ssl_certificate_key  /certs/privkey.pem;
        proxy_pass           ip-for-backend-service:80;
    }
}

或作为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 ...;
        }
    }
}

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

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

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

  2. 这两种方法都能更好地保护免受攻击吗?我猜如果后端服务有缺陷,那么通过这两种方法都会被发现/被利用?

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

答案1

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

其余部分:

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

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
  • 需要手动配置上游服务器以考虑传入连接是否安全:例如,Tomcat 需要在元素上stream添加scheme="https"和。使用代理和标头,上游服务器可以决定是否在每个连接上使用或。secure="true"<Connector>httpX-Forwarded-ProtoHTTPHTTPS

关于该设置的安全性的问题完全是基于个人观点的:

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

相关内容