Проблема обработки файла соединений SSH общего множителя

Отказ от ответственности: Я на самом деле не протестировал то, что я собираюсь описать, и действительно это может быть абсолютно неправильно, но Ваш вопрос так заинтриговывает это, я не могу сопротивляться искушению спроектировать ответ. :-) Кроме того, установка здесь зависит от некоторых iptables функциональность, которая могла бы существовать только на Linux.

Принятие Вас хочет соединить от Вашего ноутбука до определенного порта P1 на сервере X1 к порту P2 на сервере X2, и т.д. - я собираюсь описать, как направить трафик TCP к этим определенным server+port парам через туннель SSH.Примечание: IP-адреса X1, X2, и т.д. IP-адреса сервера, как замечено от хоста шлюза (тот Вы SSH в).

  1. Выберите некоторые неиспользованные локальные порты L1 (например, 10000), L2 (например, 10001), и т.д. Порты L1, L2..., должен быть все отличным, и их количество должно быть равно количеству отличных (Xn, Pn) server+port пары.

  2. Использовать 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 к месту назначения

  3. Теперь 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 и туннель весь Ваш трафик через это.

3
06.04.2011, 12:15
6 ответов

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

3
27.01.2020, 21:09
  • 1
    , penguin359 и Gilles для ответов. Я изучу реализацию их как можно скорее. –  Uku Loskit 09.04.2011, 13:11

Я добавляю к .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.

5
27.01.2020, 21:09
  • 1
    , но действительно ли это безопасно? –  LanceBaynes 12.05.2011, 01:45
  • 2
    @LanceBaynes, Вы могли быть более конкретными? Если соединение безопасно, аутентификация или возможно что-то еще? –  Lukasz Stelmach 12.05.2011, 10:05

Можно использовать промежуточную машину в качестве прокси. Удостоверьтесь, что это имеет 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 соединится (в двух транзитных участках, но это абсолютно прозрачно) к недоступной машине.

2
27.01.2020, 21:09

Можно использовать перенаправление портов SSH:

ssh server-a -L2022:server-b:22

После этого у Вас будет порт 2022 на клиентской машине переданный для портирования 22 из сервера-b. И можно соединиться с ним с:

ssh 127.0.0.1 -p 2022
1
27.01.2020, 21:09

Ответ следующего gelraen.

Можно использовать перенаправление портов довольно приятно когда в сочетании с .ssh/config. то есть, Вы устанавливаете команду прокси для определенного мнимого имени хоста, которое действительно только tcp-передает через уже открытый туннель:

Host imag
ProxyCommand socat - tcp-connect:localhost:2022

Затем можно просто использовать ssh imag соединяться с сервером-b:22, когда туннель произошел.

socat что я использовал, netcat должен сделать es хорошо ;)

Одна изящная вещь о ProxyCommand это, это интерполирует переменные среды - так... попробуйте.

1
27.01.2020, 21:09
ssh server1 'ssh server2'

кажется немного более простым мне. Можно даже скопировать файлы как это:

ssh server1 "ssh server2 'cat myFile'" >myFile

или

ssh server1 "ssh server2 'cat >myFile'" <myFile
0
27.01.2020, 21:09
  • 1
    Это не работает на меня; я не думаю, что ssh перенаправит stdin к дочернему процессу, таким образом, ssh server1 просто запирает ожидание ssh server2 для завершения –  Michael Mrozek♦ 11.05.2011, 22:46
  • 2
    +1, Это работает, но я не получил подсказки. –  Hai Vu 11.05.2011, 22:50
  • 3
    Если Вы хотите подсказку, необходимо использовать такую команду ssh -t server1 'ssh server2'. Но это не ответ для вопроса. Это не позволяет Вам использовать scp команда. –  Lukasz Stelmach 11.05.2011, 22:52
  • 4
    , который является странным, я делаю это все время, и он работает. Возможно, это имеет некоторое отношение к паролю по сравнению с ключевой аутентификацией? –  Kim 11.05.2011, 23:14
  • 5
    @Kim я сомневаюсь. Для меня это также работает к некоторому моменту. Я предполагаю некоторое изменение поведения по умолчанию после обновления пакета. –  Lukasz Stelmach 11.05.2011, 23:44

Теги

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