Назад | Перейти на главную страницу

Пытаемся настроить прозрачный SSL-прокси с балансировкой нагрузки. Является ли это возможным?

Я провел несколько недель исследований по этой теме для проекта, и, к сожалению, я простой кодовый обезьяна, мои знания о сетях и SSL ограничены. Практически каждый поиск, который я делал до сих пор, приводил меня к сбою сервера, где я считаю, что пришел к выводу, что это может быть невозможно.

Мне в основном нужно разработать решение, которое будет принимать входящие https и беспрепятственно передавать их кластеру клонированных веб-серверов. Все они обслуживают один и тот же контент. Клиентский SSL не должен заканчиваться на балансировщике нагрузки. (https -> балансировка нагрузки -> кластер)

Так что технически мой вопрос вводит в заблуждение, обратный прокси на самом деле не нужен, но все мои решения до сих пор имели тенденцию быть каким-то прокси. Мне просто нужно прозрачное решение для балансировки нагрузки SSL.

Вот что я пробовал до сих пор.

Другие варианты, которые я исследовал, это: Squid, Charles, HAproxy, nginx, Charles, Pen и, возможно, некоторые другие, которые я не могу вспомнить, мой мозг на этом этапе практически беспорядочный.

Pen может быть лучшим решением, поскольку это TCP-трафик и не должен требовать декодирования заголовков ssl для обработки трафика, но мне было трудно найти информацию о его настройке.

Аппаратное решение не является исключением. Итак, я предполагаю, что вопросы следующие: 1. Возможно ли это? 2. Как это лучше всего сделать (предпочтительно дешево / с открытым кодом)? Спасибо!

Просто подтверждаю, вы не хотите, чтобы SSL прерывался на балансировщике нагрузки? Итак, ваш внутренний сервер будет обслуживать https.

Вот что я бы сделал. Под Ubuntu или debian.

Настройте пару серверов в качестве серверов балансировки нагрузки / прокси (для HA, если вы этого хотите). Они не обязательно должны быть супер высокого класса, но разумными.

1) Установите keepalived

sudo apt-get install keepalived

2) Настройте /etc/keepalived/keepalived.conf следующим образом:

vrrp_script chk_haproxy {
   script "killall -0 haproxy"   # verify the pid existance
   interval 2                    # check every 2 seconds
   weight 2                      # add 2 points of prio if OK
}

vrrp_instance VI_1 {
   interface eth0                # interface to monitor
   virtual_router_id 51          # Assign one ID for this route
   priority 100                  # 101 on master, 100 on backup
   nopreempt
   virtual_ipaddress {
       a.b.c.d             # the virtual IP
   }
   track_script {
     chk_haproxy
   }
}

2) Установить haproxy

sudo apt-get install haproxy

3) Установите /etc/haproxy/haproxy.cfg с такой конфигурацией:

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        maxconn 4096
        chroot /var/lib/haproxy
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    tcp
        option  dontlognull
        option  redispatch
        retries 3
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000


listen myproxy a.b.c.d:443
        mode tcp
        option tcplog
        balance leastconn

        server http1 x.x.x.a:443
        server http2 x.x.x.b:443
        server http3 x.x.x.c:443
        server http4 x.x.x.d:443

При этом используется режим TCP (без https). Если вам нужен https, вы можете установить штырь или аналогичный перед этим (на том же сервере).

a.b.c.d - ваш виртуальный IP-адрес vrrp. x.x.x.a, x.x.x.b, x.x.x.c, x.x.x.d - это IP-адреса серверов с балансировкой нагрузки. Если хотите, они могут быть безопасно защищены брандмауэром.

Если вы выбрали опцию HA, убедитесь, что вы установили эту опцию в /etc/sysctl.conf:

net.ipv4.ip_nonlocal_bind = 1

Если один из серверов haproxy выйдет из строя или служба haproxy остановлена, вмешается другой сервер. У некоторых пользователей могут быть разорванные соединения, когда это происходит, но обновление должно исправить это.

У меня это работает, хотя мои настройки немного отличаются. Я отключаю SSL на балансировщике нагрузки, а затем обслуживаю незашифрованный трафик с серверной части.