Предположим типичную для системного администратора задачу - есть сервер где-то в глубине сети, на который нужно попасть, предположим, по http, но консольный lynx/elinks не подходит, а нужен именно Safari/Firefox/Chrome (например, сайт на flash или нужна Java). Причём прямого доступа с ноутбука из Интернет на этот сервер нет, но есть “jumpbox” (сервер, исключительно через который открыт доступ по ssh в закрытую сеть). У меня такая ситуация была, когда нужно было попасть на IP-KVM внутри закрытой firewall’ом сети (я использовал ssl, но здесь для простоты покажу на примере порта 80).
Итак, имеем:
- notebook. Находится в Интернет.
- server1 (8.8.8.9). На него разрешён доступ по ssh (желательно использовать технику port-knocking для предоставления доступа к ssh только после нескольких запросов на разные порты этого сервера, иначе отбой).
- server2 (9.9.9.1). Шлюз сети, но по ssh из Интернет на него попасть нельзя, на него открыт доступ по ssh исключительно с server1. Второй интерфейс сервера смотрит во внутреннюю сети и с него есть доступ на webserver
- webserver (10.10.10.2). Доступ на web-сервер есть только из внутренней сети, в частности с server 2
Задача: с notebook получить доступ к webserver по http.
Шаг 1. На ноутбуке строим ssh-туннель на server1 (конечно же, туннелирование не должно быть запрещено в /etc/sshd_config - параметр PermitTunnel по умолчанию включен)
ssh user_on_server1@8.8.8.9 -L 2000:9.9.9.1:22 -N
Начало туннеля на ноутбуке (localhost, порт 2000), конец - на server2 на порту 22.
-N - не выполнять команды на удалённом хосте, полезно для туннелирования.
Шаг 2. Строим второй туннель поверх первого туннеля на webserver. Заметьте, что при соединии на порт 2000 на localhost соединение пробрасывается на 9.9.9.1 порт 22 (server2, и нужно вводить пароль пользователя именно на server2):
ssh -p 2000 user_on_server2@localhost -L 80:10.10.10.2:80 -N
Учтите, что web-sharing на ноутбуке должен быть отключен, иначе соединение не установится. Если же отключить его нельзя, то можно перекинуть на другой порт начало туннеля. Получили туннель с началом на localhost, порт 80, и концом - на порту 80 webserver’а.
Шаг 3. Запускаем браузер и указываем http://127.0.0.1. Поверх двух туннелей заходим через Интернет на web-сервер во внутренней сети.
Если на web-сервере явно прописано имя сайта, как в wordpress (например, www.site.com), то первый же линк сайта уведёт с localhost на www.site.com. Если такое случилось, то делаем трюк, явно пишем в /etc/hosts:
127.0.0.1 www.site.com
Главное потом убрать эту строку, когда понадобится прямой доступ.
Туннелирование очень мощный инструмент, но с первого раза просто запутаться. Пару экспериментов - и всё станет понятно. Конфигурацию с web-сервером я привёл для примера. Точно так же можно организовать проброс для соединения с сервером Windows по RDC, на VPN SSL-сервер и т.п.