2

我有以下配置:

HAProxy -> NGinx -> 后端

(HAProxy用于负载均衡,NGinx用于SSL终止)配置不可更改

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

示例配置1:

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

HAProxy:

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)都运行良好,但代理协议标头在这两种情况下都没有传递到后端

HAProxy:

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 连接上的代理协议,又可以将标头传递给后端?

4

1 回答 1

4

好吧,看来NGinx文档不是很好......

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

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

listen 8090 proxy_protocol;

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

proxy_protocol on;

如果您希望 nginx 接受代理协议并在其另一端传递接受的标头,您需要添加两者!听起来合乎逻辑,对吧?正确的。但它没有很好的记录。可以很容易地理解,在处理不是 http 的流量时,只需在 server 部分中设置 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;
    }
}
于 2018-01-12T00:19:37.553 回答