Постійне фонове ssh-з'єднання для створення зворотного тунелю: який правильний шлях?


41

Питання, пов'язані з цим: ініціювати ssh-з'єднання від сервера до клієнта

Відповідь звідти мені дуже допомогла, ця команда робить те, що мені потрібно:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Тому я писав сценарій, щоб весь час знову підключатися:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

І додав його до /etc/crontab. Але я з'ясував, що працює, якщо тільки виконую його "вручну" з оболонки, але якщо він викликається cron, ssh з'єднується і негайно закінчується. (так, сценарій, що надсилається вище, весь час відновлюється)

З цього моменту man sshя виявив, що для фонових з'єднань я повинен викликати це -nклавішею, але це не допомогло. Потім я просто оглянув подібні сценарії, і виявив, що він працює, якщо я викликаю tail -f something, тобто якусь команду "neverending", тому я просто створив порожній файл, /tmp/dummy_fileі тепер моя ssh команда виглядає так:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

Це працює зараз! Але це рішення здається трохи потворним, плюс я не дуже розумію фактичних причин такої поведінки. Просто випадково я спробував зателефонувати bashзамість tail -f( bashмені здається, також "непостійної" команди), але це не працює.

Отже, чи могла б хто-небудь пояснити цю поведінку, і який правильний спосіб створити фонове ssh-з'єднання, щоб підтримувати тунель зворотного ssh?


як щодо використання &в кінці вашої команди ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker

Але тоді мій whileцикл буде працювати знову і знову, починаючи нове фонове sshз'єднання кожні 5 секунд, правда? Це не те, що мені потрібно.
Дмитро Франк

Відповіді:


37

Це здається, що ви хочете, щоб -Nваріант ssh.

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).

16

Я настійно пропоную вам розглянути autossh. Він має певну евристику, яка дозволить визначити, чи є втрата з'єднання, що лежить в основі, і знизить частоту спроб повторного підключення. Крім того, він контролює з'єднання за допомогою додаткових тунелів, що робить його дуже корисним для таких сценаріїв, як той, про який ви запитуєте.

Наприклад, якщо ви перебуваєте на Ubuntu, ви можете зробити пошук в Інтернеті, autossh upstartщоб знайти корисні приклади того, як налаштувати Ubuntu так, щоб тунель постійно підтримувався.

Я використовую це для того, щоб постійно підтримувати відкритий тунельний зв’язок із моїм сервером для певних служб.


Я насправді пробував autossh, я читав цю статтю: goo.gl/jVuuSR , але вона працювала для мене лише в тому випадку, якщо у мене є підключення до Інтернету одразу під час завантаження системи; але якщо з'єднання встановлено пізніше, воно не спрацювало. Не впевнений, можливо, я зробив щось не так, але навіть у цій статті автор має sleep 10свою /etc/rc.local, щоб бути впевненим, що підключення до Інтернету вже готове, коли викликається автосш.
Дмитро Френк

2
@DmitryFrank: несправедливо не згадувати про це у своєму питанні, якщо ви намагалися. Я все одно рекомендую. За допомогою upstartта інших замін init ви можете прив’язати старт тунелю до одного або декількох мережевих пристроїв, що працюють. Найкраще з рішень (ІМО) в Інтернеті - це таке: erik.torgesta.com/tag/ssh-upstart ... і жоден спосіб sleep 10не допоможе в деяких випадках.
0xC0000022L

Вибачте, що не згадую про це, якщо чесно, коли це не спрацювало для мене, я вирішив це зробити просто «від руки» і зовсім забув про autossh. Дякую ssh-upstart, я погляну на це!
Дмитро Франк

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

@DeveloperChris: Ну, я веду саме такий сценарій - і надійно. Якщо віддалений сервер буквально не виходить з ладу і вам потрібно буде знову його ввімкнути, тунель завжди відновлюється. Можливо, ви повинні написати власне запитання та надати детальну інформацію. Звичайно, це можна зробити. Я використовував це для вирішення проблем з VPN протягом місяців.
0xC0000022L

9

Я буду другою пропозицією @ 0xC0000022L і використовувати її autosshтакож. Я використовую його для підтримки SSH-з'єднання з мого ноутбука, оскільки я беру його з місця на місце, і він просто працює. Я використовую це з'єднання для тунельних портів 25 і 2143 для доступу до моїх персональних серверів SMTP та IMAP.

Ось сценарій, який я використовую:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

Потім я зберігаю Hostзапис у своєму $HOME/.ssh/configфайлі для хоста imap-o.

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh sam@mygw.mydom.com nc `echo %h|sed 's/-o//'` %p

autossh_mail.shСкрипт запускається як частина мого робочого столу , коли я увійти в систему . Ви можете отримати доступ до нього через gnome-session-properties.

       ss №1

                                          ss №2

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