Я провел несколько недель исследований по этой теме для проекта, и, к сожалению, я простой кодовый обезьяна, мои знания о сетях и SSL ограничены. Практически каждый поиск, который я делал до сих пор, приводил меня к сбою сервера, где я считаю, что пришел к выводу, что это может быть невозможно.
Мне в основном нужно разработать решение, которое будет принимать входящие https и беспрепятственно передавать их кластеру клонированных веб-серверов. Все они обслуживают один и тот же контент. Клиентский SSL не должен заканчиваться на балансировщике нагрузки. (https -> балансировка нагрузки -> кластер)
Так что технически мой вопрос вводит в заблуждение, обратный прокси на самом деле не нужен, но все мои решения до сих пор имели тенденцию быть каким-то прокси. Мне просто нужно прозрачное решение для балансировки нагрузки SSL.
Вот что я пробовал до сих пор.
Apache 2.4.x mod_proxy: работает для https -> прокси -> http -> кластер. Полное решение ssl не удалось.
Pound: работает https -> proxy -> https очень хорошо, однако сервер конечной точки получает сертификат / информацию сервера фунта. Мне нужен сертификат клиентов, потому что серверы конечных точек должны иметь возможность отзыва. (Отзыв не может быть обработан прокси-сервером / MITM из соображений безопасности).
Другие варианты, которые я исследовал, это: 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 на балансировщике нагрузки, а затем обслуживаю незашифрованный трафик с серверной части.