действительно возможно маршрутизировать соединения TCP на основе имен хостов, полученных в запросах TCP через реализацию SNI.
Да, это было бы верно, но только если выполняются также все следующие условия:
- В протоколе клиент сначала говорит, а
- TLS согласовывается клиентом сразу после первоначального подключения, а
- SNI представлен клиентом при подтверждении связи TLS.
Но с протоколом клиент / сервер MySQL ничего из этого не является правдой.
В протоколе клиент / сервер MySQL сначала сервер говорит & sup1 ;, идентифицируя себя и свои возможности (в том числе поддерживает ли он TLS), а затем клиент отвечает собственным списком возможностей, в том числе желает ли он согласовывать TLS, и наконец, начинается согласование TLS без права доступа к SNI, поскольку клиент и сервер уже подключены.
tl; dr: Протокол клиент / сервер MySQL не может быть маршрутизирован через прокси-сервер любого типа на основе имен хостов. Структура протокола делает это невозможным, потому что нет способа передать имя хоста.
Единственная опция для маршрутизации на основе имен - HAProxy иметь несколько IP-адресов, с отдельным разделом frontend
или listen
, связанным с каждым адресом, и имена хостов, каждый из которых указывает на один из этих адресов.
& sup1; сервер говорит первым указывает, какая сторона соединения отправляет первую полезную нагрузку после установления соединения. Конечно, клиент начинает процесс, который устанавливает соединение, но как только канал открыт, в протоколе MySQL первая полезная нагрузка в любом направлении поступает с сервера. Другие протоколы, такие как SMTP, делают то же самое - SMTP-сервер начинает диалог с чем-то вроде 220 mail.example.com ESMTP service ready
. Это отличается от протоколов, таких как HTTP, где клиент говорит первым. Когда соединение установлено, сервер ничего не отправляет, ожидая, что клиент отправит что-то вроде GET / HTTP/1.1\r\nHost: example.com\r\n\r\n
. В HTTPS, когда соединение установлено, сервер ничего не отправляет, и клиент инициирует рукопожатие TLS.