Настройка VPN через SSH с использованием Putty во FreeBSD

Сегодня пришлось вспоминать минут 20 как сделать сабж, попарился и решил написать на сайт, для себя как памятку и для других - вдруг кому пригодиться.

Итак, имеем:

компьютер на базе Windows (удаленная рабочая станция, условно КЛИЕНТ);

почтовый сервер (не важно, какой именно, будь то Kerio MailServer, MDaemon или другой, условно СЕРВЕР_ПОЧТЫ в локальной сети - ну предположим, что вам надо с ним работать, а просто так локальный почтовый сервер в мир не подключен);

шлюз (прокси-сервер) в интернет с запущенным сервером SSH (например, FreeBSD или Linux, которые во многих организациях стоят как брандмауэры, условно БРАНДМАУЭР).

Задача: осуществить безопасное (шифрованное) соединение от КЛИЕНТА к СЕРВЕРУ_ПОЧТЫ по протоколу POP3 (получение почты, обычно порт 110). Ну и пусть нам это надо не постоянно, а иногда (иначе надо все-таки настраивать нормальный VPN-сервер).

Решение

Т.к. по умолчанию трафик по протоколу POP3 передается открытым текстом, а мы передаем очень секретный пароль от почтового ящика, то почтовый трафик надо шифровать :) Чем мы будем его шифровать? Поднимать специальный VPN-сервер, редирект портов, настраивать сертификаты и прочее - часто не выход, т.к. это сложно даже для большинства системных администраторов, к тому же, как сказано чуть выше, нам все это надо для периодических сеансов работы, возможно, только для нас и нужных ;)

Мы будем делать соединение между КЛИЕНТОМ и СЕРВЕРОМ_ПОЧТЫ внутри шифрованного содинения по протоколу ssh.

Шаг 1.

Возьмем бесплатный клиент ssh для Windows - Putty - и установим его на КЛИЕНТА (по умолчанию, в папку "C:Program FilesPutty").

Шаг 2.

Далее установим зашифрованное соединение между КЛИЕНТОМ и БРАНДМАУЭРОМ так, чтобы для КЛИЕНТА работа с почтой внутри локальной сети была бы точно такой, как если бы он (клиент) был бы у себя в офисе.

У КЛИЕНТА запускаем консоль: Пуск -> выполнить -> cmd

В консоли набираем команды:

cd C:Program FilesPutty

putty.exe -v -ssh -2 -P 22 -C -l user -pw password -L 8110:192.168.1.10:110 81.222.111.10

где "-v" - т.н. verbose режим, с расширенными комментариями, "-ssh -2" - использовать протокол ssh версии 2, "-P 22" - порт, открытый на БРАНДМАУЭРЕ для подключения по ssh, "-C" - использовать сжатие, "-l user" - имя пользователя, который имеет право входить на сервер ssh на БРАНДМАУЭРЕ, "-pw password" - пароль этого пользователя,

далее (я специально сделал отступ от предыдущего текста):

"-L 8110:192.168.1.10:110" - локальный порт, который будет доступен на компьютере КЛИЕНТА, а 192.168.1.10 - локальный ip-адрес почтового сервера внутри организации, 110 - соответственно, порт POP3 на этом сервере;

"81.222.111.10" - внешний ip-адрес БРАНДМАУЭРА, к которому и будет соединяться КЛИЕНТ по ssh с помощью putty.

После набора последней команды (putty.exe -v -ssh -2 -P 22 -C -l user -pw password -L 8110:192.168.1.10:110 81.222.111.10) откроется окно сеанса связи по протоколу ssh. Все, окно сворачиваем (не закрываем!), и настраиваем нашу почтовую программу на получение почты с адреса localhost и портом 8110, а не 110, который стоит по умолчанию.

Вроде бы все. Во время получения почты почтовая программа будет соединяться с портом 8110, который будет переадресован на удаленный почтовый сервер в офисе, при этом весь трафик соединения будет зашифрован. Завершить сеанс связи можно просто закрыв окно сеанса putty. После этого локальный порт 8110 уже не будет доступен.

Можно добавить, что похожим образом можно соединяться не только к почтовому серверу, но и к другим сервисам, например, я таким образом соединялся с RAdmin, установленным на компьютере в локальной сети, при этом никаких port-мапперов на самом шлюзе делать не надо. Вот что самое хорошее! Достаточно иметь актуальную версию сервера ssh на шлюзе и, желательно, фильтровать на брандмауэре подключения к порту 22 (ssh), например по ip-адресу, если у вас дома или где там еще подключение к интернет постоянное. Но это уже мелочи жизни и тема другой статьи.

Вообще у ssh и putty, есть ооочень много всяких разных приятностей, которые здесь не упомянуты. Надеюсь, эта статья подтолкнет вас к небольшому исседованию, начать которое очень просто: http://www.google.ru/search?complete=1&hl=ru&newwindow=1&q=ssh&lr=&aq=f.

Кроме того, упомянутые в статье программы (за исключением почтовых серверов и ОС самого клиента ;)) являются бесплатными и свободно распространяемыми, а стремление быть легальным и бесплатным - хороший стимул приглядеться к реализации подобного безопасного соединения через ssh.

И еще, конечно же, при написании этой заметки я использовал другие ресурсы для "освежения" памяти. Вот самая полезная ссылка, которая и стала финальной в моих тестовых экспериментах перед опубликованием статьи: http://wiki.kaytaz.ru/doku.php/ssh-tunnel_cherez_putty.

Примечания (составлены по итогам комментариев на 27.03.2008)

1. (isx) Если туннель простаивает некоторое время, то соединение рвется, потому стоит поменять параметры сервера: TCPKeepAlive. Увеличить LoginGraceTime, выставить ClientAliveInterval и ClientAliveCountMax. Убрать UseDns, иначе длительные ожидания при установке соединений.

2. (isx) А отчего не сделаешь все через ssl? Если не хочется возиться с почтовиком, то можно воспользоваться программой stunnel, поднимая ее на шлюзе(брандмауэре). // Stunnel (http://stunnel.mirt.net/) использует OpenSSl или SSLeavy для шифрования трафика. Используется для установления шифрованных тонелей связи между клиентом и сервером. Работает в Linux, Windows, OS/2 и прочих осях.

3. (Serg) Если человек не админ брендмауэра - могут быть проблемы. Кто-то может гарантировать, что в настройках sshd не выключен форвардинг и/или туннелирование? // Действительно, к данному решению надо подходить взвешенно и понимать, что указанный способ туннелирования действительно больше всего подходить только для админа.

Обновлено: 12.03.2015