Як я можу налаштувати зворотне з'єднання SSH до комп'ютера, що підключається?


20

Я найближчим часом буду розгортати ряд машин, які будуть позаду маршрутизаторів. Неможливо встановити динамічний DNS на кожному маршрутизаторі та переадресації портів, тому є спосіб, як я можу налаштувати ці машини, щоб ініціювати TCP-з'єднання з моїм комп'ютером, а потім змусити мій комп'ютер ініціювати з'єднання SSH з віддаленим комп'ютером що зв’язок?

IE:

COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A

Чи можливо це, і якщо так, то як це зробити?


Відповіді:


21

У /etc/ssh/sshdдля комп'ютера B комплекті:

AllowTcpForwarding yes
TCPKeepAlive yes

З комп’ютера A :

$ ssh -R 2222:localhost:22 ip.of.computer.b

З комп’ютера B :

$ ssh localhost -p 2222

Зауважте, що 2222 - це довільний номер високого порту, який я вибрав. Цей порт на комп’ютері B потім буде тунельований назад через з'єднання SSH, ініціалізовані на комп’ютері А до порту 22. Якщо у вас кілька машин, ви повинні використовувати інший порт для кожної машини.

Для вашого випадку використання ви, ймовірно, захочете запустити це зі сценарію, щоб ви могли зробити його демоном і періодично намагатися повторно підключитися, якщо посилання відхилено. Напевно, ви хочете отримати спеціальний обліковий запис із оболонкою /bin/trueна комп'ютері B для обробки вхідних з'єднань. Потім ви можете налаштувати або одну клавішу, або кілька клавіш для кожної машини, дозволену "додому".

На комп'ютері А ви могли б знайти -n, -Nі -Tопції корисних відключити його від локального введення (так що він може працювати у фоновому режимі), а не намагатися виконати будь-яку віддалену команду, просто відкрити тунель, а не створювати термінал.

Більшість звичайних методів нересту демона не дуже добре справляються з налаштуванням мережевого тунелю. Проблема в підключенні до мережі зробить спробу перебити стіну вниз, щоб пройти. Проста петля зі сном, щоб чекати, повинна зробити свою справу. Десять хвилин - це приємне число, оскільки воно не затоплює мережу та файли журналів із спробами, якщо є проблема (наприклад, для того, щоб комп’ютер B був офлайн), але він все одно поверне вас досить швидко, якщо з'єднання перервано.

#/bin/sh
while true; do
    sleep $((60*10))
    ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done

Такий сценарій може бути запущений під час завантаження /etc/rc.local. Ваше перша зміна увійти в машину почнеться приблизно через десять хвилин після комп'ютера А чобіт.


1
Приємно. Тож я в основному мав би кожен віддалений апарат тунелювати локальний порт SSH до порту на локальній машині? Можливо, розумно мати кожну машину лише підключити тунель під замовлення. Можливо, я можу дозволити кожній машині відкрити HTTP-з'єднання, що зберігається в живих, і натиснути XML-дані, коли я хотів би спробувати зворотне з'єднання, щоб полегшити управління (і не засмічувати всі мої порти;]). Спасибі!
Naftuli Kay

@TKKocheran: Є дуже багато портів на вибір ... конкретно більше, ніж у вас будуть кіоски. Як зберігати тунель SSH гірше, ніж тримати відкрите з'єднання http?
Калеб

Я думаю, ти маєш рацію, я міг би просто зробити це, але тоді я мав би зіставити порти на машини і запам'ятати, який з них є, тоді як інший маршрут був би ліниво створеним, тобто створити тунель SSH лише за запитом.
Naftuli Kay

1
@TKKocheran: Вам доведеться робити картографування в будь-якому випадку, інакше навіть ваше ледаче уміння наштовхнеться на ситуації, коли вони намагаються пограбувати одне одного.
Калеб

1
Я не знаю, чи є це загальноприйнятним, але тепер увімкнено мою конфігурацію sshd/etc/ssh/sshd_config
gc5,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.