Потрібен доступ SSH до Linux-комп’ютера, який є недоступним? Скористайтеся зворотним підключенням: нехай віддалений комп’ютер “зателефонує” вам, а ви використаєте це з’єднання для встановлення власного сеансу SSH. Ми покажемо, як це зробити.
У яких випадках може знадобитися зворотне тунелювання SSH?
Іноді підключення до віддалених комп’ютерів може бути ускладнене. Це може бути викликано суворими правилами брандмауера, встановленими в мережі, або складними налаштуваннями NAT. Як тоді отримати доступ до такого комп’ютера?
Давайте визначимося з термінологією. Ваш комп’ютер, на якому ви зараз працюєте, ми називатимемо локальним. Комп’ютер, до якого ви намагаєтеся під’єднатися, буде віддаленим.
Для наочності, у цій статті ми будемо використовувати назви: віддалений комп’ютер з Ubuntu Linux (фіолетові вікна терміналу) називатиметься “wdzwdz”, а локальний комп’ютер з Manjaro Linux (жовті вікна терміналу) – “Sulaco”.
Здебільшого ви б використовували з’єднання SSH, ініційоване з локального комп’ютера для підключення до віддаленого. Але у випадку з мережею, яку ми описуємо, цей варіант неможливий. Насправді, неважливо, яка саме проблема у вашій мережі – цей метод корисний у всіх ситуаціях, коли ви не можете підключитися до віддаленого комп’ютера напряму.
Проте, якщо ваш локальний комп’ютер має просту конфігурацію мережі, то віддалений комп’ютер може встановити з вами з’єднання. Це, звичайно, ще не дає вам доступу до командного рядка на віддаленій машині, але це вже початок – у нас є активне з’єднання між двома комп’ютерами.
Рішенням є зворотне тунелювання SSH.
Що таке зворотне тунелювання SSH?
Зворотне тунелювання SSH дозволяє вам використовувати існуюче з’єднання для встановлення нового з’єднання з локального комп’ютера назад до віддаленого.
Оскільки початкове з’єднання встановлюється з віддаленого комп’ютера до вашого, використання його для передачі даних в зворотному напрямку називається “зворотним”. А оскільки SSH є безпечним протоколом, ви створюєте безпечне з’єднання всередині вже існуючого безпечного з’єднання. Фактично, ваше з’єднання з віддаленим комп’ютером стає приватним тунелем всередині вихідного з’єднання.
Звідси і назва – “зворотне тунелювання SSH”.
Як це працює?
Зворотне тунелювання SSH залежить від того, що віддалений комп’ютер використовує встановлене з’єднання для прослуховування нових запитів на з’єднання, що надходять з локального комп’ютера.
Віддалений комп’ютер очікує на підключення на певному мережевому порту локального комп’ютера. Якщо він виявляє запит SSH на цей порт, він перенаправляє цей запит самому собі через встановлене з’єднання. Так створюється нове з’єднання, цього разу від локального до віддаленого комп’ютера.
Це простіше налаштувати, ніж описати.
Використання зворотного тунелювання SSH
SSH вже повинен бути встановлений на вашому Linux, але вам може знадобитися запустити SSH демон (sshd), якщо ваш локальний комп’ютер ще не приймав з’єднань SSH.
sudo systemctl start sshd
Для того, щоб демон SSH запускався автоматично при кожному перезавантаженні комп’ютера, виконайте наступну команду:
sudo systemctl enable sshd
На віддаленому комп’ютері ми використовуємо таку команду:
Опція “-R” (зворотний) вказує ssh створити нові сеанси SSH на віддаленому комп’ютері. Параметр “43022:localhost:22” повідомляє ssh, що запити на з’єднання до порту 43022 на локальному комп’ютері мають бути перенаправлені на порт 22 на віддаленому комп’ютері. Порт 43022 був обраний, оскільки він зарезервований для користувацьких потреб. Це не єдиний можливий варіант. “[email protected]” – це ім’я користувача, від імені якого віддалений комп’ютер намагатиметься підключитися до локального.
ssh -R 43022:localhost:22 [email protected]
Можливо, ви побачите попередження про те, що раніше не підключалися до локального комп’ютера. Або ви можете отримати повідомлення, коли інформація про підключення додається до списку відомих SSH-хостів. Повідомлення, які ви побачите (якщо взагалі побачите), залежать від того, чи віддалений комп’ютер вже раніше встановлював з’єднання з локальним.
Потрібно буде ввести пароль від облікового запису користувача, якого ви вказали для підключення до локального комп’ютера.
Зверніть увагу, що після встановлення з’єднання командний рядок зміниться з [email protected] на [email protected]
Тепер ми підключені до локального комп’ютера з віддаленого. Це означає, що ми можемо надсилати йому команди. Давайте використаємо команду “who”, щоб побачити, хто ввійшов у систему на локальному комп’ютері.
who
Ми бачимо, що користувач “dave” увійшов на локальний комп’ютер, і віддалений комп’ютер підключився (використовуючи ті ж облікові дані) з IP-адреси 192.168.4.25.
Підключення до віддаленого комп’ютера
Оскільки з’єднання з віддаленого комп’ютера пройшло успішно, і він прослуховує підключення, ми можемо спробувати підключитися до віддаленого комп’ютера з локального.
Віддалений комп’ютер прослуховує порт 43022 на локальному комп’ютері. Тому – дещо нелогічно – щоб підключитися до віддаленого комп’ютера, ми просимо ssh встановити з’єднання з локальним комп’ютером через порт 43022. Цей запит на підключення буде перенаправлений на віддалений комп’ютер.
ssh localhost -p 43022
Нам знову потрібно ввести пароль користувача, після чого ми підключимося до віддаленого комп’ютера з локального. Наш комп’ютер Manjaro повідомляє: “Ласкаво просимо до Ubuntu 18.04.2 LTS”.
Зверніть увагу, що командний рядок змінився з [email protected] на [email protected] Ми досягли мети – встановили SSH-з’єднання з нашим важкодоступним віддаленим комп’ютером.
Використання SSH-ключів
Для зручності підключення віддаленого комп’ютера до локального, можна налаштувати SSH-ключі.
На віддаленому комп’ютері введіть таку команду:
ssh-keygen
Вам буде запропоновано ввести парольну фразу. Можна натиснути Enter, щоб пропустити цей етап, але цього робити не варто. Це означатиме, що будь-хто з доступом до віддаленого комп’ютера зможе встановити SSH-з’єднання з вашим локальним без пароля.
Парольна фраза з трьох-чотирьох слів, розділених символами, створить надійний захист.
Після цього ваші SSH-ключі будуть згенеровані.
Тепер потрібно передати відкритий ключ на локальний комп’ютер. Скористайтеся цією командою:
ssh-copy-id [email protected]
Вам буде запропоновано ввести пароль для облікового запису користувача, під яким ви намагаєтеся підключитися, тобто, [email protected]
Коли ви вперше спробуєте з’єднатися з віддаленого на локальний комп’ютер, потрібно буде ввести парольну фразу. В майбутніх з’єднаннях, поки це вікно термінала залишається відкритим, вам не доведеться робити це знову.
Не всі тунелі страшні
Деякі тунелі можуть бути темними і звивистими, але зворотне тунелювання SSH не надто складне, якщо ви розумієте порядок підключення від віддаленого комп’ютера до локального. Просто потрібно його перевернути.