Доступ к вашему домашнему ПК по ssh сквозь NAT

Если у вас дома стоит стационарный компьютер 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.


2 комментария

  • Ответить Алексей |

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

    • Ответить mihanentalpo |

      Ну чтож, если, как тебе говорили, подключиться к компьютеру сидящему за NAT можно без проблем, то решения из данной статьи тебе не нужны 🙂
      Ну а если потребуются — всегда пожалуйста 🙂

Оставить комментарий