зробити автоматичне зворотне з'єднання SSH під час завантаження


9

У мене є комп'ютер позаду NAT, який здійснює зворотне з'єднання SSH до моєї Digitalocean VPC. Я використовую це зворотне з'єднання SSH з дому, щоб увійти на свій офісний ПК (я уповноважений це робити) та копіювати файли та робити інші важливі речі.

Хоча не часто, я помічав, що мій офісний ПК перезавантажується (через відключення живлення тощо) і розриває зворотне з'єднання SSH, яке він зробив з моїм VPC. У таких випадках я не в змозі підключитися від домашнього ПК до офісного ПК.

Я запускаю наступний сценарій, щоб зробити зворотне з'єднання + динамічний проксі-сервер, щоб анонімізувати мій трафік (оскільки мені не потрібно ділитися інформацією про перегляд), створений на офісному ПК.

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

Я не можу знову запустити цей скрипт на своєму офісному ПК після перезавантаження, оскільки я фізично там не перебуваю. Щоб вирішити цю проблему, я встановив наступний кронтаб.

Примітка: rev.shфайл містить вищевказаний рядок. Сертифікат "digitalOcean" і rev.sh знаходиться в Ubuntu home. Тому при виконанні ./rev.shв моєму терміналі Ubuntu я отримую динамічний проксі, а також доступ до ym-сервера DigitalOcean. Цей метод працює на 100%.

Однак коли я встановлюю chrontab наступним методом, мій ПК ubuntu ніколи не робить проксі-динамік. Я бачу це, тому що коли я перевіряю цей проксі від Google Chrome, він говорить, що проксі відмовляється від з'єднання.

Ось cronejob я спробував як корені cronejobs. Я також спробував їх як звичайний користувач, все ще вони не працювали.

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

Потім я встановив chrontab за кілька хвилин до поточного часу і чекав його виконання.

24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh

вони також не стратили.

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


Я не зовсім впевнений, у чому тут ваша проблема. Це cron не починає жодної роботи? Або сценарій не працює? З обома проблемами, будь ласка, зверніться до журналів. Крон повинен кудись написати /var/log/cron*. Для тестових цілей ви можете просто написати щось на кшталт */2 * * * * /path/to/script- він буде запускати сценарій кожні 2 хвилини. Також перевірте наявність електронної пошти для користувача, що працює під керуванням. Це корінь? Використовувати mailкоманду. О, я бачу, що ви використовуєте ключ ssh? Я сумніваюсь, що роботу з Cron вдасться знайти, якщо ви не отримаєте повний шлях до неї після -iперемикання.
Калаван

Відповіді:


8

Я не впевнений, що якщо використовувати cronсценарій для запуску скрипта, це гарна ідея. Альтернативою, яку я вважаю більш придатною, є створення служби SystemD, як описано тут . Створіть файл з назвою /etc/systemd/system/autossh.service:

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

Потім запустіть таку команду як корінь:

systemctl enable autossh.service

1

Кілька речей, які ви можете спробувати:

chmod +x rev.sh

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

/usr/bin/autossh

Мотив @reboot залежить від часу запуску демона cron, тому його можна викликати до запуску та роботи інших підсистем (мережі?)

І ваш приклад crontab:

24 12 8 * * * bash /home/user/rev.sh

буде звертатися лише 8 числа кожного місяця. І це додаткове поле. Спробуйте

24 12 * * * /home/user/rev.sh

вибачте, що це була помилка. Я намагався '24 12 * * * /home/user/rev.sh ', але він все ще не працює. На мій подив, навіть "24 12 * * * перезавантаження" спрацювало.
Денис

1
Добре перезавантажте, звичайно, не буде працювати, якщо ви не посилаєтесь на root.
slowko

Я спробував додати / usr / bin / autossh. Це не спрацювало.
Денис

Я спробував 24 12 8 * * * перезавантажити в корені crontab. Це не спрацювало. Це працює на вашу?
Денис

/usr/binзавжди за замовчуванням PATH, навіть дляcron
roaima

1

Здається, що коли сценарій виконується через crontab, він не може знайти ваш сертифікат.

Коли ви як користувач виконуєте скрипт, він використовує сертифікат від /home/ubuntu-user/.ssh / ... Однак, коли сценарій виконується з crontab, він працює як root. root приймає сертифікати з /root/.ssh

Отже, у вас є кілька способів змусити його працювати, але я думаю, що запуск сценарію як ubuntu-користувача в crontab це робить.

Редагувати:

обов'язково надайте повний кваліфікований шлях для сертифіката



0

оскільки у запитанні не так багато даних, я почну з нуля з того, що б робив

Я б поставив усі конфігурації в / etc / ssh / ssh_config:

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

Я б поставив ключ /etc/ssh/mytunnel_key

то я б спробував із записом cron (послуга upstart / systemd була б кращою) так:

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel

0

Вам потрібно використовувати -f та запустити команду, коли ви запускаєтесь без терміналу. Ось ось приклад:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
user@www.hostname.com \
sleep 31536000

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

сон 31536000 повідомляє ssh запускати "сон" протягом 1 року після підключення. За цей час ваші тунелі залишатимуться в стані.

Якщо ви не запустите команду, ssh підключиться, встановить зворотний тунель на порт 2205, і коли це буде зроблено з цим, він вийде. Якщо з’єднатись, не вдасться з’єднатись, він знову підключиться та знову запустить сон. Навіть при дійсно стабільному інтернет-зв’язку, я сумніваюся, рік можливий.

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

-f і "командувати"

Ось що вам не вистачає.


1
Я не думаю, що нам потрібно називати імена інших людей тут.
Джефф Шаллер

1
Я не називаю імен інших людей. Я вказую на рішення, які були запропоновані раніше, ніколи не пробували люди, які їх запропонували. Не вірите мені? Спробуйте їх.
Jimminy Doe

1
Я не думаю, що ви також вирішили питання, - ОП стверджує, що цей метод працює на 100% . Я вважаю, що їх питання зосереджуються на автоматичному запуску сценарію після їх перезавантаження.
Jeff Schaller

1
Якщо він на роботі, він може встановити зворотні тунелі додому, оскільки ОП працює в терміналі - ТО працює 100% часу. Програми ssh (і autossh) діють по-різному, якщо у них немає терміналу, пов'язаного з процесом. У нього виникли проблеми з тим, щоб crontab (який працює без терміналу) знову підключив тунелі саме тому, що він не використовує -f, і навіть якби він був, ssh вийшов би після встановлення тунелів, не запускаючи щось - у моєму випадку я заходжу запускати сон, протягом року. У скрипті -f повинен використовуватися З КОМАНДАМИ, що запобігає виходу SSH. У цьому його проблема.
Джимміні Доу

1
Я гадаю, що саме ви, Джефф Шаллер, дали мені протокол, за правильне рішення і фактично його перевірили. В основному я роблю таку саму точну настройку, що і він, за винятком того, що я налаштовую PI для проходження брандмауера та запуску rdesktop і передаю його нашому менеджеру офісу, який нічого не знає про Linux, щоб використовувати його . Досить впевнений, що у мене є куленепробивне рішення, оскільки я його зараз використовую, і я перезавантажив і мою пі, віддалено, і мій локальний кабельний модем - просто для того, щоб бути в безпеці .. Але чорт, не дозволяйте отримати правильну відповідь шлях перекритого, неосвіченого, его.
Джимміні Доу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.