SSH через декілька хостів, що використовують ProxyCommand?


11

У мене вдома є запис у ~ / .ssh / config, який виглядає приблизно так:

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

де gateway.example.comпрацює сервер, який підключений як до загальнодоступного Інтернету, так і до внутрішньої мережі. Поле шлюзу розв'язує колонтитул і смугу, використовуючи записи в / 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 буде успішним. І звідти ви можете "nc" до baz. А якщо у внутрішній приватній мережі є інші хости поряд з "baz", ви можете просто додати їх до рядка "host baz".

Це в основному трактує хост "foo" як шлюз до "baz", так само як "шлюз" є шлюзом для "foo".

Ясно?


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). Тож мені все одно знадобиться хоча б одна сітка.
Грем

@Graham Ні. Для роботи потрібно лише клієнту, який повинен бути 5,4 або більше -W. Він покладається на код переадресації портів на стороні сервера, який набагато старший.
kasperd

1

Використовуючи приватні ключі, що зберігаються на вашому локальному комп’ютері, введіть цю команду за допомогою приватних ключових шляхів, імен користувачів оболонки та імен хостів / IP-адрес, змінених на ваші місцеві-> шлюз-> призначення ssh.

Зауважте, що ProxyCommand віддається перевазі над переадресацією агента, щоб зменшити ризик порушити автентифікацію приватного ключа (використовуючи шлюз та з'єднання локального агента ssh для компромісу подальших хостів, як якщо б у викрадача був приватний ключ), коли шлюз / джемпербокс підпадає під корінь.

Єдина команда проксі 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 

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просто працює!

Ясно?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.