SSH Туннелирование - VPN для бедных гиков

http://www.linuxjournal.com/content/ssh-tunneling-poor-techies-vpn

Mar 28, 2012 By Jayson Broughton
in HOW-TOs SysAdmin

"Если вы видите свет в конце туннеля, то это свет приближающегося поезда", - Роберт Лоуэлл. Еще одна хорошая цитата. Эта статья посвящена построению туннелей с помощью SSH, или, как я называю эту тему, "VPN-туннелям для бедных". Несмотря на основные верования системных администраторов, туннели SSH на самом деле могут быть весьма полезной вещью как для технарей, так и для домашнего использования. Я сказал "несмотря на верования сисадминов" потому, что реверсивные туннели или завернутый в SSH веб-трафик могут продираться через межсетевые экраны и контентные фильтры. Статья, однако, не про то, как вам повергнуть корпоративную политику безопасности, а про то, как SSH-туннелирование может сделать нашу жизнь чуть-чуть менее сложной.

Почему SSH туннели вместо VPN? Ок, я использую дома то и то. Если вы следили за моими сообщениями на jaysonbroughton.com, то знаете, что у меня в работе трехфакторая аутентификация OpenVPN (имя пользователя, сертификат и одноразовый пароль). Но если я хочу проверить один из серверов под моим управлением через Андроид, или заглянуть в компьютер, на котором я не имею административных прав (а они нужны портативному OpenVPN-клиенту), или даже хочу исправить какие-то ошибки с помощью vnc-доступа поверх SSH-туннеля, тогда SSH - мой выбор способа обезопасить трафик.

Мы обсудим базовые вещи: как построить туннель, что означает тот или иной синтаксис команды, разберем примеры реверсивных туннелей и ситуации, в которых вы должны использовать тот или другой подход. Я также поверхностно пробежался по структуре конфигурационног файла.

Итак, о системных требованиях. Я использую Дебиан в виртуальной среде, поэтому ваши результаты могут отличаться от моих. Поэтому привожу информацию о инструментах: эксплуатируется сервер OpenSSH_5.3p1 и различные по версиям клиенты OpenSSH 5.X. Перед тем, как погрузиться в глубины ssh-туннелирования должен сказать: перед тем, как проковырять дыру в безопасности компании с помощью реверсивного туннеля или заворачивания http-трафика убедитесь, что вы не нарушите какого либо стека внутренних регламентов типа Internet Acceptable Use Policy. Понятно, что в этом случае Системные Администраторы немедленно выследят и поджарят вас, особенно если вы используете туннель для попадания на сервер на работе из дома. В качестве Системного Администратора сам я получаю немалое удовольствие, обнаружив таких персонажей. Поверьте, при небольшой проверке выяснится, что системные администраторы вовсе не держиморды.

Ну вот, дисклаймер озвучен, можно приступать.

Построение SSH-туннелей довольно несложная вещь. Понимание того, что происходит и изучение подходов может оказаться несколько сложнее. Поэтому я дам несколько типичных случаев для настройки сознания перед тем, как мы перейдем к подробностям команд. До того, как у меня появились дети, я довольно много путешествовал. В своих путешествиях мне приходилось оказываться в весьма странных отелях, в комнатах которых были весьма странные Wi-Fi точки доступа. Вы действительно захотите коннектится к точке доступа отеля, у которой SSID набран непереводимой абракадаброй? Или в аэропорту, где несколько открытых сетей? Когда я где-то во внешнем мире, предпочитаю туннелировать веб-трафик на свой рутованный андроид через домашний сервер. Когда у меня в руках мой лэптоп, я открываю ssh-туннель и перенаправляю веб-трафик через socks5 так, чтобы весь входящий ко мне поток был шифрованным. Я доверяю открытым WAP лишь постольку, поскольку могу через них ходить. Что еще об открытом тексте? Я туннелирую SMTP трафик на своем компьютере через домашний сервер когда в некоторых местах вижу, что исходящий SMTP блокируется. Похожая ситуация с POP3. Другой пример: можно управлять X-приложениями через туннель. Можно заворачивать в туннель VNC-сессии. Одна из техник, которую я начал использовать раньше других - это реверсивные туннели. В этом случае вы создаете туннель от сервера, который находится за межсетевым экраном. Когда вы заходите на тот SSH-сервер, вы можете восстановить соединение.

Примеры

Перед тем, как глянуть со стороны клиента, нужно выполнить некоторые вещи на стороне сервера с помощью редактирования конфигурационного файла sshd.config, где я советую произвести указанные ниже изменения. Перед внесением изменений скопируйте оригинальный конфиг для сохранности, если что-то пойдет не так как задумано.

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig

Собственно, конфигурация:

# Принудительно будем использовать версию протокола SSH 2
Protocol 2

#Включим разделение прав для безопасности
UsePrivilegeSeparation yes

#Запретим логин под рутом
PermitRootLogin no

#Запретим пустые пароли
PermitEmptyPasswords no

#Разрешим форвардинг X-сессий
X11Forwarding yes
X11DisplayOffset 10

#Ненавижу Motd-дисплеи
PrintMotd no

#Включим отслеживание TCP-сессий
TCPKeepAlive yes

Если внесли изменения, должны перезапустить sshd-сервер для их применения.

Перейдем к ключам командной строки.

Типичный ssh-туннель (без туннелирования Х-протокола) выглядит примерно так:

ssh -N -p 22 bob@mylinuxserver.xxx -L 2110:localhost:110

Где:

-N
запрет на выполнение удаленных команд.

-p 22
внешний порт SSH сервера. Рекомендую использовать другой порт, чтобы не доставали боты, пытающиеся сломать сервер.

bob@mylinuxserver.xxx
это конструкция имя_пользователя@адрес_сервера(или доменное имя сервера).

-L 2110:localhost:110
информация привязки. Структура: порт_клиента:имя_хоста:порт_сервера . В этом примере мы привязываем POP3 порт сервера на порт 2110 своего локального компьютера.

Несколько полезных примеров.

Пробросить POP3 и SMTP через SSH:

ssh -N -p 2022 bob@mylinuxserver.xxx -L 2110:localhost:110 -L 2025:localhost:25

Транслировать Google Talk через SSH:
(-g позволяет удаленным хостам устанавливать соединение с локальными портами перенаправления):

ssh -g -p 2022 -N bob@mylinuxserver.xxx 5223:talk.google.com:5223

Вообще, все что пересылается в виде открытого текста, можно обезопасить путем заворачивания в туннель SSH. Установив туннель, вы должны на клиентской стороне выставить имя хоста как localhost и порты, какие вам нужны, будь то 2110,2020,5223 или любые другие.

Зашифруйте свой HTTP трафик

Еще одна тема для дисклаймера. Если вы работаете в компании, которая имеет политику безопасности для пользователей, проверьте документ, перед тем как делать это.

Я это проделываю, будучи где угодно за городом или в месте, где есть беспроводная точка доступа, которым я не доверяю. Если у меня с собой Андроид-планшет, я использую приложение SSHTunnel. На ноутбуке же ввожу команду как показано ниже:

ssh -D 5222 bob@mylinuxserver.xxx -N

После установления соединения, скажите своему браузеру заглянуть на localhost:5222. Это создаст динамический порт и туннелирует весь трафик приложения через ваш SSH-сервер, шифруя ваши данные и вместе с тем проникая через контекстные фильтры.

Туннелирование Х протокола и сессий VNC

Помните птичку 'X11Forwarding yes' в конфигурационном файле? Это то место, где обеспечивается туннелирование протокола Х-сервера.

ssh -X -p 2022 bob@mylinuxserver.xxx

Как можно догадаться, опция -X обеспечивает туннелирование Х. Помните однако, что команда обеспечит туннелирование вашего приложения с вашей удаленной машины на вашу клиентскую машину с Линуксом. Если же вы в Виндоус, просто установите Cygwin/X (http://x.cygwin.com/) на вашу гостевую машину. Я сам этого не пробовал, но как понимаю это должно помочь запустить удаленное Х-приложение в Виндоус.

Когда вы переходите к установлению VNC-сессий, нужно быть осторожным. Если удаленный сервер с VNC запущен на 5900 порту, впоследствии убедитесь, что вы не подключились к самому себе. Сама же сессия туннелируется как и в других случаях с помощью прозрачной команды:

ssh -p 2022 bob@mylinuxserver.xxx -L 5900:localhost:5900

В этом примере мы подключаемся к внешнему порту SSH-сервера 2022 под логином bob к серверу mylinuxserver.com. Ваш локальный порт для форвардинга 5900, порт, который вы хотите пробрасывать - 5900 на указанном сервере. Установив канал, подключайтесь с помощью своего любимого клиента VNC на localhost:0 . Если вы, скажем, решили использовать порт 5901, тогда адрес подключения будет localhost:1, и так далее.

Реверсивные SSH туннели

Моя любимая фишка в SSH-туннелирвании. Действительно, доступ к сервисам через SSH, например, шифрование всего HTTP-потока, это прикольно. Но реальный сюрприз нас ждет в тот момент, когда мы понимаем, что можем обратить, реверсировать туннель. Как я уже говорил, если вы за межсетевым экраном, который не имеет SSH-сервера, но нуждаетесь в доступе и не желаете устанавливать VPN-соединение, что вам делать? Время от времени мне бывает нужно обеспечить такой сеанс своим родственникам или знакомым. В этом случае вы можете подсоединиться к вашему SSH-серверу, затем обратить туннель путем присоединения к этому открытому соединению. Для этого родственник может запустить сессию putty с сохраненными параметрами, присоединившись к SSH-серверу под определенным пользователем без прав. Когда туннель установлен, я могу с помощью VNC попасть на такую удаленную машину.

Шаги для установления реверсивного туннеля следующие.
С клиентской машины:

ssh -R remoteport:localhost:22 username@servername

Для более ясного примера подставим в команду реальные параметры:

ssh -R 2048:localhost:22 bob@mylinuxserver.xxx

На стороне сервера для переустановления туннеля:

ssh -p 2048 localhost

И вот вы его заимели, реверсивный туннель.

Для наглядности daddoo и nerdboy4200 из #linuxjournal объединили свои усилия и создали Mscgen, это программулина, которая парсит последовательность сообщений и строит наглядную диаграмму обмена сообщениями для разных протоколов. Она конечно, опенсорсная и довольно ужасна на вид ( http://www.mcternan.me.uk/mscgen/ ). Для случая реверсивного туннеля с помощью своего поделия они построили диаграмму (далее автор вставил в свой текст диаграмму, на которой ничего не видно - прим. перев.).

Заключение

Итак, то, что вы можете наворотить с помощью туннелирования ограничено лишь вашим воображением, здесь мы только дали несколько примеров. Возможно, в последующих постах я расскажу, как правильно настроить SSH на клиентской стороне.

______________________

www.jaysonbroughton.com



Назад в тематический каталог
Назад на страницу переводов из Linux Journal