[PATCH] Support of proxy v2 protocol for NGINX stream module
Maxim Dounin
mdounin at mdounin.ru
Fri Apr 9 14:17:49 UTC 2021
Hello!
On Fri, Apr 09, 2021 at 04:26:52PM +0300, Vasiliy Soshnikov wrote:
[...]
> + /** SSL TLVs */
> +
> +#if (NGX_STREAM_SSL)
> +
> + data = NULL;
> + data_len = 0;
> +
> + tlv = (ngx_tlv_ssl_t *) (buf + len);
> + ngx_memzero(tlv, sizeof(ngx_tlv_ssl_t));
> +
> + tlv->tlv.type = NGX_PROXY_PROTOCOL_V2_TYPE_SSL;
> + pos = buf + len + sizeof(ngx_tlv_ssl_t);
> +
> + tlv->client |= NGX_PROXY_PROTOCOL_V2_CLIENT_SSL;
> +
> + if (c->ssl != NULL) {
> +
> +#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
> + SSL_get0_alpn_selected(c->ssl->connection, &data, &data_len);
> +
> +#ifdef TLSEXT_TYPE_next_proto_neg
> + if (data_len == 0) {
> + SSL_get0_next_proto_negotiated(c->ssl->connection,
> + &data, &data_len);
> + }
> +#endif
> +
> +#else /* TLSEXT_TYPE_next_proto_neg */
> + SSL_get0_next_proto_negotiated(c->ssl->connection, &data,
> &data_len);
> +#endif
> +
> + if (data_len) {
> +
> + pos = ngx_copy_tlv(pos, last,
> + NGX_PROXY_PROTOCOL_V2_TYPE_ALPN,
> + (u_char *) data, (uint16_t) data_len);
> + if (pos == NULL) {
> + return NULL;
> + }
> + }
> +
> + value = (u_char *) SSL_get_version(c->ssl->connection);
> + if (value != NULL) {
> +
> + pos = ngx_copy_tlv(pos, last,
> + NGX_PROXY_PROTOCOL_V2_SUBTYPE_SSL_VERSION,
> + value, ngx_strlen(value));
> + if (pos == NULL) {
> + return NULL;
> + }
> + }
[...]
Thanks for the patch.
For the record, as discussed privately: this is more or less
proof-of-concept for the ticket #1639[1], used for tests with
RabbitMQ[2]. A committable solution probably needs something similar
to proxy_set_header / fastcgi_param to control TLVs sent to the
upstream server instead of hardcoding them.
[1] https://trac.nginx.org/nginx/ticket/1639
[2] https://www.rabbitmq.com/networking.html#proxy-protocol
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx-devel
mailing list