SSH через несколько хостов, используя ProxyCommand?

11

У меня дома есть запись в ~ / .ssh / config на моем компьютере:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

где gateway.example.comнаходится сервер на работе, который подключен как к общедоступному Интернету, так и к внутренней сети. Поле gateway разрешает foo и bar, используя записи в / etc / hosts.

Моя проблема в том, что мне нужно достать ящик, который находится на другой стороне foo. Давайте назовем это «баз». Хост "baz" находится в другой частной сети, к которой подключен foo, но не к той, к которой подключен "шлюз".

Я пытался использовать это:

host baz
    ProxyCommand ssh -x -a -q gateway/example.com ssh foo nc %h 22

Но это не работает, и я немного не в себе. Как мне это сделать?

Я не думаю, что это должно иметь значение, но я делаю это в Ubuntu 10.

Грэхем
источник

Ответы:

13

Легко.

Предположим, что следующие настройки сети:

пример настройки сети

Вы должны быть в состоянии использовать файл ~ / .ssh / config, который выглядит примерно так:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

host baz
    ProxyCommand ssh -x -a -q foo nc %h 22

Идея заключается в том, что ваш SSH действительно знает , как добраться до «Foo», так что SSH будет успешным. И оттуда, вы можете «нк» на базу. И если во внутренней частной сети помимо «baz» есть другие хосты, вы можете просто добавить их в строку «host baz».

Это в основном рассматривает хост «foo» как шлюз к «baz», так же как «шлюз» является шлюзом к «foo».

Ясно?

Ghoti
источник
13

Что касается ответа Ghoti'S: вместо того , чтобы использовать Netcat ( "ssh ... nc %h 22"), начиная с OpenSSH 5.4, вы можете сделать это непосредственно: "ssh -W %h:22 ...". Таким образом, вам не нужно беспокоиться о том, установлен ли netcat в нужном месте.

Ричард Э. Сильверман
источник
1
Отличный момент, спасибо. Это старый вопрос, но я мог бы также уточнить, что во время работы Ubuntu на моей рабочей станции серверным «шлюзом» был старый Busybox Linux с OpenSSH 5.3, а серверами «foo» и «baz» были FreeBSD (OpenSSH). 5,4). Так что в любом случае мне нужен был бы хотя бы один netcat.
Грэм
@ Грэм Нет. Это только клиент, который должен быть 5,4 или выше, -Wчтобы работать. Он опирается на код переадресации портов на стороне сервера, который намного старше.
Касперд
1

Используя закрытые ключи, хранящиеся на вашем локальном компьютере, введите эту команду с частными путями к ключам, именами пользователей оболочки и именами хостов / IP-адресами, измененными в соответствии с вашими локальными-> шлюзами-> назначениями ssh.

Обратите внимание, что ProxyCommand предпочтительнее, чем переадресация агента, чтобы снизить риск компрометации аутентификации с помощью закрытого ключа (использование шлюза и локального соединения с агентом ssh для компрометации других хостов, как если бы у угонщика был личный ключ), когда шлюз / перемычка перехвачена с помощью root-перехвата.

Одиночная команда для прокси SSH на сервере (храните оба секретных ключа на локальном компьютере):

sudo ssh -i dest_private_key.pem -o "ProxyCommand ssh -W %h:%p -i gate_private_key.pem gate_user@gate_IP" dest_user@dest_IP 
openyk
источник
0

Это то, что я делаю, чтобы выйти из защищенной сети в Интернет.

Я использую свой ноутбук для работы с кодом при сборке . Поскольку сборка ограничена доступом к Интернету, чтобы клонировать репозиторий с github.com, мне сначала нужно перейти на панель инструментов , которая также не имеет доступа к Интернету. Но он может получить доступ к gw , который имеет Интернет.

Как это:

Схема прыжков по SSH

Мой .ssh/configна стройке :

Host gw
  ProxyCommand ssh -A -W %h:%p toolbox

Host github.com
  ProxyCommand ssh -A -W %h:%p gw

Объяснение.

  1. Точка зрения от сборки . На других серверах нет конфигураций.
  2. Во-первых, я заявляю, что для того, чтобы добраться до gw, вам нужно сделать это через панель инструментов .
  3. Во-вторых, я заявляю, что чтобы попасть на github.com , вам нужно сделать это через gw . Внутренне SSH использует предыдущее правило.
  4. В конечном итоге, git clone git@github.com:aRepo/Thereпросто работает!

Ясно?

Яри ​​Туркиа
источник