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

HAProxy: обнаруживает содержимое SSL-соединения, а затем решает пересылать его или нет

Я хотел бы иметь внешний интерфейс с HAProxy на порту 443. Этот интерфейс работает следующим образом:

Он расшифровывает содержимое соединения и проверяет:

1- Если зашифрованное содержимое соединения - ssh, то есть если первые слова пакетов SSH-2.0, затем он пересылает расшифрованные пакеты на порт 22. Я предполагаю, что такая внутренняя часть выглядит так:

backend ssh
    mode tcp
    option tcplog
    server ssh 127.0.0.1:22
    timeout server 2h

2- Если зашифрованное содержимое является чем-то еще, перенаправьте зашифрованное содержимое на порт 8443, который содержит сервер Apache с правильными ключами SNI. Если необходимо включить все правильные ключи SNI для каждого веб-адреса (чтобы не выглядеть атакой типа "человек посередине", не могли бы вы рассказать мне, как это сделать, на примере? У меня нет проблем с добавлением все ключи к HAProxy.

Зачем? Потому что у меня уже есть apache, работающий с портом 443. Я хотел бы переместить его на какой-то другой порт, не переписывая всю свою конфигурацию. Поэтому я хотел бы переместить его, например, на порт 8443, а затем сообщить HAProxy, что если соединение не SSH, просто перенаправьте все, что вы получаете, на порт 443.

Как написать такую ​​переднюю часть + бэкэнды? Пожалуйста помогите.

В качестве отправной точки я использую следующий интерфейс:

frontend ssl
    bind 0.0.0.0:443 ssl crt /home/myuser/SSL/certs.pem no-sslv3   #decrypts the connection with the keys certs.pem
    mode tcp
    option tcplog
    tcp-request inspect-delay 5s
    tcp-request content accept if HTTP
    acl client_attempts_ssh payload(0,7) -m bin 5353482d322e30   #if the decrypted information starts with SSH-2.0

    use_backend ssh if client_attempts_ssh   #forward to SSH if condition client_attempts_ssh is satisfied.
    use_backend forwardToApache if !client_attempts_ssh

Пожалуйста, спросите, требуются ли вам дополнительные сведения.

Спасибо.

Вы можете сначала использовать SNI, выбрав

site1.domain.com, 
site2.domain.com,

или

ssh.domain.com

и только если выбран ssh.domain.com, вы расшифровываете, выполняете магию ssh и отправляете его на локальный веб-сервер в незашифрованном виде, предполагая, что он должен выглядеть как обычный трафик https, но не содержит конфиденциальной информации внутри содержимого https, потому что этим занимаются site1 и site2.