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.
Ещё один пример — у нас есть тот же внешний сервер, с которого есть нормальный доступ к любым ресурсам в Сети. А вот с рабочего места у нас доступ к 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
Источник http://rtfm.co.ua/ssh-tunneli-v-primerax/