2014-08-29 3 views
0

Я пытаюсь использовать SSH-туннель с несколькими переходами, который должен маршрутизировать трафик в обоих направлениях. Моя сеть конфигурации является:
ssh remoteforward over multiple hops

Мой личный снаряд на machineâ
machineâ может SSH в MachineB
MachineB может SSH в machineC
machineC локально подключен через Ethernet к Machined

Существует беговая обслуживание на machineD, где machineC отправляет UDP-пакеты в portD устройства machineD, а machineD отправляет свои ответы через UDP на portY машиныC.

я успешно сделал следующее:
(от machineâ)
SSH MachineB
(из оболочки в результате)
SSH machineC
(от полученной оболочки)
эхо "моя команда" | NC -u команда Machined PortX #send к службе Machined в
н.д. -ul Porty # Чтение результатов на порт machineC в

Я хотел бы сделать все это через туннели, так что я могу запустить пользовательские сценарии непосредственно на машине A, чтобы сформулировать служебные команды и проанализировать результаты. Я попытался следующие в моем конфигурационном файле .ssh:

host machineB 
     hostname x.x.x.x 
     user username_machineB 
     localforward 1234 machineC:22 

    host machineC 
     hostname localhost 
     user username_machineC 
     port 1234 
     localforward 1235 machineD:portX 
     remoteforward 1236 localhost:portY 

Я думал, что я мог бы сделать следующее:
(от machineâ)
SSH MachineB
(от machineâ снова)
SSH machineC
(от machineA снова)
echo "моя команда" | nc -u localhost 1235
nc -ul 1236

Но ... он, похоже, не работает. Я не вижу ожидаемых ответов на 1236. Я не совсем уверен, как отлаживать это. Я также не совсем уверен в формате этих строк «localforward» и «remoteforward» в конфигурации MachineC. Я не знаю, кто будет интерпретироваться как «localhost» при оценке этих строк. Я подозреваю, что дистанционное управление может быть отключено на machineC, но я хочу убедиться, что сначала правильно настроил все остальное. Я делаю это неправильно?

В качестве альтернативы, существует ли другой способ достижения моей конечной цели без изменения любой конфигурации на машинах B, C или D? То, что я хотел бы сделать, это использовать machineA для программной сборки сложных команд, предназначенных для machineD, и анализировать результаты, используя скрипты на machineA.

ответ

0

Вы должны думать назад, когда делаете это.

Так что в основном machC может разговаривать с портом MachD.

Таким образом, вы действительно хотите, чтобы запустить это на Махова:

SSH machC

Это ваша конечная цель, так что машина посылает и получает от machD

Теперь вы не можете добраться до machC непосредственно, это - то, где входят ваши записи ProxyCommand.

host machC 
    ProxyCommand ssh machB nc %h %p 

Итак, вы сказали, что machA может ssh без проблем. Теперь, если вы:

SSH -v machC

Вы увидите, что прыгать через эти вещи. Но на самом деле вы хотите переадресацию портов и слушателя от machC к портам на machD так что вы измените настройки machC:

host machC 
    ProxyCommand ssh machB nc %h %p 
    # first part is port on your current shell, second part is relative to machC 
    LocalForward 1234 machD:portX 
    RemoteForward 1235 localhost:portY 

так, используя ваш пример выше:

host machineB 
    hostname x.x.x.x 
    user username_machineB 

host machineC 
    ProxyCommand ssh machineB nc %h %p 
    hostname localhost 
    user username_machineC 
    localforward 1235 machineD:portX 
    remoteforward 1236 localhost:portY 

Затем вы можете использовать команду:

SSH machineC

U se -v, чтобы увидеть прыжки и туннели, и -N, если вы не заботитесь о получении оболочки. Теперь вы можете поговорить с портом 1235 вашего локального хоста, чтобы отправить в machineD portX и прочитать с 1236, чтобы прослушать номер machineC