вторник, 27 декабря 2016 г.

SSH туннель между двумя узлами

Возникла необходимость организовать канал связи между двумя компьютерами из разных мест (work и home), между которыми есть интернет, но нет внешних ip и один из них (work) находится за http proxy.
Имеем: 
work - рабочая станция, выход в интернет через прокси (доступны порты 80 и 443)
vds - виртуальный сервер с внешним ip
home - домашняя рабочая станция, доступ в интернет посредством 4g модема без внешнего ip

Идея заключается в использовании vds в качестве промежуточного звена для связи work и home. Для этого пробрасываем обратный ssh туннеля с work на vds. Далее с home получаем доступ к work через vds.

Настройка.

vds

1. /etc/ssh/sshd_config
Port 443
sudo service sshd restart
Со стороны work открыты только 443 и 80 порты.
2. /home/vds_user/.ssh/config
Host localhost # for work pc over tunnel
   HostName localhost                                  Port 4321    IdentityFile ~/.ssh/work # ключи не обязательны, но очень удобны и безопасны

3. При разрыве соединения по ssh, например, из-за сбоя с интернетом, на стороне сервера остаются открытые сокеты. Виной тому настройки ssh по умолчанию, который ожидает восстановление связи. Но аutossh со стороны клиента work будет пытается создать новое соединение при обнаружении обрыва. Сделать это не сможет из-за того, что на сервере порты заняты предыдущим подключением. Поэтому необходимо разрывать соединение ssh на сервере, чтобы освободить порты. Указываем серверу ssh разрывать соединение в случае бездействия или отсутствия клиента: в файле /etc/ssh/sshd_config устанавливаем параметры
Protocol 2
TCPKeepAlive yes
ClientAliveInterval 10
ClientAliveCountMax 2

sudo service sshd restart


work

1. /etc/ssh/sshd_config
Port 4321
sudo service sshd restart
2. /home/work_user/.ssh/config
Host vds
  HostName VDS_IP_ADDRESS
  Port 443
  ProxyCommand corkscrew PROXY_HOST PROXY_PORT %h %p /home/work_user/.ssh/corkscrew_proxy_auth # команда для подключения по ssh через http proxy
  IdentityFile ~/.ssh/keys/vds # ключи не обязательны, но очень удобны и безопасны

ps создать пару ключей можно командой ssh-keygen -t rsa

скопировать на сервер: ssh-copy-id -i KEY vds_user@vds

3. Проверяем соединение по ssh work к vds:

ssh vds_user@vds

4. Настраиваем обратный ssh туннель

autossh -M 59001 -f -g -N -R 4321:localhost:4321 vds_user@vds -p 443
ps команду autossh можно обернуть сервисом

5. Проверяем соединение по ssh от vds к work

ssh work_user@localhost -p 4321

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


home

1. Добавить в ~/.ssh/config правила 
Host vds 
   User vds_user
   HostName vds
   Port 443
   IdentityFile ~/.ssh/keys/vds


Host work 
   User work_user 

   HostName localhost
   Port 4321
   ProxyCommand ssh vds -W %h:%p


Подключаемся при помощи команды:
ssh work

Подключиться из home к work можно другими способами, но, имхо, менее удобными:
1. Пробросить еще один туннель и ходить к work по сути через два туннеля
ssh -L 1234:localhost:4321 vds_user@vds # туннель
Подключение к work опосредовано через vds:
ssh work_user@localhost -p 1234
Трафик через два туннеля пойдет к work
2. Подключиться по ssh к vds и далее еще по одному ssh к work. Можно это сделать одной командой:
ssh -t vds_user@vds ssh work_user@localhost
  

Комментариев нет:

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