создание автоматического обратного соединения SSH при загрузке


9

У меня есть компьютер за NAT, который устанавливает обратное соединение SSH с моим Digitalocean VPC. Я использую это обратное SSH-соединение из дома, чтобы войти в свой офисный компьютер (я уполномочен на это), копировать файлы и делать другие важные вещи.

Хотя и не часто, я заметил, что мой офисный компьютер перезагружается (из-за сбоя питания и т. Д.) И разрывает обратное соединение SSH, которое он установил с моим VPC. В таких случаях я не могу подключиться с домашнего компьютера к офисному компьютеру.

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

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

Я не могу снова запустить этот скрипт на моем офисном ПК после перезагрузки, так как меня там физически нет. Для решения этой проблемы я установил следующий crontab.

Примечание: rev.shфайл содержит вышеуказанную строку. Сертификат "digitalOcean" и rev.sh находится в Ubuntu home. Поэтому, когда я выполняю ./rev.shв своем терминале Ubuntu, я получаю динамический прокси, а также доступ к серверу ym DigitalOcean. Этот метод работает на 100%.

Однако, когда я устанавливаю chrontab следующим способом, мой компьютер с Ubuntu никогда не создает динамический прокси. Я вижу это, потому что когда я проверяю этот прокси из Google Chrome, он говорит, что прокси отказывается от соединения.

Вот cronejobs, которые я пробовал как корни 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

они тоже не выполнялись.

Пожалуйста, будьте любезны, чтобы помочь мне определить мою ошибку. На моем сайте много похожих вопросов по моей проблеме. Поэтому я привел много ответов, но ни один из них не помог.


Я не совсем уверен, в чем ваша проблема здесь. Крон не запускает какую-либо работу? Или скрипт не работает? С обеими проблемами, пожалуйста, обращайтесь к логам. Крон должен написать куда-нибудь /var/log/cron*. В целях тестирования вы можете просто написать что-то вроде этого */2 * * * * /path/to/script- он будет запускать скрипт каждые 2 минуты. Также проверьте почту для пользователя cron. Это рут? Используйте 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

Затем выполните следующую команду от имени пользователя root:

systemctl enable autossh.service

1

Несколько вещей, которые вы можете попробовать:

chmod +x rev.sh

Иногда ваш путь не полностью установлен во время загрузки или с помощью cronjobs, поэтому замените autossh на полный путь в моей системе, которая

/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 * * * reboot' не сработало.
Денис

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-user в 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 подключится, а затем отключится, как только выполнит свою задачу. Так что вам нужно задание.

sleep 31536000 говорит ssh запустить "sleep" в течение 1 года после подключения. В течение этого времени ваши туннели будут работать.

Если вы не запустите команду, ssh подключится, настроит обратный туннель на порт 2205, и когда это будет сделано, он выйдет. Используя autossh, в случае сбоя соединения он снова подключится и перезапустит спящий режим. Даже с действительно стабильным интернет-соединением, я сомневаюсь, что год возможен.

Кстати, в отличие от этих других джокеров, я знаю, что это работает, поскольку я действительно проверял это, потому что, конечно, я делаю что-то подобное, и, поскольку у меня это работает сейчас, очень надежно, я могу дать вам правильный ответ.

-f и "команда"

Это то, что вам не хватает.


1
Я не думаю, что нам нужно называть имена других людей здесь.
Джефф Шаллер

1
Я не называю имена других людей. Я указываю на решения, которые были предложены ранее, никогда не пробовали люди, которые их предлагали. Не веришь мне? Попробовать их.
Джиммини Доу

1
Я не думаю, что вы также обратились к сути вопроса - ОП утверждает, что этот метод работает на 100% . Я считаю, что их вопрос заключается в автоматическом запуске сценария после перезагрузки ПК.
Джефф Шаллер

1
Если он на работе, он может настроить обратные туннели к дому, потому что ОП работает в терминале - ЭТО работает 100% времени. Программы ssh (и autossh) работают по-разному, если у них нет терминала, связанного с процессом. У него были проблемы с тем, что crontab (который работает без терминала) переподключил туннели, именно потому, что он не использовал -f, и даже если бы он был, ssh завершил бы работу, как только туннели были настроены, без запуска чего-либо - в моем случае, я иду беги спать, год. В скрипте -f должен использоваться С КОМАНДОЙ, которая препятствует выходу из SSH. Это его проблема.
Джиммини Доу

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