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

«Виртуальные хосты» для SSH

У нас есть удаленный сервер Xen, на котором работает много гостевых машин (в Linux), и доступно всего несколько IP-адресов.

Каждая гостевая машина должна быть доступна по SSH напрямую из внешнего мира.

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

Итак, чтобы получить доступ к машине с именем foo, нужно сделать следующее:

$ ssh foo.example.com -p 12345

... И для доступа к машине с именем bar:

$ ssh bar.example.com -p 12346

Обе foo.example.com и bar.example.com указывают на тот же IP.

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

$ ssh foo.example.com hostname # prints foo
$ ssh bar.example.com hostname # prints bar

Обратите внимание, что я знаю о .ssh/config и соответствующие решения для настройки на стороне клиента, мы используем это сейчас. Этот вопрос касается решения с нулевой конфигурацией клиента.

                         foo  
                        /
Client ----- Xen server
                        \
                         bar

Похоже, что SSH Gateway - это то, что вы ищете.

Сначала создайте 2 новых пользователя foo, bar на сервере Xen:

Xen # useradd foo
Xen # useradd bar

Создайте пары ключей и скопируйте открытый ключ в foo-server и bar-server:

Xen # su - foo
Xen $ ssh-keygen
Xen $ ssh-copy-id -i ~/.ssh/id_rsa.pub foo-user@foo-server

(Сделайте то же самое для bar пользователь)

Теперь с сервера Xen (SSH Gateway) вы можете войти в foo-server и bar-server без запроса пароля.

Следующий шаг - позволить Client подтвердить подлинность Xen server с открытым ключом:

Client $ ssh-keygen
Client $ ssh-copy-id -i ~/.ssh/id_rsa.pub foo@Xen

и последний шаг - сделать Xen server открыть второе соединение с соответствующим внутренним сервером. Доступ к Xen, переключитесь на foo, Открой ~/.ssh/authorized_keys файл и измените:

ssh-rsa AAAAB3N...== user@clienthost

кому:

command="ssh -t -t foo-user@foo-server" ssh-rsa AAAAB3N...== user@clienthost

Результат выборки:

$ ssh foo-user@Xen
Last login: Thu Nov 10 13:02:25 2011 from Client
$ id
uid=500(foo-user) gid=500(foo-user) groups=500(foo-user) context=user_u:system_r:unconfined_t
$ exit
logout

Connection to foo-server closed.
Connection to Xen closed.

$ ssh bar-user@Xen
Last login: Thu Nov 10 11:28:52 2011 from Client
$ id
uid=500(bar-user) gid=500(bar-user) groups=500(bar-user) context=user_u:system_r:unconfined_t
$ exit
logout

Connection to bar-server closed.
Connection to Xen closed.

Да, это возможно, но я не знаю ни одного SSH-сервера или прокси, который бы его поддерживал. Однако вы не можете использовать предложенный синтаксис. Вам нужно будет закодировать желаемый хост в имени пользователя. Например ssh -u jsmith@foo foo.example.com. В foo.example.com просто дает IP-адрес. Главный SSH-сервер, работающий на порту 22, должен будет «маршрутизировать» в зависимости от того, что идет после @ в имени пользователя.

В качестве решения вы можете использовать клиент / оболочку ssh на основе bonjour, uPNP, DNS / srv и рекламировать услуги через эти протоколы. Видеть: http://eric.windisch.us/software/zerossh/

это пришла мне в голову пару лет назад, но казалось, что ответ был отрицательным.