Когда-то краем уха слышал, что посредством ssh можно делать удивительные вещи, такие как проксирование, порт форвардинг и иже с ними. Не знаю, мож кто-то и использует эти возможности, но я нет.

Вот чего-то сегодня потянуло разобраться с этими фичами, в жизни может всё пригодится. Как оказалось, такие чудеса может вытворять не только nix-овый клиент openssh, а и виндовая putty. Помимо всего прочего, траффик через такой туннель будет автоматически закриптован, ну и, возможно, сжат. Последняя возможность, как мне кажется, может быть очень востребована любителями использования мобильного GPRS-Интернета или любителями беспроводных сетей.

Итак, всё по порядку.

SOCK v4 proxy

Начинаю с самой полезной возможности (по моему скромному мнению). Для использования ssh в качестве SOCK4-прокси всего-навсего достаточно одного ключика: -D, после которого нужно указать номер порта, который будет открыт на локальном loopback адресе(127.0.0.1).

ssh -D 1080 remote.host.name

После входа на remote.host.name у нас будет полнофункциональный SOCK4 сервер!

Теперь настраиваем свой браузер (либо другое ПО, умеющее работать с данным протоколом) на использование localhost:1080 и наслаждаемся жизнью, работая по криптованому каналу. Дополнительно можно использовать ключ (openssh) для компрессии траффика.

Для того, чтобы воспользоваться данной возможностью в putty, нужно сделать следующим образом. Настраиваем и сохраняем сессию (скажем с именем mysession). Далее, запускаем putty со следующими параметрами:

putty -D 8080 -load mysession

К бочке мёда можно прибавить ложку дёгтя. Протокол SOCK4 не поддерживает DNS. Так что в любом случае нужно иметь доступ к серверу имён.

Туннелирование и порт-форвардинг

Данная возможность может быть использована нами в ряде случаев. Например, для шифрования своего траффика для доступа к серверу (почтовому, веб-серверу, …, придумайте что-то сами :)). Либо для доступа к сервисам, которые закрыты брендмауэром, стоящим в локальной сети. Следует помнить, что при запуске нижеприведенных команд в unix-like OS, для привязки к привилегированным портам необходимы права root на локальной машине. Запуск ssh-туннеля:

ssh -f -N -L 110:pop3server:110 user@pop3server

Ключ -f заставляет ssh работать в фоновом режиме, ключ -Nпозволяет не выполнять команду на удалённом хосте. Цитата из мана: «…Do not execute a remote command. This is useful for just forwarding ports (protocol version 2 only)…». Без этого ключа ssh не захочет просто так уходить в фоновый режим.

В параметрах ключа -L первым указываем локальный порт, потом указываем хост и порт, к которым осуществляется привязка.

Т.е. в указанном выше примере, на нашем локальном хосте откроется 110 порт, при обращении к которому мы попадём на pop3server:110.

Возможен вариант, при котором мы разрешаем пользоваться нашим туннелем другим клёвым перцам с других хостов. Для этого нужно добавить ключ -g (аllows remote hosts to connect to local forwarded ports) и использовать немного видоизменённый вариант ключа -L с указанием конкретного адреса, на котором необходимо открыть порт (а по умолчанию он открывается на 127.0.0.1):

ssh -f -N -g -L localaddress:110:pop3server:110 user@pop3server

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

ssh -f -N -L 25:freemail.ukr.net:25 user@mysshost

Единственное, что нужно отметить — траффик будет криптоваться лишь от локальной машины к ssh-серверу.

Для putty всё запускается аналогично.

putty -L 110:pop3server:110 -load mysession

Мы можем проделать и обратную процедуру: открыть на удаленном хосте порт, при обращению к которому, произойдет перенаправление к указанному порту на локальной машине. Для этого используется ключ -R. Предположим, что у нас на локальной машине, на порту 8181 запущен веб-сервер.

Тогда команда

ssh -f -N -R sshost:8080:localhost:8181 user@sshost

откроет на хосте sshost порт 8080 и все подключения к этому порту перенаправит нам на локальную машину.

Запуск putty аналогичен вышеуказанным.