Переслати SSH-трафік через середню машину


110

SSH тунелювання мене дуже бентежить. Мені цікаво, чи можу я це зробити в Linux.

У мене 3 машини ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

Тож я можу SSH від A -> B і від B -> C, але не від A -> C.

Чи є спосіб встановити тунель SSH від A до B, тож коли я запускаю інші команди SSH, вони просто працюють з моєї локальної машини A? Я в основному намагаюся клонувати git repo з роботи додому (і не можу встановити git на машині B).

Крім того, після налаштування .. Як я можу це також зняти?


я вважаю, що десь є повторне запитання, але сьогодні мій пошук-фу слабкий.
шарлатаний кіхот



Якщо ви працюєте з Linux на машині A, використовуйте інструмент під назвою sshuttle, який дозволяє вибірково пересилати весь трафік для C через тунель A-> B (якщо припустимо, що C видно з B).
Joat

Відповіді:


128

Розмістіть це у своєму .ssh/configфайлі на хостіAA (детальніше див. Man 5 ssh_config ):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

Тепер наступна команда автоматично пройде через хостB

hostA:~$ ssh hostC

Можливо, ви хочете додати такі параметри, як -oCiphers=arcfourі -oClearAllForwardings=yesпришвидшити роботу, оскільки загортання sshвсередину sshобчислювально дорожче, а додаткові зусилля та обгортку не потрібно бути настільки безпечними, коли він тунелює вже зашифрований трафік.


Якщо ви використовуєте OpenSSH раніше, ніж 5.3, -Wопція недоступна. У цьому випадку ви можете реалізувати вище, використовуючи netcat ( nc):

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB

1
Це геніально! Дякую. Це вирішує проблему, яка їсть мене протягом останніх 2 днів: hostC сидить за брандмауером і має дані, до яких я хочу отримати доступ від hostA, ноутбука, який може бути в будь-якій точці світу. hostB також знаходиться за тим же брандмауером з hostC, але він має порт SSH, відкритий для світу. Таким чином, я можу ssh від hostC -> hostB. Я встановлюю зворотний тунель SSH між hostC і hostB, тому я можу також ssh з hostB -> hostC (пересилається через localhost). З вашою хитрістю я можу перейти від hostA -> hostC! Вона працює безперебійно з SCP & Fugu на OSX! Дякую!
AndyL

-WВаріант слід використовувати замість ncопції.
vy32

Який SSH повинен підтримувати -W, лише той, на хостіA (походження) або також на хостіБ (середня машина)?
gioele

Для інформації, якщо у вас є декілька хостів, до яких потрібно звернутися через один і той же hostB, можна оголосити кілька Host hostCрядків над цим, ProxyCommandщо дозволяє легко отримати доступ до кількох хостів через середній сервер.
fduff

7

Редагувати: Це неправильний підхід. Див. Замість відповіді ефемія . Ця відповідь спрацює, але потенційно менш безпечна і, безумовно, менш приголомшлива.

Здається, ви хочете знайти таке рішення:

ssh -L localhost:22:machinec:22 machineb

Це надасть вам оболонку machineb. Залиште це в спокої; мінімізувати вікно терміналу.

Тепер, коли ви робите з'єднання SSH , щоб localhostви на самому справі будете підключені до , machinecпереглядаючи machineb. Коли ви закінчите з тунелем, просто закрийте термінал, в якому ви виконали вищевказану команду.

Зауважте, що для запуску команди вам знадобляться права суперпользователя.


+1 Спасибі Веслі. Це справжня відповідь на тунелінг ssh. Ось стаття про це: securityfocus.com/infocus/1816
Larry K

3
В цілому це досить зло ... але мені довелося це робити з давніми версіями OpenSSH або іншими ssh-клієнтами. Ви можете вибрати якийсь високий порт, як 8022: таким чином він не заважає службі ssh на localhost і не вимагає запуску як root. Просто додайте -p 8022до своїх команд ssh. І з git це легко розум: за допомогою URI ssh://localhost:8022/path/to/repo.git.
ефемієнт

3

Здається, що ви хочете псевдонім оболонки на A, який спричиняє виникнення ssh на C

  1. Я припускаю, що на A ви можете ввести ssh me @ b "ssh me @ c ім'я хоста" та повернути "C"
  2. Створіть псевдонім sshc, який розширює sshc foo в ssh me @ b "ssh me @ c foo"
  3. Щоб дізнатися точний синтаксис створення псевдоніма, зверніться до superuser.com

1
-tЯкщо вам потрібна інтерактивна оболонка, вам, можливо, доведеться додати до параметрів зовнішньої скриньки, оскільки sshпередбачає, що -Tїй дана команда.
ефемієнт

1

Для інтерактивної оболонки ви можете використовувати цю просту команду:

ssh -J <user>@<hostB> <user>@<hostC>

Варіанти -J призначені для стрибка .


0

Якщо ваш роботодавець надає VPN, рекомендую використовувати його.

Таким чином, вам не доведеться конфігурувати будь-які програми спеціально (навіть ssh), і ви можете бачити будь-яку машину за брандмауером. Крім того, весь ваш трафік буде зашифрований програмним забезпеченням VPN, що додасть безпеку будь-якому ненавмисному або навмисно незашифрованому трафіку.


6
Іноді саме VPN - це причина, що нам потрібні ці хитрощі ...
Луї

0

YASS - ще одне просте рішення

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • Перша команда відкрийте ssh-з'єднання з HostB та скажіть HostB переадресувати з'єднання з localhost: 2222 на HostC: 22 .
  • -fпараметр сказати SSH йти на тлі як тільки з'єднання встановлено
  • Друга команда відкриває просто підключення клієнта до localhost: 2222
  • Опція HostKeyAlias не потрібна, але може допомогти запобігти з’єднанню з неправильним хостом
  • Nota: команда sleep 10потрібна для підтримки з'єднання, поки друга ssh команда не використовує переадресований порт. Тоді перший ssh закриється, коли другий ssh покине пересланий порт.

тепер ви можете запустити наступні сеанси ssh:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Варіант:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

наступні сеанси ssh можна відкрити, запустивши:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

Основна перевага використання параметрі -M і -S полягає в тому, що від HostA до HostC відкрито лише одне з'єднання, наступний сеанс знову не автентифікується і запуститься набагато швидше.


0

Особливий чохол, змішані платформи nix:

  hostA (Linux) -> HostB (solaris) -> HostC (Linux)

Якщо вам потрібна програма X на hostC, а проміжний хоп знаходиться у вікні Solaris ... у цьому випадку я знайшов netcat (nc), необхідний на ProxyCommand, як:

hostA: ~ $ vi .ssh / config:

Ведучий хостC
    ProxyCommand ssh хостB nc% h% p # де nc є netcat

Потім працює автоматичне тунелювання:

hostA: ~ $ ssh hostC

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