LINUX.ORG.RU
ФорумAdmin

Haproxy -> Haproxy -> nginx

 ,


1

2

Всем привет. Столкнулся с такой проблемой. Было принято решение использовать схему соединения для доступа к сайтам Haproxy1/tcp -> Haproxy2/https -> nginx/http

Haproxy1/tcp - выступает в качестве балансировщика, сервер находится в первом облаке.

Haproxy2/https - занимается https и гонит трафик на nginx. в этом случае haproxy и nginx находятся в локальной сети ДЦ.

Задача реализовать данную статью (https://habr.com/ru/post/247297/). Только у меня как писал выше в схеме еще один прокси сервер.

Нужна именно Балансировка на транспортном уровне (Layer 4): передача TCP-трафика с HAProxy на Nginx.

Сложность сейчас в том, что при настройке сервера haproxy1 сайт работает нормально, передает tcp трафик и все круто, но на сервере harproxy2 я получаю IP не юзера, который зашел на сайт, а самого haproxy1

defaults
        log     global
        option  redispatch
        option  tcp-smart-accept
        option  tcp-smart-connect
        retries 3
        maxconn 2000
        timeout connect 5000
        timeout check   3000
        timeout client  50000
        timeout server  50000

frontend https_frontend_ssl_pass
        mode tcp
        bind *:443
        default_backend web_server_tcp

backend web_server_tcp
        mode tcp
        balance roundrobin
        server s1_tcp 2.2.2.2:443 check
        #server s2_tcp 2.2.2.2:443 send-proxy check

Проблема заключается в последней строчке, при использовании send-proxy сайт падает, а в логах haproxy2 получаю ошибку.

https_sites/1: SSL handshake failure

В моем случае я так понимаю, нужно докрутить Haproxy2/https. Но не знаю в какую сторону смотреть. В документации пока ответа не нашел. Настройка Haproxy2/https

frontend http_sites
        mode    http
        option  httplog
        option  dontlognull
        bind *:80 process 1

        acl letsencrypt-acl path_beg /.well-known/acme-challenge/
        redirect scheme https code 301 if !letsencrypt-acl

        use_backend letsencrypt-backend if letsencrypt-acl

        default_backend nginx-backend

frontend https_sites
        mode    http
        option  httplog
        option  dontlognull
        bind *:443 ssl crt /etc/haproxy/ssl  process 1

        http-request set-header X-Forwarded-Proto https

        default_backend nginx-backend

backend nginx-backend
        mode    http
        option forwardfor
        option httpchk GET /
        http-check send hdr Host localhost

        server nginx-1 127.0.0.1:8080 weight 50 maxconn 1000 check inter 4s


backend letsencrypt-backend
        mode    http
        server letsencrypt 127.0.0.1:8888

в случае tcp-балансировки тебе нужно использовать tproxy, а для этого нужно правильно строить сегментацию сети, просто по белым адресам покидать трафик не получится, нужны туннели и немножко policy-based роутинга

гугли «haproxy tproxy»

Ну или всё-таки совмести haproxy1 и haproxy2, там можно на прикладном уровне через заголовки http всё разрулить

Pinkbyte ★★★★★ ()
Последнее исправление: Pinkbyte (всего исправлений: 1)

Сейчас запустил haproxy -> nginx На haproxy просто прописал 80 и 443 порт в режиме tcp на бэкенд nginx по тем же портам. IP посетителей сайтов получаю, сертификаты новые генерит и обновляет банально через certbot –nginx Буду дальше разбираться, по ходу дела распишу позже

shift-47 ()