ssh через роутер без переадресації портів


11

У мене є Linux-сервер, і я хочу розмістити його в домашній мережі за маршрутизатором. Мені потрібно сша на цей сервер іноді ззовні, але я не хочу налаштовувати переадресацію портів, оскільки у мене немає доступу до маршрутизатора, і я не знаю ip маршрутизатора.

Що я можу зробити - це помістити якусь програму на сервер linux, тому коли вона підключена до Інтернету, вона постійно надсилатиме дані на інший мій сервер в Інтернеті, щоб я знав IP-адресу цього сервера. Але чи є спосіб запустити ssh на сервер за маршрутизатором ззовні? щось на кшталт NAT або socket, що підтримує мережеве з'єднання?

Дуже дякую

Відповіді:


24

Що ви хотіли б зробити, це ssh ВІД вашого "Linux-сервера" ДО чогось із зовнішнього боку, наприклад, "my_other_server" або чогось іншого, на яке можуть потрапити обидва сервери.

Ви б скористалися віддаленою переадресацією ssh.
[user@linux_server]$ ssh -R8022:localhost:22 my_other_server.com
Пояснення: Підключіться до my_other_server і відкрийте порт 8022 там, який буде пересилати мене назад на порт 22.

З my_other_server.com ви зможете перенести ssh до localhost на порт 8022 і перенести ваш трафік до linux_server piggybacking на linux_server -> my_other_server тунель [user@linux_server]$ ssh -p8022 localhost
Пояснення: Підключіться до себе на порт 8022, який пересилається до linux_server

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


1
Дякую, це чудово працює! Я хочу використовувати скрипт, щоб тримати його відкритим. Інше питання - що, якщо мені подобається 1000 таких «Linux-серверів» і лише один «my_other_server», я можу таким чином схилитись до будь-якого з них? Я припускаю, що всі вони потребують різних портів і чи є кращий спосіб зробити це?
Jiechao Лі

Ну, це залежить. Тепер, коли ви перебуваєте на linux_server, ви могли би просто сш на linux_server2 та linux_server3 звідти? Це було б найпростіше. Так що так, ви могли це зробити кілька разів, замість цього використовуйте 8022, використовуйте 8023, 8024. Якщо ви йдете цим маршрутом, побудуйте файл ~ / .ssh / config на "my_other_server", який містить усі номери портів, так ви просто ssh [псевдонім] замість ssh [port] localhost. Це стане громіздким.
MattPark

1
Чи можливо це налаштувати лише за допомогою двох машин? Підключіть B до A, A назад до B через себе?
adamyonk

1
Я просто це зробив. Може підтвердити, що це працює. \ o /
adamyonk

Ага, людина, очевидно, ви це зрозуміли. Ви можете використовувати щось на зразок, autosshщоб тримати його відкритим.
MattPark

3

Ви можете використовувати подібні VPN, щоб це працювало, але для цього потрібно мати сервер, до якого може отримати доступ недоступний сервер. Тоді ви можете встановити OpenVPN на сервері, вашому ПК та сервері, що захищається client-to-client, увімкніть , і ви закінчите. http://openvpn.net/howto.html


Дякую. Я розглядаю це, але це здається трохи складним. Якщо я правильно розумію, мені потрібно встановити OpenVPN на обох серверах, щоб вони могли спілкуватися, не конфігуруючи маршрутизатор, правда?
Jiechao Лі

Саме так. Ви налаштовуєте сервер як "сервер", тоді два клієнта, яких ви хочете з'єднати разом як "клієнти" в налаштуваннях. Зворотний SSH, зазначений вище, здається вам простішим.
Натан С

3

Ця відповідь ґрунтується на прийнятій, але додаючи деталі, які дозволили мені це зробити. Прошу вибачення за пояснення пішохода, оскільки це зовсім не моя експертиза.

Припустимо, у вас є два комп’ютери Aта B. Ви хочете sshвід Aдо B, і ви не можете робити будь - яких перенаправлення портів в маршрутизатори , підключені до них.

Як зазначено у прийнятій відповіді, для цього вам потрібен сервер S: у комп’ютері Bви дозволите sshз'єднання, що надходять від S; і з комп’ютера Aви отримаєте доступ до цього тунелю, Sщоб досягти B.

Але як отримати цей сервер S? Я знайшов serveo(посилання: https://serveo.net/ ). Це дуже просте використання. Вам не потрібно нічого встановлювати чи реєструвати, і це безкоштовно. За даними веб-сайту, наступні кроки:

  1. Придумайте псевдонім для комп’ютера B. Наприклад, computer_B_alias.

  2. У комп’ютері Bвиконати ssh -R computer_B_alias:22:localhost:22 serveo.net.

  3. Тепер ви можете отримати доступ до комп'ютера Bз комп’ютера A, виконавши в комп'ютері наступне A:, ssh -J serveo.net user@computer_B_aliasде вам доведеться замінити userім'я користувача в комп'ютері B.

PS: Звичайно, ви робите пункт 2 автоматичним завданням при запуску комп'ютера B.

PSS: Перш ніж спробувати це, переконайтеся, що sshвстановлено на обох комп'ютерах. Для Ubuntu sudo apt-get install sshзробив би цю роботу.


1
Дякую, це також було відсутнім посиланням, яке мені також було потрібно. Зауважте, сервіси, здається, вниз. Ці дві альтернативи я вважаю досить корисними: ngrok & localhost.run !
DannyDannyDanny

1

Давно відповісти. Сподіваюся, що це може допомогти тому, хто зараз шукає те саме.

Якщо ви хочете отримати доступ до сервера, що знаходиться за NAT, і ви не хочете писати код, ви, ймовірно, можете скористатися інструментом серед нижче та використовувати всі необхідні ваші потреби.

Обидва вищезазначені інструменти передбачають, що ви маєте доступ до машини Linux для встановлення свого клієнта. Деякі їх переваги:

  • Обидва надають вам доступ до терміналу за допомогою веб-інтерфейсу
  • Вам не потрібен проміжний власний зворотний ssh-хост.
  • Дуже простий в установці
  • Обидва є відкритим кодом

Я особисто віддаю перевагу tmate більше, оскільки ви можете розмістити сервер tmate на своєму власному проміжному сервері (для зворотного ssh), тоді як телеконсоль може підключатися до власних серверів для зворотного ssh.


1

Можна використовувати ngrok . Процес простий:

  1. Зареєструйтесь на їхньому сайті
  2. wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
  3. unzip ngrok-stable-linux-amd64.zip
  4. ./ngrok authtoken <унікальний ключ від вашого облікового запису ngrok>
  5. ./ngrok tcp 22
  6. на віддаленому ПК можна підключитись так:
    1. ssh username@0.tcp.ngrok.io -p 11000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.