Если у вас дома стоит стационарный компьютер c Debian/GNU Linux или чем-то похожим, то у вас, вероятно, время от времени возникает потребность подключиться к нему по ssh находясь где-то совсем в другом месте. У меня, например, дома стоит системный блок без монитора и клавиатуры, работающий сервером резервного копирования. У вас это может быть рабочий ПК, или что угодно ещё, работающее под Linux.
Домашний ПК обычно входит в локальную сеть, как правило, организуемую с помощью некоего домашнего роутера. При этом доступ к нему из вне (из интернета) обычно невозможен.
Правильный вариант — ssh туннель
Наиболее правильным вариантом будет создание аналога VPN для бедных с использованием SSH и некоего виртуального сервера, который у вас конечно же есть. Если ещё нет — можно купить его за 5$/месяц в DigitalOcean или за 200 рублей/месяц в VScale. Можно купить его ещё где-то дешевле.
Предположим, ваш пользователь на локальной системе (той к которой нужно подключаться) зовётся user, сервер myserver.com, а пользователь на сервере — remote_user
1. Установим autossh:
# apt-get install autossh |
2. Добавим ваш публичный ключ в список авторизованных ключей на удалённом сервере (если он ещё не добавлен):
$ cat ~/.ssh/id_rsa.pub | ssh remote_user@myserver.com 'cat >> .ssh/authorized_keys' |
3. Создадим скрипт для автоматического создания и поддержания соединения с удалённым сервером
Вот содержимое скрипта, только в нём нужно изменить myserver.com, user и remote_user на то, что актуально для вас
#!/bin/bash # Прибьём все активные процессы autossh killall -SIGKILL autossh && # Включим отладку и нулевое время переподключения export AUTOSSH_DEBUG=1 export AUTOSSH_GATETIME=0 # Запустим autossh в фоновом режиме с отрывом от терминала nohup autossh -M 10984 -N -f -o "PubkeyAuthentication=yes" -o "PasswordAuthentication=no" -i /home/user/.ssh/id_rsa -R 6666:localhost:22 remote_user@myserver.com & |
Положить этот скрипт можно, например, в файл ~/bin/autossh.sh и сделать исполнимым:
chmod +x ~/bin/autossh.sh |
Кстати, для того, чтобы исполнимые файлы из папки ~/bin/ запускались из консоли откуда угодно, достаточно добавить в файл ~/.profile такие строчки:
if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi |
4) Проверим работоспособность:
Для этого запустим скрипт:
~/bin/autossh.sh |
Он должен сразу завершиться (так как в нём указан запуск autossh в фоновом режиме).
Проверим, запустился ли autossh:
pgrep -l autossh |
Эта команда должна вывести какое-то число (номер процесса) и его название — autossh.
Подключимся к удалённому серверу, и попробуем оттуда подключиться к локальному через проброшенный порт:
ssh remote_user@myserver.com ssh user@127.0.0.1 -p 6666 |
Если всё хорошо, у вас спросят пароль вашей локальной машины, после чего вас пустят на локальную машину через тоннель.
5) Создадим скрипт для удобного подключения
Создадим на удалённом сервере файл, например ~/bin/ssh-laptop с таким вот содержимым:
#!/bin/bash ssh user@127.0.0.1 -p 6666 |
и сделаем его исполнимым:
chmod +x ~/bin/ssh-laptop |
Готово! Теперь для доступа к вашему ноутбуку/домашнему серверу/роутеру/чему-то ещё, можно использовать команду:
ssh remote_user@myserver.com ssh-laptop |
В случае проблем можно сделать следующее:
1) Попробовать запустить autossh без амперсанда («&») и без nohup, чтобы посмотреть на что он ругается.
2) На удалённом сервере, до запуска autossh (или прибив его) проверить, не занят ли порт 6666 какой-то другой программой, с помощью команды netstat -nlp | grep 6666
Было бы нечестно обойти стороной и другие существующие варианты, поэтому кратко упомяну, в чём их недостатки по сравнению с описанным способом. Преимущества же у них очевидны — более простая настройка.
Простой вариант — проброс портов
Простым вариантом было бы пробросить порт через ваш роутер, подключённый к Интернет-провайдеру, прямо на ваш стационарный ПК, однако у этого метода есть свои минусы:
1) Дыра в безопасности — если на вашем домашнем ПК слабый пароль, то китайские брутфорсеры рано или поздно его подберут, ведь они стучаться по всем IP-адресам домашних провайдеров в поисках лёгкой добычи.
2) Если у вас серый внейшний IP-адрес (то есть не выделенный), то он будет время от времени меняться, и чтобы иметь возможность подключаться к вашему ПК, вам понадобится использовать какую-то веб-службу вроде DynDNS.
3) Придётся настраивать домашний ПК на конкретный IP-адрес, чтобы роутер знал, куда пробрасывать порт. Если вы хотите получать доступ не к стационарному ПК, а к ноутбуку, который вы подключаете по WiFi, но иногда можете подключить и по проводу (для увеличения скорости), в этом случае назначить статический IP-адрес работающий в любом случае не получится.
4) Если Интернет-провайдер использует NAT, то у вас вообще не будет возможности пробросить порт извне.
Самый простой вариант — Teamviewer
Самый простой вариант — попросить кого-то кто находится с вашим ПК запустить Teamviewer, либо даже настроить teamviewer для автоматического запуска, и задать постоянный пароль. Минус тут в том, что это подойдёт только для компьютера с окружением рабочего стола, монитором, мышкой и клавиатурой, и для достаточно мощного интернет-соединения, тогда как ssh будет работать даже на GPRS.
Не понятно, насколько мне говорили нат не мешает соединению у компом из вне, тоестьк к компьютеру который сидит за нат подключится можно вроде бы, какая-то путаница….
Ну чтож, если, как тебе говорили, подключиться к компьютеру сидящему за NAT можно без проблем, то решения из данной статьи тебе не нужны 🙂
Ну а если потребуются — всегда пожалуйста 🙂
Большое спасибо! Я долго искал подходящее решение для удаленного администрирования (без использования графического окружения). Я использовал вариант с ssh-туннелем и виртуальным сервером от Vscale. Всё отлично работает!
Через autossh можно пробрасывать порты для vnc, rdp или nomachine-сервера, что позволяет пользоваться и графическим интерфейсом
Да, у меня как раз с этим сейчас возник вопрос. Подскажите, как правильно настроить работу через nomachine-сервер? Бывают случаи, когда необходим графический интерфейс.
Еще у меня при вводе команды ssh remote_user@myserver.com ssh-home
выдает такое сообщение
Permission denied, please try again.
user@127.0.0.1: Permission denied (publickey,password).
Приходится сначала заходить на vds-сервер, а потом выполнять команду ssh-home. Тогда я захожу на домашний ПК.