Туннели через ssh или «vpn для бедных»

Как подключиться по SSH

Для подключения по SSH нам необходимо знать такие данные:

  • ip адрес сервера, к которому мы собираемся подключится;
  • порт, на котором ожидает подключения SSH сервер, по умолчанию используется 22, но в целях безопасности порт подключения ssh часто изменяют;
  • имя и пароль пользователя на удаленном сервере.

Больше ничего не нужно, обычно эти данные присылают в письме вместе с описанием VPS. Теперь перейдем к практике.

1. Подключение через SSH в Linux

В Linux подключение по SSH выполняется с помощью утилиты ssh. Мы более подробно рассматривали работу с ней в статье как пользоваться ssh. Для подключения к удаленному компьютеру ее синтаксис будет выглядеть следующим образом:

$ ssh имя_пользователя@айпи_адрес

Это самый простой вариант, если вам также нужно задать порт, используйте опцию -p:

$ ssh имя_пользователя@айпи_адрес -p порт

Чтобы выполнить подключение по SSH Linux нажмите Ctrl+Alt+T для открытия терминала и наберите команду, заменив нужные значения:

Или, с нестандартным портом:

Если ip_адрес и порт правильные, то на следующем шаге программа попросит у вас ввести пароль:

Если пытаетесь подключится через SSH к этому серверу первый раз, то утилита также попросит подтвердить добавление нового устройства в свой список известных устройств, здесь нужно набрать yes и нажать Enter:

Теперь вы подключены, и все вводимые далее команды будут выполнены на удаленном сервере:

Если же произошла ошибка и IP адрес или порт введены неверно, то вы получите ошибку Connection Refused:

Просто убедитесь что порт введен верно. Если это ваш сервер, то, возможно на нем еще нужно разрешить подключение SSH в брандмауэре. В Ubuntu/Debian для этого на удаленном сервере выполните:

А в CentOS/Fedora:

Если вы используете другой порт для SSH, то замените 22 на свой порт. Для удобства подключения по SSH в дальнейшем можно настроить авторизацию по ключу ssh, чтобы не вводить каждый раз пароль.

Теперь вы знаете как подключиться по ssh linux и решить проблемы с подключением. А теперь перейдем к Windows.

2. Подключение через SSH в Windows

Раньше подключение по SSH из Windows выполнялось только с помощью сторонних утилит, например PuTTY. Но в Windows 10 был добавлен встроенный OpenSSH клиент и работает он точно так же, как и в Linux. По умолчанию этот компонент не активирован. Для его установки откройте Параметры -> Приложения:

Затем выберите Управление дополнительными компонентами:

Здесь нажмите добавить новый компонент и в открывлемся меню выберите OpenSSH Client и нажмите Устанвоить:

Дальше вернитесь назад и дождитесь завершения установки. После того, как SSH клиент будет установлен нужно обязательно перезагрузить компьютер.

После перезагрузки нажмите Win+R чтобы открыть окно запуска команд и наберите в нем cmd:

Далее нажмите Enter. Перед вами откроется командная строка Windows. Здесь можно использовать утилиту ssh. Синтаксис у нее абсолютно такой же, как и для Linux:

ssh имя_пользователя@айпи_адрес -p порт

Например, такой командой можно подключится по SSH к Raspberry Pi, который находится в вашей локальной сети по адресу 192.168.1.5:

Утилита предложит добавить устройство в список известных:

Затем предложит ввести пароль:

Все следующие команды будут выполняться уже на Raspberry Pi или другой удаленной машине, к которой вы подключились.

Теперь подключиться к серверу по ssh из этой операционной системы также просто как и из Linux.

Прямое подключение к серверу с NAT через обратный туннель SSH

Хотя описанный выше метод позволяет вам получить доступ к серверу , который находится за NAT, вам протребуется входить дважды: сначала — на сервер , а затем — на сервер . Это связано с тем, что конечная точка туннеля SSH на сервере привязана к адресу loopback (127.0.0.1).

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

Откройте файл /etc/ssh/sshd_conf на сервере и добавьте к нему следующее.

relayserver~$ vi /etc/ssh/sshd_conf 
GatewayPorts clientspecified

Перезапустите .

В системе на основе Debian:

relayserver~$ sudo /etc/init.d/ssh restart 

В системе на основе Red Hat:

relayserver~$ sudo systemctl restart sshd

Теперь давайте инициализируем обратный туннель SSH из следующим образом.

homeserver~$ ssh -fN -R 1.1.1.1:10022:localhost:22 [email protected] 

Войдите на сервер и убедитесь с помощью команды в том, что обратный туннель SSH успешно установлен.

relayserver~$ sudo netstat -nap | grep 10022 
tcp      0      0 1.1.1.1:10022     0.0.0.0:*           LISTEN      1538/sshd: dev  

В отличие от предыдущего случая, конечной точкой туннеля теперь является 1.1.1.1:10022 (общедоступный адрес IP сервера ), а не 127.0.0.1:10022. Это означает, что конечная точка туннеля доступна с внешнего хоста.

Теперь для того, чтобы получить доступ к серверу , защищенному NAT, введите на любом другом компьютере (например, на клиентском компьютере ), следующую команду.

clientcomputer~$ ssh -p 10022 [email protected] 

Хотя в приведенной выше команде 1.1.1.1 является общедоступным адресом IP сервера , должен быть учетной записью на сервере . Это связано с тем, что реальный хост, на который вы входите, это , а не . Последний просто ретранслирует ваш трафик SSH трафик на сервер .

Настройка ssh клиента

В Debian настройки клиентской части ssh делятся на глобальные и пользовательские. Глобальные клиентские настройки находятся в файле /etc/ssh/ssh_config и применяются ко всем пользователям. Пользовательские настройки могут находиться в домашнем каталоге пользователя, в ~/.ssh/config и применяются к одному пользователю. Файл пользовательских настроек не создаётся автоматически в отличие от файла глобальных настроек клиентской части ssh. Для большинства выполняемых задач подойдут настройки по умолчанию, но для удобства использования, так сказать для тюнинга или для выполнения нестандартных задач клиентские настройки изменяются. Рассмотрим вкратце некоторые из этих настроек. Полезно помнить о приоритетах настроек: высший приоритет имеют ключи командной строки, затем следуют настройки пользователя, а после них используются глобальные настройки клиентской части.

Параметр Host. Ограничивает множество хостов, к которым применяются последующие (до ближайшей новой директивы Host) директивы, по указанным шаблонам (хост должен соответствовать хотя бы одному шаблону). Шаблон, состоящий из одного символа *, соответствует любому хосту. Под хостом в данном контексте понимается аргумент имя_хоста передаваемый в командной строке (т.е. никаких преобразований перед сравнением не выполняется).

Параметр HostName. Устанавливает соответствие между псевдонимами, сокращениями и настоящими именами хостов. По умолчанию используется имя, передаваемое в командной строке. Допустимо непосредственное указание IP-адресов.

Параметр Port. Порт на удалённой машине, к которому следует подключаться. Значение по умолчанию — 22

Параметр User. Имя пользователя, которое следует использовать при регистрации в удалённой системе. Полезно, когда на разных серверах используются разные имена, т.к. избавляет от надобности вспоминать каждый раз нужное имя.

В качестве примера я создам файл пользовательских настроек /home/selifan/.ssh/config следующего содержания:

Host sunup

HostName sunup.aitishnik.local

Port 2203

User andrey

Host windbag

HostName windbag.nnov.ru

Port 2280

User joker

Host 212.177.65.1

HostName 212.177.65.1

Port 2222

User forester

Теперь при подключении к компьютерам sunup.aitishnik.local, windbag или по ip адресу 212.177.65.1 мне не нужно вспоминать, ни имя пользователя, ни ssh порт подключения, достаточно после ssh набрать имя сервера. Просто и удобно! Описания всех параметров, значений и некоторых примеров находятся в man ssh_config. Продолжаем настраивать SSH и читаем «Генерация ключей SSH».

Об авторе:

Меня зовут Андрей Золкин. Из более, чем пятнадцати лет работы в сфере информационных технологий, десять лет работаю с системами, базирующимися на открытом исходном коде. На страницах сайта Aitishnik.Ru веду блоги по CMC Joomla и Debian GNU/Linux.

Особенности

Проброс портов поверх ssh можно использовать для:

  • передачи и редактирования файлов;
  • запуска утилит командной строки или графических приложений;
  • передачи паролей;
  • создания резервных копий;
  • и другого.

Так как ssh шифрует соединение, вы можете использовать его в небезопасных местах. Например, при подключении к общественной точке доступа wi-fi.

SSH Port Forwarding работает только в одном направлении. То есть используя ваше подключение к удалённому серверу, к вам подключиться не получится. Для решения этой проблемы можно настроить обратный ssh туннель.

Ещё одной особенностью является то что он работает только с TCP-пакетами.

Исходный код PuTTY

Для удобства предоставлено несколько версий исходного кода, для различных платформ. Фактически, нет существенной разницы между архивами исходников для Unix и Windows; различия находятся главным образом в форматировании (имена файлов, окончания строк, и т.д.).

Если вы хотите внести свой вклад в разработку PuTTY, мы настоятельно рекомендуем начать с исходного кода Development Snapshot.

Исходный код PuTTY для Windows:

Stable: putty-src.zip (цифровая подпись)
Snapshot: putty-src.zip (цифровая подпись)

Для получения дополнительной информации о компиляции PuTTY из исходников, читайте файл .

Исходный код PuTTY для Linux:

Stable: putty-0.76.tar.gz (цифровая подпись)
Snapshot: putty.tar.gz (цифровая подпись)

Для сборки исходников release-версии, распакуйте архив, перейдите в директорию , и выполните команду:

make -f Makefile.gtk

Для сборки snapshot-исходников достаточно запустить стандартные:

./configure && make

Для дополнительной информации читайте файл .

Доступ к Git

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

Версию исходников master (последнее состояние, с самыми свежими изменениями) можно получить используя команду:

git clone https://git.tartarus.org/simon/putty.git

Также по адресу https://git.tartarus.org/?p=simon/putty.git доступен WWW браузер по репозиторию Git.

Юридическое предупреждение:

Использование PuTTY, PSCP, PSFTP и Plink может оказаться незаконным в тех странах или организациях, где шифрование полностью или частично запрещено. Полагаем, что на данном этапе развития законодательной базы в сфере IT в России и русскоязычных странах, использование применяемых протоколов шифрования не противоречит законам, но мы не юристы, и поэтому, если у вас есть сомнения, вы должны обратиться за юридической помощью прежде, чем загрузить что-либо с этого сайта.

Использование отдельного Telnet-клиента PuTTYtel не ограничено законами о криптографии, так как данные в нём не шифруются.

Удаленное перенаправление портов SSH

Удаленная переадресация портов позволяет вам подключиться с удаленного компьютера к локальному компьютеру. По умолчанию SSH не разрешает удаленное перенаправление портов. Вы можете включить это с помощью директивы GatewayPorts в главном файле конфигурации SSHD: /etc/ssh/sshd_config на удаленном хосте.

Откройте файл для редактирования, используя ваш любимый редактор командной строки.

$ sudo vim/etc/ssh/sshd_config

Найдите требуемую директиву, раскомментируйте ее и установите ее значение , как показано на скриншоте.

GatewayPorts yes

Включение удаленного перенаправления портов SSH

Сохраните изменения и выйдите. Затем вам необходимо перезапустить sshd, чтобы применить последнее изменение, которое вы сделали.

$ sudo systemctl restart sshd
OR
$ sudo service sshd restart

Затем запустите следующую команду для перенаправления порта 5000 на удаленном компьютере на порт 3000 на локальном компьютере.

$ ssh -f -N [email protected] -R 5000:localhost:3000

Как только вы поймете этот метод туннелирования, вы можете легко и безопасно выявить локальный сервер разработки, особенно за NAT и брандмауэрами в Интернете по защищенным туннелям. Аналогичным образом работают туннели, такие как Ngrok, pagekite, localtunnel и многие другие.

Использование пароля

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

Подключение на Windows

Моя основная система — Windows. Раньше для подключения к серверу через SSH я пользовался сторонней утилитой PuTTY, потому что в операционной системе не было встроенного компонента. В «десятке» он появился, так что теперь можно подключаться к SSH через командную строку (cmd).

Чтобы включить встроенный в систему OpenSSH:

  1. Откройте «Параметры» (Win + I) и перейдите в раздел «Приложения».
  2. Выберите опцию «Управление дополнительными компонентами».
  3. Нажмите «Добавить компонент».
  4. Выберите в списке OpenSSH Client и нажмите «Установить».
  5. После завершения установки перезагрузите систему.

Теперь разберемся, как подключиться к SSH через cmd. Запустите командную строку и выполните запрос вида ssh [email protected].

Значение root — логин для подключения, вы получили его в письме при создании сервера. 185.104.114.90 — IP-адрес сервера. Его можно посмотреть в панели управления сервером или в том же письме, которое прислал хостер. У команды может быть также дополнительный параметр -p, после которого прописывается номер порта. По умолчанию используется порт 22. Если у вас настроен другой порт, нужно явно его указать, — например, полный адрес может выглядеть так: ssh [email protected] -p 150.

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

На версиях младше Windows 10 1809 нет встроенной поддержки протокола OpenSSH. В таком случае понадобится сторонняя утилита. Смотрим, как через PuTTY подключиться по SSH:

  1. Запустите PuTTY.
  2. На вкладке Session укажите Host Name (IP-адрес сервера), Port (по умолчанию 22, но если вы в конфигурации сервера указали другой порт, нужно задать его номер).
  3. Убедитесь, что тип соединения установлен SSH.
  4. Нажмите на кнопку Open, чтобы подключиться.

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

Подключение на Linux и macOS

Теперь посмотрим, как подключиться по SSH через терминал на Linux. Для этого не требуется установка дополнительных компонентов, все работает «из коробки».

  1. Запустите терминал. Обычно для этого используется сочетание клавиш Ctrl+Alt+T. Найти терминал также можно по пути «Главное меню» — «Приложения» — «Система».
  2. Выполните команду для подключения. Синтаксис такой же, как на Windows, — ssh [email protected]. Если порт не стандартный, то нужно явно его указать: например, ssh [email protected] -p 150. Вместо root вы указываете свое имя пользователя, а вместо 185.104.114.90 — IP-адрес своего сервера.
  3. Если хост и порт указаны верно, на следующем шаге появится запрос на ввод пароля. При первом подключении также будет предложение добавить новое устройство в список известных. Для этого введите yes и нажмите на клавишу Enter.

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

Если IP-адрес или порт указаны неверно, то на экране появится сообщение об ошибке — Connection Refused. Это может также говорить о том, что доступ запрещен брандмауэром на удаленном сервере (если вы его не отключили). Чтобы разрешить подключение через SSH:

  • на сервере с Ubuntu/Debian выполните команду $ sudo ufw allow 22/tcp;
  • на сервере CentOS/Fedora выполните команду $ firewall-cmd —permanent —zone=public —add-port=22/tcp.

Цифра 22 в синтаксисе — номер порта. Если вы используете другой порт, то укажите его явно.

Если вы знаете как подключиться через SSH на Linux, то справитесь с этой задачей и на macOS. В операционной системе Apple тоже есть встроенный терминал. Синтаксис команды для подключения не меняется: ssh [email protected], где root — ваш логин, а 185.104.114.90 — IP-адрес сервера, с которым вы устанавливаете соединение. 

Настройка RDP — На клиенте

6.28) Запускаем на клиенте mstsc (сперва нужно открыть SSH туннель,
если он был открыт нужно проверить не закончилась ли сессия.

Чтобы не помешать никому работать — можно проверить подключён ли кто-то
к компьютеру или нет. Сделать это можно с помощью

PSTools

инструкция находится

здесь

6.29) Подключаемся к localhost:3391

Вводим пароль

6.30) Соглашаемся

Заметка для OpenBSD

Имеем компьютер в СПб (ПК_СПб), сервер на OpenBSD в МСК (СРВ_МСК) и локальный компьютер,
подключенный к серверу в МСК (ПК_МСК). Цель — подлючиться с ПК_СПб к ПК_МСК
через ssh туннель по rdp с помощью putty из-под Windows.

Local ports accept connections from other hosts

Source port можно выбрать любым из свободных, напрмер 6789. В поле Destination указать

Локальный_ip_ПК_МСК:3389

При подключении по RDP (последняя картинка) можно указать

127.0.0.2:6789

Вложенные SSH туннели

Допускаются вложенные SSH туннели, например:

ssh -L bind_address:port:host:hostport -p 28666 [email protected] \
    ssh -L bind_address:port:host:hostport -p 28666 [email protected]
ssh -L 192.168.0.2:8080:127.1:9999 [email protected] \
    ssh -L 127.1:9999:127.1:80 [email protected]

В этом примере (рисунок ниже) мы бросаем данные с порта 8080 компьютера «А» (192.168.0.2), на локальный хост и порт 9999 компьютера «Б» (8.8.8.8), а сразу после подключения к компьютеру «Б» (8.8.8.8) запускаем на нём ssh клиент, принимаем данные (127.1:9999) и бросаем их дальше на локальный хост 127.1:80 компьютера внутренней сети 10.1.1.2.

Реверс сокс-прокси. По идее офицеры службы безопасности, которые озабочены запретом Интернета на машине 10.1.1.2, должны повыдёргивать на попе все волосы, ибо приведённая ниже команда должна организовать доступ к сети Интернет для машины 10.1.1.2 через сокс-прокси, который запущен на машине «А».

ssh -D 8080 -R 127.1:8080:127.1:8080 [email protected] \
    ssh -R 127.1:8080:127.1:8080 [email protected]

Как редактировать файл на другом компьютере через ssh

Когда нужно отредактировать файл, размещённый на удалённом хосте, было бы здорово, если бы можно было отредактировать его локально так, будто бы это локальный файл. Конечно, можно поднять NFS через ssh туннель для достижения этого, но это было бы слишком излишним для использования один раз. Отсюда вопрос: есть ли способ отредактировать через ssh размещённый на другом компьютере файл?

Вот когда vim (сокращение от «Vi IMproved» — улучшенный Vi) может помочь. vim можно рассматривать как «vi на стероидах», с расширяемыми функциями, которые здорово улучшают дефолтное окружение редактора vi. Расширяемость vim достигается благодаря использованию «плагинов». Один из таких плагинов — это netrw, который задействует чтение и запись файлов по сети. netrw поддерживает различные протоколы уровня приложений, включая ftp, http, scp, rsync и rcp.

Если вы хотите отредактировать удалённый файл через ssh с использованием vim, вы можете сделать так.

sudo apt install vim
vim scp://ПОЛЬЗОВАТЕЛЬ@УДАЛЁННЫЙ_ХОСТ//home/user/path/file

Реальный пример команды:

vim scp://[email protected]//root/prs.txt

Обратите внимание на двойной слеш «» для каталога root на удалённом хосте. Вышеприведённая команда vim откроет файл, размещённый на удалённом хосте для редактирования

За сценой, vim использует scp для получения запрошенного файла с удалённого хоста, размещает файл в /tmp и, наконец, открывает его для редактирования.

Когда вы попытаетесь сохранить изменения в файле, изменения, в первую очередь, будут применены к локальной копии в /tmp, которая затем выгрузиться через scp на удалённый хост.

Поскольку за сценой сетевая передача осуществляется плагином netrw, вы можете редактировать любой удалённый файл транспарентно, используя традиционный интерфейс vi.

Внимание, этот фокус не работает в Cygwin — только в настоящем Linux.

Перенаправление локального порта

Перенаправление локального порта позволяет вам перенаправить порт на локальном (ssh-клиент) компьютере на порт на удаленном (ssh-сервере), который затем перенаправляется на порт на конечном компьютере.

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

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

В Linux, macOS и других системах Unix, чтобы создать переадресацию локального порта, передайте параметр клиенту :

Используются следующие параметры:

  • — IP-адрес и номер порта локального компьютера. Если опущен, клиент ssh привязывается к локальному хосту.
  • — IP или имя хоста и порт конечного компьютера.
  • — удаленный пользователь SSH и IP-адрес сервера.

В качестве можно использовать любой порт с номером больше . Порты с номерами меньше являются привилегированными и могут использоваться только пользователем root. Если ваш SSH-сервер прослушивает порт, отличный от 22 (по умолчанию), используйте параметр .

Имя хоста назначения должно разрешаться с сервера SSH.

Допустим, у вас есть сервер базы данных MySQL, работающий на машине во внутренней (частной) сети, на порте 3306, который доступен с машины , и вы хотите подключиться к базе данных с помощью клиента MySQL на локальном компьютере. сервер. Для этого вы можете перенаправить соединение, используя следующую команду:

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

Теперь, если вы базы данных на компьютере , соединение будет перенаправлено на MySQL через компьютер который действует как промежуточный сервер.

Вы можете перенаправить несколько портов в несколько пунктов назначения с помощью одной команды ssh. Например, у вас есть другой сервер базы данных MySQL, работающий на компьютере , и вы хотите подключиться к обоим серверам со своего локального клиента, вы должны запустить:

Чтобы подключиться ко второму серверу, вы должны использовать .

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

Допустим, вам нужно подключиться к удаленному компьютеру через VNC, который работает на том же сервере и недоступен извне. Вы бы использовали следующую команду:

Параметр указывает команде работать в фоновом режиме, а не выполнять удаленную команду. Мы используем потому что VNC и SSH-сервер работают на одном хосте.

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

Настройка вашего браузера для использования прокси

Теперь, когда вы открыли туннель SSH SOCKS, последний шаг — настроить предпочтительный браузер для его использования.

Fire Fox

Приведенные ниже шаги одинаковы для Windows, macOS и Linux.

  1. В верхнем правом углу щелкните значок гамбургера чтобы открыть меню Firefox:

  2. Щелкните ссылку .

  3. Прокрутите вниз до раздела « » и нажмите кнопку « .

  4. Откроется новое окно.

    • Установите переключатель « ».
    • Введите в поле и в поле .
    • Установите флажок .
    • Нажмите кнопку , чтобы сохранить настройки.

На этом этапе ваш Firefox настроен, и вы можете просматривать Интернет через туннель SSH. Чтобы проверить, вы можете открыть , ввести «какой у меня IP», и вы должны увидеть IP-адрес своего сервера.

Чтобы вернуться к настройкам по умолчанию, перейдите в « , выберите переключатель « » и сохраните настройки.

Гугл Хром

Чтобы запустить Chrome с использованием нового профиля и вашего SSH-туннеля, используйте следующую команду:

Linux:

macOS:

Windows:

Если профиль не существует, он будет создан автоматически. Таким образом, вы можете запускать несколько экземпляров Chrome одновременно.

Чтобы убедиться, что туннель SSH работает правильно, откройте и введите «what is my ip». IP-адрес, отображаемый в вашем браузере, должен быть IP-адресом вашего сервера.

Настройка в Linux постоянного обратного туннеля SSH

Теперь, когда вы понимаете, как создать обратный туннель SSH, давайте сделаем туннель «постоянным», так что туннель поднимался и работал постоянно (независимо от временной повышенной загрузки сети, тайм-аута SSH, перезагрузки хоста релея, и т.д.). Поскольку, если туннель поднимается не всегда, то у вас не будет надежного подключения к вашему домашнему серверу.

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

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

Затем на сервере , откуда начинается туннель, установите программу .

На сервере запустите со следующими аргументами с тем, чтобы создать постоянный туннель SSH, действующий в направлении сервера .

homeserver~$ autossh -M 10900 -fN -o «PubkeyAuthentication=yes» -o «StrictHostKeyChecking=false» -o «PasswordAuthentication=no» -o «ServerAliveInterval 60» -o «ServerAliveCountMax 3» -R 1.1.1.1:10022:localhost:22 [email protected]

Параметр «-M 10900» указывает порт на сервере , для которого будет осуществляться мониторинг и который будет использоваться для обмена тестовыми данными при контроле сессии SSH. Этот порт не должен на сервере использоваться какой-либо другой программой.

Параметр «-fN» перенаправляется в команду , что позволит туннелю SSH работать в фоновом режиме.

Параметр «-o XXXX» сообщает команде следующее:

  • Использовать ключ аутентификации, а не парольную аутентификацию.
  • Автоматически принимать (неизвестные) ключи хоста SSH
  • Каждые 60 секунд обмениваться сообщениями keep-alive.
  • Отправлять до трех сообщений keep-alive без получения каких-либо ответов.

Остальные параметры обратного туннелирования SSH те же самые, что и в предыдущих примерах.

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

Шаг 4. Автоматически восстанавливаем SSH-туннель.

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

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

На серверной части, а именно на Ubuntu-VPS, редактируем конфигурационный файл SSH-сервера ‘/etc/ssh/sshd_config’. В него добавляем (или раскомментируем) следующие параметры:

TCPKeepAlive yes
ClientAliveInterval 30
ClientAliveCountMax 3

И перезагружаем SSH-сервер командой ‘sudo service sshd restart’. Параметр ‘TCPKeepAlive yes’ включает мониторинг работоспособности ssh-подключения. Параметр ‘ClientAliveInterval 30’ проверяет живость клиентского подключения каждые 30 секунд, впрочем, параметр можно установить на усмотрение администратора. Параметр ‘ClientAliveCountMax 3’ означает количество попыток, которые будут произведены с интервалом указанном в ClientAliveInterval до того, как соединение будет закрыто со стороны сервера. В нашем примере, если что-то произойдет с клиентом, например, компьютер просто отключится от сети, то через 90 секунд Ubuntu-VPS закроет туннельное соединение.

При создании туннельного подключения со стороны клиента есть возможность указать аналогичные параметры при подключении. Устанавливаются они через параметр ‘-o’. В нашем случае строка подключения примет следующую форму: ‘ssh -N -o «ServerAliveInterval 30» -o «ServerAliveCountMax 3» -R 8080:localhost:80 [email protected]

Обратите внимание, что параметры на клиенте слегка отличаются от тех, что на сервере

Важно их не перепутать

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

AutoSSH уже входит в репозитории Ubuntu, поэтому устанавливаем ее через ‘sudo apt install autossh’ на сервер-клиент Ubuntu.

После установки AutoSSH наша строка для подключения на Ubuntu примет следующую форму ‘autossh -M 0 -N -o «ServerAliveInterval 30» -o «ServerAliveCountMax 3» -R 8080:localhost:80 [email protected]’. В команде мало что поменялось, ssh заменился на autossh, добавился параметр ‘-M 0’. Изначально предполагалось, что AutoSSH будет мониторить порт (и даже два, один для отправки пакета KeepAlive, второй для его приема), указанный в параметре ‘-M’ на наличие отклика. Этот порт должен быть свободным, да и на той стороне что-то должно отвечать, что, мол, сервис жив, все работает. Но, при наличии KeepAlive в самом SSH, необходимость тратить порты и городить ответную часть — отпала. Поэтому просто выключаем эту функцию через приведенный параметр.

При некоторых пертурбациях на сервере, проброска порта может не состояться, даже если был поднят туннель. То есть, со стороны SSH-сервера и SSH-клиента, все будет выглядеть нормально, туннель будет существовать и работать, но вот порт не будет проброшен от одного сервера к другому. Для автоматической перезагрузки туннеля в таком случае стоит применить дополнительный параметр ‘-o «ExitOnForwardFailure=yes»‘. В таком случае, если возникает проблема с проброской портов, то SSH-туннель будет отключаться. И повторно подключаться через AutoSSH. Результирующая строчка подключения трансформируется в следующее: ‘autossh -M 0 -N -o «ServerAliveInterval 30» -o «ServerAliveCountMax 3» -o «ExitOnForwardFailure=yes» -R 8080:localhost:80 [email protected]’.

Практическая проверка со стороны Linux

3.1 Сбойный прогон

Хорошо, пользователь добавлен, файл autoexec.bat – создан. Давайте попробуем подключиться к системе по SSH от имени этого пользователя:

Ошибка авторизации. Почему? Начальник, знающий Linux в совершенстве, объяснил мне, что ответ на этот вопрос можно найти в файле/var/log/auth.log

Вот этот ответ:

Начальник посоветовал мне написать:

но я, будучи в душе мышевозником, решил поправить атрибуты через утилиту mc, для чего навёлся в ней на файл и выбрал пункт меню «Файл->Права Доступа»:

И надобавлял прав запуска там (вновь установленные флаги отмечены звёздочкой).

3.2 Успешный прогон

Повторяем попытку.

Ошибок нет… Нажимаю «знак вопроса».

Работает! Есть проброс!

Ну всё. Через обычный терминал мы уже можем достучаться. На самом деле, это, конечно, лучше, чем терминал в браузере, но не сильно. Поэтому приступаем к работе из собственной Windows-программы. Ведь цель проброса порта – именно реализовывать сложный обмен своей программы с удалённым контроллером.

Работа со стороны Windows на прочих языках

Как пробросить данные из .NET библиотеки в обычную программу, я расскажу весьма тезисно. Дело в том, что тема, с одной стороны, для полного раскрытия требует ещё одной большой статьи, а текущую, боюсь, уже все устали читать. Так что если вдруг интересно – можно сделать ещё одну. С другой же стороны, тема весьма хорошо документирована, хоть в MSDN, хоть у того же Джеффри Рихтера.

Итак. Для проброса данных между процессами в Windows предусмотрен механизм именованных каналов (Named Pipes). В WIN32 API это функция CreateNamedPipe() с последующими ReadFile/WriteFile. В .NET можно воспользоваться классом NamedPipeClientStream

Правда, разработчик нашей системы сказал (напомню, в этой статье я – простой корреспондент, всё пишу с чужих слов), что очень важно даже для однонаправленного канала задавать направление PipeDirection.InOut. Почему-то у него в иных случаях ничего не работало

Собственно, всё. Создаём канал от .NET к обычному коду и канал от обычного кода к .NET, создаём потоки (на этот раз – которые Thread) и начинаем обмениваться данными.

Муторно? Согласен. Но с организационной точки зрения, так было проще всего. Иначе пришлось бы либо покупать библиотеку для работы с SSH, либо писать свою, что вышло бы сложнее. По крайней мере, так мне сказали.

Заключение

В этой статье было рассказано о том, как можно использовать обратный туннель SSH для доступа к серверу Linux, который находится за брандмауэром или шлюзом NAT, защищающего сеть от внешнего мира. Было продемонстрировано, как это сделать для случая домашней сети с помощью общедоступного виртуального частного сервера VPS. Вы должны быть внимательны при использовании этого приема для корпоративных сетей. Такой туннель может рассматриваться как нарушение корпоративной политики, поскольку он позволяет обойти корпоративные брандмауэры и может открыть корпоративные сети для внешних атак. Существует большая вероятность, что этот подход может использоваться неправильно или с заведомо плохими целями. Так всегда помнить, что прежде всего вы сами ответственны за все настройки, которые вы осуществляете.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: