我正在运行 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
等)和其他配置。
我试图了解这两种方法之间的优缺点,特别是我有以下问题:
这两种方法是否会泄露有关后端服务的更多信息?例如,是否
ip-for-backend-service
可见?这两种方法都能更好地保护免受攻击吗?我猜如果后端服务有缺陷,那么通过这两种方法都会被发现/被利用?
哪种选择更有效?思考该
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>
http
X-Forwarded-Proto
HTTP
HTTPS
关于该设置的安全性的问题完全是基于个人观点的:
- 使用
http
代理,您可以限制将被代理的 URI 路径,因此您不会向公众公开您网站的管理部分, - 另一方面,通过在系统上增加额外的计算压力(而不是直接访问上游服务器),您更容易受到 DDoS 攻击。