Как я могу использовать HAproxy с SSL и получить заголовки X-Forwarded-For И сказать PHP, что SSL используется?

Зеркальное отражение базы данных не поддерживается SQL Reporting Services.

http://msdn.microsoft.com/en-us/library/bb510781%28SQL.90%29.aspx

20
задан 13 April 2017 в 15:14
6 ответов

You dont need to drop it all, you could just use nginx in front of haproxy for SSL support, keeping all your load balancing config. You dont even need to use nginx for HTTP if you don't want to. Nginx can pass both X-Forwarded-For and a custom header indicating SSL is in use (and client cert information if you want). Nginx config snippet that sends required information:

proxy_set_header SCHEME $scheme;      # http/https
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header CLIENT_CERT $ssl_client_raw_cert;
17
ответ дан 2 December 2019 в 20:07

Для всех, кто нашел этот вопрос, я последовал совету Охото и использовал nginx. Вот конкретные шаги, которые я использовал для выполнения этой работы на моем маршрутизаторе pfSense :

  1. Используя веб-интерфейс pfsense, я установил пакет pfsense PfJailctl и пакет «jail_template» в Система> Пакеты , чтобы я мог создать тюрьму FreeBSD для компиляции и установки nginx в системе pfsense.

  2. Я настроил тюрьму для своего сервера nginx в разделе Службы> Тюрьмы , давая в новой тюрьме то же имя хоста и IP-адрес виртуального IP-псевдонима, на котором у меня был запущен HAproxy. Привязал джейл к WAN интерфейсу. Я использовал шаблон тюрьмы по умолчанию и включил unionfs, а не nullfs.

  3. Как только тюрьма была запущена, Я зашел в ящик pfsense и запустил jls , чтобы найти номер тюрьмы. Затем я запустил jexec 1 sh , чтобы получить оболочку внутри тюрьмы. Оттуда я настроил порты BSD и установил nginx, используя:

     portsnap extract
    обновление выборки портов
    компакт-диск / usr / порты / www / nginx
    сделать установку чистой
    
  4. Затем я настроил nginx для прослушивания порта 443 и передачи всех запросов HAproxy на порт 80, включая реальный IP-адрес и статус SSL внутри заголовков HTTP. Мой usr / local / etc / nginx / nginx.conf выглядит так:

     worker_processes 1;
    
    События {
     worker_connections 2048;
    }
    
    http {
     upstream haproxy {
     сервер 209.59.186.35:80;
     }
    
     server {
     слушать 443;
     имя_сервера my.host.name default_server;
     ssl включен;
     ssl_certificate my.crt;
     ssl_certificate_key my.key;
     ssl_session_timeout 5 мин;
    
     ssl_protocols SSLv3 TLSv1;
     ssl_ciphers HIGH:! aNULL:! MD5;
     ssl_prefer_server_ciphers на;
    
     расположение / {
     proxy_pass http: // haproxy;
    
     proxy_set_header Host $ host;
     proxy_set_header X-Real-IP $ remote_addr;
     proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
    
     proxy_set_header X-Forwarded-Proto https;
     }
     }
    
    }
    
  5. Затем я модифицировал свое приложение PHP, чтобы обнаруживать функцию X-Forwarded-Proto HTTP Header:

    , используя SSL ()
    {
     возвращение (
     (isset ($ _ SERVER ['HTTPS']) && strtolower ($ _ SERVER ['HTTPS']) == 'on')
    || (isset ($ _ SERVER ['HTTP_X_FORWARDED_PROTO'])
     && strtolower ($ _ SERVER ['HTTP_X_FORWARDED_PROTO']) == 'https'));
    }
    

Итак, окончательная настройка:

(internet) ---> [ -> nginx -> haproxy -]--> (pool of apache servers)
                [    (pfSense server)  ]
12
ответ дан 2 December 2019 в 20:07

HAProxy не может подключиться к серверу SSL без использования режима raw TCP, теряя X-Forwarded -Для , но вы потенциально можете повторно зашифровать трафик с помощью stunnel для внутреннего транзита. Однако уродливо.

Мне больше нравится подход Ochoto, но с одной оговоркой: nginx - отлично работающий балансировщик нагрузки; если вы его используете, я бы сказал, используйте его для всего. Прокси-сервер входящего HTTPS-трафика для загрузки сбалансированных HTTPS-серверов - и в этом случае нет необходимости в настраиваемых заголовках для информации SSL (если вам не нужен сертификат клиента).

5
ответ дан 2 December 2019 в 20:07

Для записи, поскольку этот поток часто упоминается в отношении HAProxy + SSL, HAProxy поддерживает собственный SSL с обеих сторон, начиная с версии 1.5-dev12. Таким образом, наличие X-Forwarded-For, HTTP keep-alive, а также заголовка, сообщающего серверу о том, что соединение было выполнено через SSL, очень просто:

listen front
    bind :80
    bind :443 ssl crt /etc/haproxy/haproxy.pem
    mode http
    option http-server-close
    option forwardfor
    http-request set-header X-Forwarded-Proto https if { ssl_fc }
    server srv1 1.1.1.1:80 check ...
    ...

Я уверен, что к тому времени, когда вы что-то придумаете разные, но, по крайней мере, новые посетители теперь получат простое решение: -)

37
ответ дан 2 December 2019 в 20:07

Моя конфигурация для 1.5-dev-17 версии haproxy:

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy
        user haproxy
        group haproxy
        daemon
        #debug
        #quiet

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option  http-server-close
        retries 3
        option redispatch
        fullconn 1000        
        maxconn 1000
        timeout queue 600s
        timeout connect 5s
        timeout client 600s
        timeout server 600s

frontend http-in
        bind *:80
        bind *:443 ssl crt /usr/local/etc/ssl/certs
        reqadd X-Forwarded-Proto:\ https if { ssl_fc }
        default_backend varnish-ha
        option forwardfor
backend varnish-ha
  server hafront1 10.1.69.1:6081  minconn 100 maxqueue 10000

Он использует ACL ssl_fc . Обратите внимание, что часть параметра http-server-close очень важна.

7
ответ дан 2 December 2019 в 20:07

В прошлом году я реализовал решение для интеграции HAProxy с pfSense таким образом, чтобы оно использовало все функции HAProxy и поддерживало хорошая изоляция с pfSense. Так что это жизнеспособный вариант для производственных сред . SSL прерывается на HAProxy . Я установил HAProxy внутри тюрьмы в pfSense, используя ezjail и Ports Collection . Таким образом, очень легко поддерживать оба компонента независимо друг от друга. И вы можете установить любую версию, которую хотите. Я начал с 1.5-dev13. И с тех пор у меня он отлично работает. Я все это задокументировал.

Установка HAProxy на pfSense

Кстати, Вилли, большое спасибо за такой отличный продукт.

2
ответ дан 2 December 2019 в 20:07

Теги

Похожие вопросы