У нас есть удаленный сервер 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/
это пришла мне в голову пару лет назад, но казалось, что ответ был отрицательным.