Протокол прокси и SSL
У меня есть следующая конфигурация:
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 и нет, работают хорошо, но заголовок протокола прокси не передается бэкэнду в обоих случаях
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 ответ
Ну, похоже, документация NGinx не очень хорошая...
https://www.nginx.com/resources/admin-guide/proxy-protocol/
если вы хотите, чтобы nginx принимал протокол прокси, вам нужно добавить параметр proxy_protocol в директиве listen
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;
}
}