воскресенье, 4 января 2015 г.

SSH Туннелирование ,проброс портов с помощью ssh


"Если вы видите свет в конце туннеля, то это свет приближающегося поезда", - Роберт Лоуэлл. Еще одна хорошая цитата. Эта статья посвящена построению туннелей с помощью 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 на клиентской стороне.

Комментариев нет:

Отправить комментарий