Отказ от ответственности: Я на самом деле не протестировал то, что я собираюсь описать, и действительно это может быть абсолютно неправильно, но Ваш вопрос так заинтриговывает это, я не могу сопротивляться искушению спроектировать ответ. :-) Кроме того, установка здесь зависит от некоторых iptables
функциональность, которая могла бы существовать только на Linux.
Принятие Вас хочет соединить от Вашего ноутбука до определенного порта P1 на сервере X1 к порту P2 на сервере X2, и т.д. - я собираюсь описать, как направить трафик TCP к этим определенным server+port парам через туннель SSH.Примечание: IP-адреса X1, X2, и т.д. IP-адреса сервера, как замечено от хоста шлюза (тот Вы SSH в).
Выберите некоторые неиспользованные локальные порты L1 (например, 10000), L2 (например, 10001), и т.д. Порты L1, L2..., должен быть все отличным, и их количество должно быть равно количеству отличных (Xn, Pn) server+port пары.
Использовать iptables
перенаправить пакеты, направленные к Xn:Pn на localhost:Ln
iptables-t туземный-A ПРОИЗВОДЯТ-p tcp-d X1 - dport P1-j DNAT - localhost:L1 iptables-t к месту назначения туземный ВЫХОДНОЙ-p tcp-d X2-A - dport P2-j DNAT - localhost:L2 к месту назначения
Теперь SSH к шлюзу, с помощью -L
опция к туннельному трафику от localhost:Ln до (Xn, Pn):
ssh gateway.server-L localhost:L1:X1:P1-L localhost:L2:X2:P2...
Пример:
# access webserver.intranet (port 80) through localhost:10080
iptables -t nat -A OUTPUT -p tcp -d webserver.intranet --dport 80 -j DNAT --to-destination localhost:10080
ssh gateway.server -L locahost:10080:webserver.intranet:80
Протесты:
это только работает на TCP, если это работает вообще...
если Вы хотите получить доступ больше чем к одному серверу, это - вероятно, меньше работы для установки VPN
могло бы все еще быть легче использовать SSH -D
опция моделировать прокси SOCKS и туннель весь Ваш трафик через это.
Да, перенаправление портов SSH может использоваться в этом случае, но можно также получить предупреждения о недопустимых или неправильных ключах хоста при попытке этого. Некоторые клиенты SSH как OpenSSH отслеживают ключи хоста SSH доменом или IP только и не включают номер порта с ним. PuTTY, кажется, записывает номер порта с ключом хоста и не должен страдать от этой проблемы пока Ваше последовательное, с которыми номерами портов Вы используете для каждого хоста. Я рекомендовал бы добавить перенаправление портов к сохраненной сессии в PuTTY. Можно затем также сохранить дополнительные сессии для различных удаленных хостов как сохраненные сессии и использование это с pscp/psftp. Можно запустить с любого высокого порта числа для передачи такой как 2 220 и подняться одним оттуда для каждого хоста, который необходимо передать через промежуточный хост. Добавьте к сохраненной сессии для intermediate
локальный порт вперед как порт 2220
и место назначения remote1:22
и порт 2221
с местом назначения remote2:22
для удаленных хостов remote1
и remote2
Затем создайте сессии для remote1
с местом назначения localhost
и порт SSH 2220
и сессия для remote2
с местом назначения localhost
и порт SSH 2221
. Использовать сессии с использованием pcsp/psftp @session-name
для хоста.
Проблема происходит, когда любой, Вы так или иначе связали ключ хоста SSH с localhost и Вы пытаетесь соединиться с локальным портом, это передается другому компьютеру. С OpenSSH я решил эту проблему при помощи HostKeyAlias
. Я добавил записи в мой ~/.ssh/config
как это:
Host intermediate
HostName intermediate.example.org
LocalForward 2220 remote1.example.org:22
LocalForward 2222 remote2.example.org:22
Host remote1
HostName localhost
Port 2220
HostKeyAlias remote1.example.org
Host remote2
HostName localhost
Port 2221
HostKeyAlias remote2.example.org
Моя предпочтительная фиксация, тем не менее, была, когда я развернул IPv6 на своем доме и сети работы, и я больше не должен был волноваться о соединении с промежуточным сервером сначала для получения до моего конечного места назначения.
Я добавляю к .ssh/config
такое определение:
Host SERVER-A
ProxyCommand ssh SERVER-B nc -q0 %h %p 2> /dev/null
и затем просто используйте ssh
или scp
нормальным способом:
ssh user@SERVER-A
или
scp file.tar.gz user@SERVER-A:~
Во время установки соединения с SERVER-A
ssh библиотека находит их конфигурацией. Это говорит, что ssh должен использовать некоторую команду прокси для соединения. Прокси управляет подключением с SERVER-B
и затем выполнитесь nc
команда (netcat), которые направляют все выходные данные с команды прокси на данный сервер для данного порта, определять %h
и %p
параметры.
Такая конструкция также позволяет Вам использовать ключевую аутентификацию. Вы имеете, просто копируют Вашу общественность с клиентской машины на обоих серверах: SERVER-A
и SERVER-B
.
Такая конфигурация также совместима с приложением других, которые пользуются ssh библиотекой, например rsync
, sftp
или клиенты GUI.
Можно использовать промежуточную машину в качестве прокси. Удостоверьтесь, что это имеет netcat (nc
) установленный. Вставьте следующие строки Ваш ~/.ssh/config
(foo
псевдоним для недоступной машины, foo.example.com
его имя, как замечено от промежуточной машины, и gateway.example.com
промежуточная машина):
Host foo
HostName foo.example.com
ProxyCommand ssh gateway.example.com nc %h %p
Затем ssh foo
соединится (в двух транзитных участках, но это абсолютно прозрачно) к недоступной машине.
Можно использовать перенаправление портов SSH:
ssh server-a -L2022:server-b:22
После этого у Вас будет порт 2022 на клиентской машине переданный для портирования 22 из сервера-b. И можно соединиться с ним с:
ssh 127.0.0.1 -p 2022
Ответ следующего gelraen.
Можно использовать перенаправление портов довольно приятно когда в сочетании с .ssh/config
. то есть, Вы устанавливаете команду прокси для определенного мнимого имени хоста, которое действительно только tcp-передает через уже открытый туннель:
Host imag
ProxyCommand socat - tcp-connect:localhost:2022
Затем можно просто использовать ssh imag
соединяться с сервером-b:22, когда туннель произошел.
socat
что я использовал, netcat
должен сделать es хорошо ;)
Одна изящная вещь о ProxyCommand
это, это интерполирует переменные среды - так... попробуйте.
ssh server1 'ssh server2'
кажется немного более простым мне. Можно даже скопировать файлы как это:
ssh server1 "ssh server2 'cat myFile'" >myFile
или
ssh server1 "ssh server2 'cat >myFile'" <myFile
ssh server1
просто запирает ожидание ssh server2
для завершения
– Michael Mrozek♦
11.05.2011, 22:46
ssh -t server1 'ssh server2'
. Но это не ответ для вопроса. Это не позволяет Вам использовать scp
команда.
– Lukasz Stelmach
11.05.2011, 22:52