代理协议和SSL

时间:2018-01-11 15:55:20

标签: nginx haproxy proxy-protocol

我有以下配置:

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

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

1 个答案:

答案 0 :(得分:3)

好吧,看来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;
    }
}