代理协议和 SSL



我有以下配置:

HAProxy -> NGinx -> 后端

(HAProxy用于负载平衡,NGinx用于SSL终止) 配置无法更改

我正在尝试使用代理协议将源 IP 传递给后端。 在没有SSL的情况下工作,一切都可以正常工作。将SSL添加到等式中,我要么在SSL握手时失败,要么我看不到使NGinx将代理协议传递到后端的方法。

示例配置 1:

代理协议在非 SSL 连接上传递良好,但对于 SSL 连接,SSL 握手中断

哈普罗西:

listen HTTP-TCP_8090
bind :8090
server nginx nginx:8090 send-proxy
listen HTTPS-TCP_8092
bind :8092
server nginx nginx:8092 send-proxy

NGinx:

stream {
upstream some_backend {
server some_host:8090;
}
server {
listen                8090;
listen                8092 ssl;
proxy_pass            some_backend;
proxy_protocol        on;
ssl_certificate       /etc/ssl/server.crt;
ssl_certificate_key   /etc/ssl/server.key;
ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers           HIGH:!aNULL:!MD5;
ssl_session_cache     shared:SSLTCP:20m;
ssl_session_timeout   4h;
ssl_handshake_timeout 30s;
}
}

示例配置 2:

两种连接(SSL 和 SSL)都运行良好,但在这两种情况下,代理协议标头都不会传递到后端

哈普罗西:

listen HTTP-TCP_8090
bind :8090
server nginx nginx:8090 send-proxy
listen HTTPS-TCP_8092
bind :8092
server nginx nginx:8092 send-proxy

NGinx:

stream {
upstream some_backend {
server some_host:8090;
}
server {
listen                8090 proxy_protocol;
listen                8092 proxy_protocol ssl;
proxy_pass            some_backend;
ssl_certificate       /etc/ssl/server.crt;
ssl_certificate_key   /etc/ssl/server.key;
ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers           HIGH:!aNULL:!MD5;
ssl_session_cache     shared:SSLTCP:20m;
ssl_session_timeout   4h;
ssl_handshake_timeout 30s;
}
}

知道如何创建一个配置,它既知道SSL连接上的代理协议,又将标头传递到后端?

好吧,似乎NGinx文档不是很好...

https://www.nginx.com/resources/admin-guide/proxy-protocol/

如果你想让nginx接受代理协议,你需要在listen指令上添加proxy_protocol参数

listen 8090 proxy_protocol;

如果您希望nginx发送代理协议,则需要在服务器部分添加proxy_protocol指令

proxy_protocol on;

如果您希望 nginx 接受代理协议并在其另一端传递接受的标头,则需要添加两者! 听起来合乎逻辑,对吧?右。但它没有很好地记录下来。人们可以很容易地理解,当处理不是http的流量时,只需在服务器部分中设置proxy_protocol指令即可在连接的两端启用它。 所以最后这是一个有效的配置:

stream {
upstream some_backend {
server some_host:8090;
}
server {
listen                8090 proxy_protocol;
listen                8092 proxy_protocol ssl;
proxy_pass            some_backend;
proxy_protocol        on;
ssl_certificate       /etc/ssl/server.crt;
ssl_certificate_key   /etc/ssl/server.key;
ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers           HIGH:!aNULL:!MD5;
ssl_session_cache     shared:SSLTCP:20m;
ssl_session_timeout   4h;
ssl_handshake_timeout 30s;
}
}

相关内容

  • 没有找到相关文章

最新更新