DNS tunneling over 53 udp and ssh

Материал из AlexNook
Перейти к: навигация, поиск

Если вы столкнулись с проблемой урезания трафика вашим провайдером, или злым админом, или родителями или ещё кем-то, когда некоторые порты закрыты, когда доступ к некоторым веб сайтам обрезан, когда вырублена аська и тому подобное, то возможно данное решение вам поможет.

Приготовления к созданию тунеля через 53 порт

Если вас урезали дальше некуда фаерволами и другими программами, и не оставили открытым почти ничего кроме нескольких веб сайтов и пары основных портов, то выход есть. Практически во всех случаях остаётся открытым порт 53TCP/UDP по которому идут DNS запросы, без которых как правило работать нельзя. Эти запросы помогают человеку не помнить кучу IP адресов ресурсов, или же размещать на одном IP несколько разных веб ресурсов, например, сайтов.

Если порт 53 открыт, то шанс поднять зашифрованный Socks туннель есть. Для этого нужно иметь:

  • Сервер, который имеет полный доступ в сеть, который не ограничен админами, и трафик которых не фильтруется на выход.
  • На сервере должна быть возможность устанавливать программное обеспечение
  • Должен быть доступ к серверу по ssh.

Для примера я буду использовать сервер на котором стоит Gentoo Linux в качестве удалённой машины, которая имеет выход в интернет, неограниченный фаерволлами и на котором не режется трафик.

В качестве компьютера, который находится в локальной сети, где идёт жёсткий контроль трафика и режутся все соединения прокси сервером или фаерволом будет выбран обычный комп под управлением ОС Windows 7 64 bit.

Описание схемы работы тунеля

В кратце постараюсь описать функционирование тунеля.

Т.к. у нас на нашей машине, которая запрятана за фаерволом открыт порт 53, то весь трафик мы будем пускать именно по этому порту. Соединяться по этому порту мы будем с нашим сервером, который стоит во вне, и именно он будет обслуживать все наши запросы, перенаправляя их куда следует. Рассмотрим краткий пример такой транзакции. Мы посылаем запрос с нашего Windows компьютера на 53-й порт, адресованный нашему серверу, тот в свою очередь принимает его и переадресует уже по абсолютно другому адресу и другому порту, который как раз и может быть заблокирован на нашей Windows машине. Далее получив ответ от третьего сервера, наша машина в интернете переправляет его обратно нам на нашу Windows машину. Всё вроде просто: 53 порт открыт, пы через него общаемся с посредником, который имеет полную связь с внешиним миром, который в свою очередь транслирует наши запросы куда нам будет угодно, не забывая возвращать ответы.

Всё кажется хорошим, но есть одно но, весь трафик идёт полностью открытым, и любому легко будет его перехватив просмотреть. А именно тем лицам, которые и ограничивают использование интернета на нашей Windows машине. Вторым но является неудобство того, что надо каждый раз при создании сеанса указывать а куда именно наш посредник в интернете должен перекидывать запрос, сперва это может быть сайт Yandex.ru, но потому нам может понадобится Google.com и т.д. Что делать. Решение проблемы простое - это поднятие внутри нашего тунеля ещё одного, который будет идти по протоколу ssh. Это решит вопрос шифрования, а т.к. программа putty позволяет легко динамически перекидывать порты, мы ещё и получим socks прокси, который нам позволит выходить динамически на нужный нам порт и нужный адрес в сети.

Установка необходимого программного обеспечения

Какое же программное обеспечение нам потребует? Рассмотрим оба компьютера, как под Windows, так и под Gentoo.

Самое важное и первонеобходимое, что нам нужно это крохотная програмка, которая и будет выполнять всё чёрную работу по поднятию первого, основного туннеля - PingTunnel. Так же нам потребуется ssh демон, а так же клиентское ПО для соединения по ssh из-под Windows - putty.

Note: Поднятие соединения под Linux с динамическим перебрасыванием портов под Linux выполняется одной командой:

Установка программ под Gentoo

Нам необходимо поставить PingTunnel

emerge -v net-proxy/pingtunnel

Установка программ под Windows

Под Windows на понадобится putty, драйверы WinPcap, а так же PingTunnel (Запуская программу с различными опциями мы можем давать ей выполнять роль демона или клиента).

Прикрепляю версии программ (бинарники), которые я использовал для тестирования под Windows 7 64 bit.

Устанавливаем всё необходимое программное обеспечение, указанное выше. Никаких особенностей в этом нет.

Запуск и настройка программного обеспечения

Данный раздел содержит все те шаги, которые надо выполнить по настройке программ под Gentoo и под Windows.

Настройка и запуск демона PTunnel под Gentoo

После этого можно запустить screen и уже внутри стартовать необходимую программу. Это поможет нам видеть, все её информационные сообщения.

screen

Теперь запускаем сам PTunnel:

ptunnel -udp -x PASSWORD
Первая опция
-udp
показывает, что мы будем работать с 53 портом udp (без этой опции программа по умолчанию будет работать с ICMP 'echo') Вторая опция
-x PASSWORD
задаёт пароль на соединение с нашим прокси сервером как PASSWORD. Если её опустить, то любой сможет подсоединиться к нашему прокси сервису.

На этом установки на стороне сервера заканчиваются.

Настройка и запуск демона PTunnel под Windows

Сперва запускаем консоль Windows.

Note: start -> Search Programms and Files, где вводим cmd -> правой кнопкой мыши Run as administrator (возможно необязательно запускать её от имени администратора)

Через консоль находим папку где лежит наша программа и запускаем её со следующими параметрами:

ptunnel.exe -udp -p SERVER1.COM -lp 2222 -da SERVER2.COM -dp 22 -x PASSWORD
Где опция
-udp
показывает, что мы будем работать с 53 портом udp.
-p SERVER1.COM
показывает, на каком сервере установлен PingTunnel в качестве демона (ответной части. Этот сервер имеет полный доступ в интернет.
-lp 2222
локальный порт, который будет слушать Ptunnel на нашей Windows машине. Естественно этот порт должен быть свободен. Именно все запросы на этот порт наш pingTunnel перебросит на внешний сервер через порт 53.
-da SERVER2.COM
адрес того сервера, куда наш внешний, свободный от урезания трафика сервак (посрденик) будет переадресовывать все запросы идущие к нему через его серверную часть PingTunnel.
-dp 22
порт того сервера, куда наш внешний, свободный от урезания трафика сервак (посрденик) будет переадресовывать все запросы идущие к нему через его серверную часть PingTunnel.
-x PASSWORD
пароль, который требуется для авторизации на нашем сервере, размещённом в интернете, который является посрдеником, на котором не ограничен трафик, и который будет переадресовывать наши запросы.

Краткий пример

Допустим мы адрес нашего нефильтруемого сервера Example.com, а мы хотим выйти на блокируемый нашим местным админом сайт ya.ru. Для этого на клиентской стороне выполняем команду:

ptunnel.exe -udp -p Example.com -lp 2222 -da ya.ru -dp 80 -x PASSWORD

Настройка второго туннеля по ssh под Windows через Putty

Для поднятия второго туннеля внутри первого нам надо, чтобы на нашем интернет сервере, с неблокиремым трафиком стоял ssh демон, к которому мы и будем подсоединяться. Для этого ptunnel мы будем запускать следующим образом:

ptunnel.exe -udp -p SERVER1.COM -lp 2222 -da SERVER1.COM -dp 22 -x PASSWORD

с учётом того, что именно на SERVER1.COM у нас стоит ptunnel в качестве серверной части, а так же ssh демон. Таким образом наш локальный Ptunnel соединится с SERVER1.COM по порту 53, а тот в свою очередь перебросит конект, полученный от нас на другой север SERVER1.COM с портом 22 (то есть на свой же ssh демон).

Теперь, когда у нас все запросы с 2222 порта переадресуются по прокси тунелю на ssh демон SERVER1.COM, нам нужно запустить putty и наладить в нём динамический форвардинг портов, то есть по сути создание второго тунеля через ssh с SERVER1.COM.

Для этого зупаскаем putty и заполняем все настройки по примерам на картинках:


Основные настройки соединения Putty

Сперва необходимо задать на складке Session порт соединения и адрес, куда будем соединяться. Пишем там 2222 и localhost, т.к. нащ PingTunnel слушает именно localhost:2222. Так же вводим имя сессии, чтобы сохранить её и не ввожить настойки ещё раз.

Настройки пути до приватного ключа putty

Далее переходим на вкладку SSH -> Auth где вводим путь до нашего приватного ключа, если необходимо для авторизации на нашем сервере SSH.

Настройки тунеля с динамическим порт форвардингом в Putty

Далее переходим на вкладку SSH -> Tunnel, где вводим Source port 5555 и ставим галочку Dynamic. Это поднимет у нас на Windows компьютере прокси тунель, который будет слушать порт 5555 на localhost и переадресовывать все запросы идущие на localhost:5555 через ssh тунель, который будет внутри ptunnel (localhost:2222), на какие-то внешние требуемые нам адреса.

После этого нажимаем там кнопку Add.

Сохраняем сессию в Putty

Нажимаем кнопку Save и сохраняем сессию. Для её открытия в будущем нажимаем Open.

Всё теперь у нас поднят зашифрованный туннель, на порту 5555, который позволит нам выходить через Socks на какой-то внешний сервер, по нужному порту, который недоступен из-под Windows машины.

Пример на основе FireFox

Для примера покажу, как можно выходить на заблокированные сайты через браузер FireFox.

Заходим в настройки браузера: Tools -> Options ->Advanced -> Network -> Settings

Далее настраиваем всё по аналогии со скриншотом.

Настройка Proxy в FireFox

Ссылки