На этот вопрос уже есть ответ здесь:
У нас есть удаленный сервер 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 - это то, что вы ищете.
Во-первых, создайте двух новых пользователей 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-шлюз) вы можете войти на foo-server
и bar-server
без запроса пароля.
Следующим шагом является пусть клиент
аутентифицируется на сервере Xen
с открытым ключом:
Client $ ssh-keygen
Client $ ssh-copy-id -i ~/.ssh/id_rsa.pub foo@Xen
и последний шаг - заставить сервер Xen
открыть второе соединение с соответствующим внутренним сервером . Войдите в 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 на основе bonjour, uPNP, DNS / srv и рекламировать услуги через эти протоколы. См .: http://eric.windisch.us/software/zerossh/
Да, это возможно, но я не знаю ни одного SSH-сервера или прокси, который бы его поддерживал. . Однако вы не можете использовать предложенный синтаксис. Вам нужно будет закодировать желаемый хост в имени пользователя. Например, ssh -u jsmith @ foo foo.example.com
. foo.example.com
просто дает IP-адрес. Главный SSH-сервер, работающий на порту 22, должен «маршрутизировать» в зависимости от того, что идет после @ в имени пользователя.