Маршрутизация трафика SSH на основе домена с помощью HAProxy

4864
Constantin Jacob

В настоящее время я строю свой собственный небольшой кластер дома и пытаюсь заставить SSH-маршрутизацию (балансировку нагрузки) работать с HAProxy. Я понял, как маршрутизировать HTTP-трафик, но я борюсь с SSH. Я не знаю достаточно о протоколе TCP, чтобы сразу узнать, что мне нужно искать, чтобы я мог определить, как запрашивать соединения для чего-то вроде хоста (не уверен, что это вообще где-то в соединении) или просто что-то, что идентифицирует какой сервер я хочу в SSH.

В документации снова и снова упоминается трафик SSH, поэтому я мог что-то пропустить. Я не хочу использовать разные порты и маршрутизировать туда и обратно, используя разные порты, потому что они могут быть нестандартными, поэтому заблокированы в общедоступных сетях или других вещах, которые ограничивают меня.

Моя текущая настройка выглядит так:

Запрос на мои домены (или IP) -> Маршрутизатор -> Переадресация NAT в зависимости от порта -> HAProxy, прослушивающий этот порт -> теперь должен идентифицировать трафик, который выделен для определенного сервера, и трафик прокси к нему.

Редактировать: Поскольку Cha0s прояснилось, это просто невозможно с SSH (или аналогично).

Если вас интересует другой метод, ответ Свена дает хорошее представление о том, как сделать что-то похожее, но при этом разные субдомены разрешают разные публичные статические IP-адреса.

2
Почему вы хотите маршрутизировать трафик SSH и почему HA для этого? 030 9 лет назад 0
Потому что у меня есть несколько машин (Mac Mini, делающих электронную почту и прочее RasPberry Pi 2 с Gitlab) за один и тот же IP. Это статический IP, за который я плачу, но у меня нет возможности получить второй. Я ограничен возможными IP-адресами Constantin Jacob 9 лет назад 0

2 ответа на вопрос

2
Sven

Я считаю, что вы смешиваете условия.

Распределение нагрузки обычно означает, что вы подключаетесь к одному хосту ( example.com) и позволяете балансировщику нагрузки распределять все подключения к одному или нескольким внутренним хостам, обычно без контроля пользователя, к какому фактическому хосту вы подключаетесь. Это легко сделать для SSH различными способами.

Некоторые протоколы, такие как HTTP с Hostзаголовком, могут дать балансировщику нагрузки больше информации, чтобы решить, на какие серверы бэкэнда должно быть направлено соединение (например, example.comмаршрутизируется на aи b, в то время как example.orgмаршрутизируется на cи d).

У SSH нет такого поля, и, следовательно, это невозможно сделать с помощью балансировщика нагрузки и только одного IP-адреса. Это делает LB непригодным для этой задачи.

Как правило, это решается путем использования хоста в качестве хоста прокси / шлюза / перехода SSH и инструктирует ваших клиентов SSH использовать его как таковой. Если вы используете OpenSSH, поместите следующее в ваших клиентов~/.ssh/config

Host *.internal.lan ProxyCommand ssh -q -A -x proxy.example.com -W %h:%p 

Теперь, если вы подключитесь к именам, указанным в Hostстроке, ваш SSH-клиент сначала подключится proxy.example.com(который должен указывать на ваш общедоступный IP-адрес) и будет использовать его в качестве шлюза для перенаправления на фактический компьютер (используйте переадресацию порта NAT на порт 22). вашего фактического прокси-сервера, если применимо). Обратите внимание, что proxy.example.comдолжно быть в состоянии решить *.internal.lan. Для этого либо установите DNS-сервер, либо используйте внутренний, предлагаемый вашим маршрутизатором.

После этого из внешней сети, к которой вы подключаетесь, чтобы nas.internal.lanполучить доступ к вашему NAS (или и raspi.internal.lanт. Д.), И изнутри вашей локальной сети, которую вы просто используете nasили raspi(таким образом, соединение является прямым, а не через шлюз).

Другой способ, учитывая тот факт, что вы используете NAT:

Создайте переадресацию портов в вашем маршрутизаторе NAT, например, как

Port 2210 -> internal host1, port 22 Port 2211 -> internal host2, port 22 

и затем поместите в своих клиентов следующее ~/.ssh/config:

Host host1.example.com  Port 2210  Host host2.example.com  Port 2211 

и убедитесь, что host1/2.example.comоба указывают на ваш внешний IP-адрес.

Затем вы можете просто подключиться через SSH к, host1.example.com и OpenSSH подключится к порту 2210, который перенаправляется на ваш внутренний хост1 шлюзом NAT.

Оба метода работают в вашем сценарии.

Спасибо за ответ. Если вы посмотрите на мой последний комментарий под моим вопросом, вы поймете, почему это невозможно для меня. В любом случае я буду приветствовать ваш ответ, так как он дает хорошую информацию. Constantin Jacob 9 лет назад 0
Это неправда. У меня есть аналогичная настройка, и она работает безупречно. Sven 9 лет назад 0
Но если все эти субдомены и хосты разрешают один и тот же общедоступный IP-адрес, у меня все еще есть проблема, заключающаяся в том, что я не могу идентифицировать трафик, кроме портов, которые мне не нужны по причинам, которые я уже указал (желание использовать стандартные порты и т. Д. ..) Constantin Jacob 9 лет назад 0
Я показал вам способ обойти эту проблему. Это легко сделать, и я постоянно использую его для подключения к сотням машин, как на работе, так и дома. Если вы настаиваете, что это работает как с HTTP, вам не повезло. Sven 9 лет назад 0
Да, но ваш первый вариант основан на наличии нескольких публичных IP-адресов. Например, несколько VPS со всеми своими IP. И ваш второй вариант предлагает NAT и переадресацию портов, которые я не хочу использовать из-за блокировки некоторых странных портов (например, на моей работе). Поэтому у меня нет возможности добраться до. Constantin Jacob 9 лет назад 0
Поверьте, это работает только с одним IP-адресом. Я использую это ежедневно. Sven 9 лет назад 0
Хорошо. Я просто не был уверен, что мы оба упускаем очки друг друга. Я попробую ваши настройки сегодня вечером Constantin Jacob 9 лет назад 1
Это действительно сработало. Теперь я понимаю, что вы говорили. Читайте на ProxyCommand. Constantin Jacob 9 лет назад 0
Я постараюсь отредактировать свой ответ так, чтобы люди смотрели на ваш ответ, пытаясь его понять. Сначала мне было немного трудно понять ваш ответ. Спасибо, что придерживаетесь своего мнения и заставляете меня попробовать! : D Constantin Jacob 9 лет назад 0
0
Cha0s

AFAIK, вы не можете сделать это на основе домена. HTTP может работать так, потому что у него есть специальный Hostзаголовок, который браузеры (в данном случае обратные прокси) могут понимать и принимать решения на его основе.

На других протоколах TCP я не знаю ничего подобного. Определенно не по SSH.

Так что SSH маршрутизация (балансировка нагрузки) определенно невозможна? Constantin Jacob 9 лет назад 0

Похожие вопросы