Инструкция по созданию обратного SSH-туннеля

Инструкция писалась для RPi под управлением Raspian (Debian) для человека совершенно не знакомого с Linux.

Имеется: RPi за NAT'ом и удаленный сервер с внешним IP.
Надо: Иметь постоянный удаленный доступ к "малинке".


Начало


После загрузки Raspberry увидим черный экран и мигающий курсор - это консоль. Все команды выполняются именно здесь.
В консоле есть автодополнение - это клавиша Tab. По ней дописываются названия файлов, директорий, команды, если они есть в системе. Параметры к командам (-l, -r и т.п.) не дописываются!

Для большего понимая того, что делаем, вот команды, которые будем использовать:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
pwd - показывает директорию (папку), в которой сейчас находишься
ssh-keygen - утилита создающая ключевую пару для доступа на удаленный сервер
ls - показывает содержание директории. Флаг -l добавляет некоторые данные к выводу
nano - текстовый редактор
chmod - установка прав доступа
ssh - подключение к серверу по протоколу SSH
crontab - планировщик заданий Linux


Убедимся, что мы в домашней директории:
  1. 1
pwd

На экран дожлно вывестись:
  1. 1
/home/user


Итак, приступим


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

Здесь утилита задаст пару вопросов. На первый надо написать .ssh/tunnel и нажать Enter, на последующие просто Enter.
  1. 1
  2. 2
  3. 3
  4. 4
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): .ssh/tunnel
Enter passphrase (empty for no passphrase):
Enter same passphrase again:


Удостоверимся что создались 2 файла:
  1. 1
ls -l .ssh/

На экран должны вывестись 2 строки или больше, но среди них должны быть
  1. 1
  2. 2
-rw------- 1 user user 1679 Jun  30 16:57 tunnel
-rw-r--r-- 1 user user  415 Jun  30 16:57 tunnel.pub

Первый файл содержит приватный ключ. А второй - публичный, который далее нам понадобится.
Если таковых нет, то посмотрим в текущей директории:
  1. 1
ls -l

В общем, их надо обязательно найти. Потому что они нужны.

Далее, надо написать скрипт, который будет подключаться к удаленному серверу, если такого подключения нет:
  1. 1
nano autotunnel.sh

Откроется редактор nano. В нем надо написать следующие строки:
  1. 1
  2. 2
  3. 3
  4. 4
#!/bin/sh

COMMAND="ssh -i .ssh/tunnel -N -f -R 2222:localhost:22 user@jonel.net"
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND

Внимание! Вставить по Ctrl+V не получится. Но можно вставить используя комбинацию клавиш Shift+Insert - это второй способ вставки. Или первый :-) Копирование работает по нажатию Ctrl+Insert.
Чтобы сохранить и выйти из редактора надо нажать комбинацию клавиш Ctrl+X. Nano внизу экрана задаст вопрос (на англ.) - Хотите сохранить? Надо нажать кнопку y (yes). Он спросит про название файла, здесь надо просто нажать Enter.
Если кратко: Ctrl+X, Y, Enter

Теперь надо выставить права на выполнение этого скрипта:
  1. 1
chmod 744 autotunnel.sh


Теперь нам надо добавить публичный ключ на удаленный сервер. Чтоб он знал кто подключается.
Выведем публичный ключ на экран и скопируем его:
  1. 1
cat .ssh/tunnel.pub

Выделим его и нажмем Ctrl+Insert.

Заходим на сервер:
  1. 1
ssh user@jonel.net

Сервер спросит пароль.

После того, как попали на сервер надо добавить скопированный ключ в файл .ssh/authorized_keys
  1. 1
nano .ssh/authorized_keys

Снова откроется редактор nano. Возможно там уже есть какие-то строки. Нажимаем клавишу Page Down (возможно несколько раз), чтоб перейти в конец файла. Обязательно надо убедиться что находимся на новой строке или нажать Enter.
Теперь нажмем Shift+Insert. Должна вставиться длинная строка, которую копировали ранее. Что-то типа:
  1. 1
shh-rsa AAAA... 

Опять нажимаем Ctrl+X, Y, Enter
Проверим, что все сохранилось:
  1. 1
cat .ssh/authorized_keys

Наша строка должна быть в конце.
Выходим с сервера:
  1. 1
exit


Надо, конечно, проверить все ли работает. Но придется объяснять еще пару команд Linux. Думаю, ты не осилишь :-) Будем надеяться, что все правильно сделали.
Посмотрим лишь работает ли скрипт:
  1. 1
sh autotunnel.sh

Если пароль не просит, а просто переходит на следующую строку. То все должно работать как надо.

Теперь надо добавить задание в Cron, чтобы он выполнял проверку подключения и восстанавливал ssh-туннель, если соединение оборвалось.
  1. 1
crontab -e

Перейдем в конец - Page Down. Вставим следующую строку:
  1. 1
*/5 * * * * sh autotunnel.sh > /dev/null 2>&1

Теперь проверка подключения будет выполняться 1 раз в 5 минут.

На этом все.
Мы победили NAT и доступны с сервера к которому подключились.

UPD:
Как показала практика, соединение может быть мертвым, а процесс висящим. Поэтому лучше подключаться через ControlMaster:
  1. 1
ssh -i .ssh/tunnel -M -S tunnel_socket -N -f -R 2222:localhost:22 user@jonel.net

А далее проверять состояние соединения через этот же сокет:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
ssh -S tunnel_socket user@jonel.net netstat -an | egrep "tcp.*:2222.*LISTEN"
if [ $? -ne 0 ] ; then
   pkill -f -x "$COMMAND"
   $COMMAND
fi

В этому случае netstat выполнится на удаленном сервере. И мы можем проверить состояние порта. При необходимости убить текущий процесс и переподклоючиться.


28 октября 2015 | Рубрика: Linux

Name:*

Feedback:

Message:*

Календарь

  • Сегодня
    17 Марта 2026, Вторник
    ПНВТСРЧТПТСБВС
    1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031

Авторизация