SSH-туннели в примерах

Автор: | 14/11/2013
 

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

Рассмотрим создание и настройку по нескольким вариантам.

И так, у нас имеется сервер, назовём его host-1. К нему у нас есть полный доступ только по SSH – но нам необходимо открыть Tomcat, работающий на порту 8082 – к которому нас никак пропустить не могут.

Рассматривать вариант будем с настройкой Windows и Putty.

Открываем SSH-соединение к нужному серверу, логинимся.

Далее – правой кнопкой клацаем на заголовке окна Putty, выбираем Change settings, переходим в SSH > Tunnels.

Указываем такие параметры:

Source port: любой неиспользуемый порт в вашей системе;
Destination port: 127.0.0.1:8082

uat_tun_1

Жмём Add, потом Apply.

Переходим в настройки браузера, и устанавливаем параметры прокси:

uat_tun_3

Теперь остаётся в браузере открыть страницу http://localhost:3002 – и попадаем на страницу Tomcat на сервере host-1.

Если туннель не работает – проверьте на сервере, включена ли пересылка пакетов. В файле /etc/ssh/sshd_config найдите и раскоментируйте строку:

AllowTcpForwarding yes

И перезапустие SSHd:

# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]

Ещё один пример – у нас есть тот же внешний сервер, с которого есть нормальный доступ к любым ресурсам в Сети. А вот с рабочего места у нас доступ к http://youtube.com и http://facebook.com закрыт.

Выполняем похожие действия, но с небольшими отличиями. Настройки в Putty:

uat_tun_4

Source port – оставляем прежний, но вместо Local – выбираем Dynamic. Нажимаем Add, Apply.

Переходим к настройкам браузера:

uat_tun_5

Обратите внимание, что тип прокси тут не HTTP – а SOCKS.

Наслаждаемся доступом к любимым сайтам.

И более интересный случай.

Имеем прежний host-1. Кроме него – второй сервер, назовём его host-2. Кроме этого – у нас есть машина с Windows, которой необходимо предоставить доступ к ресурсу TeamCity на сервере host-1 на порту 8111. При этом – доступ с Windows-машины у нас есть только к серверу host-2, и только на 22-ой порт.

Для начала – поднимаем туннель между host-1 и host-2. Выполняем на host-1:

$ ssh -f -N -R host-2:8082:localhost:8111 username@host-2

Так мы открываем туннель, который локально (на host-1) смотрит на порт 8111, а с другой стороны – машина host-2, на которой открывается порт 8082, и ждёт входящих соединений. При получении пакетов на порт 8082 (при чём – только по интерфейсу lo0! это важно) – он будет их перенаправлять на машину host-1 порт 8111.

Что касается интерфейса lo0. При установлении SSH-туннеля, даже при указании внешнего IP машины – соединение поднимается только с localhost, т.е. 127.0.0.1.

Посмотрим на host-2:

$ netstat -anp | grep 8082
tcp        0      0 127.0.0.1:8082          0.0.0.0:*               LISTEN      -

Что бы изменить это – необходимо отредактировать файл конфигурации демона sshd/etc/ssh/sshd_config и изменить параметр:

#GatewayPorts no

Но сейчас мы этого делать не будем, это просто заметка.

Продолжим. Переходим к настройке Putty на нашей Windows-машине. Тут всё просто – пользуемся примером 1 из этой статьи, только меняем порт на нужный (в скриншоте, кстати, он и есть). Подключаемся Putty к хосту host-2, настраиваем tunnel. В браузере меняем настройки proxy – и получаем необходимое, указываем адрес http://localhost:3002:

uat_tun_6

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

Что бы избежать этого – можно либо поиграться с параметрами в файле настроек sshd/etc/ssh/sshd_config:

#TCPKeepAlive yes
#ServerAliveInterval
#ServerAliveCountMax

Либо – воспользоваться утилитой autossh:

# yum -y install autossh