SSH-туннелирование может помочь не только в вопросах, когда необходимо передать не шифрованный трафик по шифрованному соединению, но и тогда, когда у вас закрыт доступ к ресурсу в сети, но доступ необходим.
Рассмотрим создание и настройку по нескольким вариантам.
И так, у нас имеется сервер, назовём его host-1. К нему у нас есть полный доступ только по SSH – но нам необходимо открыть Tomcat, работающий на порту 8082
– к которому нас никак пропустить не могут.
Рассматривать вариант будем с настройкой Windows и Putty.
Открываем SSH-соединение к нужному серверу, логинимся.
Далее – правой кнопкой клацаем на заголовке окна Putty, выбираем Change settings, переходим в SSH > Tunnels.
Указываем такие параметры:
Source port:
любой неиспользуемый порт в вашей системе;
Destination port:
127.0.0.1:8082
Жмём Add, потом Apply.
Переходим в настройки браузера, и устанавливаем параметры прокси:
Теперь остаётся в браузере открыть страницу 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:
Source port
– оставляем прежний, но вместо Local – выбираем Dynamic. Нажимаем Add, Apply.
Переходим к настройкам браузера:
Обратите внимание, что тип прокси тут не 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:
SSH довольно чувствителен к потерям пакетов, поэтому туннели могут часто обрываться.
Что бы избежать этого – можно либо поиграться с параметрами в файле настроек sshd
– /etc/ssh/sshd_config
:
#TCPKeepAlive yes #ServerAliveInterval #ServerAliveCountMax
Либо – воспользоваться утилитой autossh
:
# yum -y install autossh