Monday, December 30, 2013

Iodine: DNS туннель через закрытый WiFi

Дано: полное отсутствие интернета и виднеющийся WiFi hot-spot, в котором предлагают ввести логин-пароль. Или 3G, в котором нет интернета (потому что закончились деньги), но есть страничка провайдера с предложением дать оных денег.
Задача: получить интернет (легальным?) методом посредством туннелирования его через DNS.
Решение: linux+ iodine + routing + NAT + squid, и всё это под управлением network manager'а.
В статье: описание организации DNS туннеля посредсредством программы iodine, нюансы организации маршрутизации через образовавшийся туннель, самописный помощник для iodine и network manager.

Лирика: Занесла меня судьба на славный остров Кипр, кой славен своим П/пафосом, фраппэ и таким интернетом, после которого российские опсосы начинают выглядеть ангелами во плоти. В частности, попытка подключиться к интернетам закончилась ожиданием, что местный провайдер (Сyta) смилостивится, таки закончит пить оный фраппэ и дотянет до меня поганый ADSL 4Мб/768кбит всего-навсего за €151 (подключение) + €40 в месяц (за 4 мегабита! >_<). Ожидание тянулось и тянулось (как бы уже третья неделя пошла), а рядом был славный PrimeTel, который предлагал за €4/час (172р/час) осчастливить меня интернетом прямо тут и сейчас через едва видный WiFi. Я бы даже и согласился, но видна точка доступа была только на балконе, а в квартире связь была нестабильной и часто терялась. Так что оставалось одно решение (помимо взлома WEP-сети соседей, что уж совсем уголовщина) — это злоупотребить сервисом DNS, который безвозмездно, то есть даром, предоставляет PrimeTel для своих незарегистрировавшихся подлюченцев.

Те, кому интересно «howto» — решение далее по тексту, а пока что начнём с теории процесса.

DNS tunneling


Если у нас под руками есть работающий DNS-ресолвер (то есть сервер DNS с включенной рекурсией), то он может на наш запрос об IP-адресе узла foobar.example.com пойти на .com, узнать там адрес сервера, отвечающего на example.com, пойти на example.com, уточнить кто отвечает за foobar, и у указанного сервера уточнить подробности. Узнавать он может не только IP-адрес (A и AAAA записи), но и кучу другой информации, которая может храниться в DNS. В частности:
MX — содержит строку с описанием того, кому слать почту для foobar.example.com
SRV — содержит строку с информацией о том, какие (новые) сервисы есть и по каким адресам — например, её использует джаббер
TXT — случайная информация в текстовом виде. Чаще всего её на практике используют для SFP (правил, описывающих кто может отправлять почту с домена foobar.example.com).

(тут потерялась 300кб лекция о том, что такое DNS и как он работает).
Для наших нужд из этого вытекает простая вещь: мы можем попросить ресолвер узнать немного информации у foobar.example.com. Ресолвер пойдёт, узнает, закеширует (если мы снова запросим её, то он ответит из кеша) и отдаст нам. Если мы каждый раз будем запрашивать другую запись (для другого имени в этой зоне или другой тип записи), то ресолвер будет послушно ходить и ресолвить. Каждый раз. Заметим, для ускорения процесса он закеширует информацию «к кому ходить за такой-то информацией» и процесс в дальнейшем будет происходить в один хоп.

Ура, канал передачи информации от сервера к нам есть. А обратно? Но мы же можем попросить узнать у example.com не foobar.example.com, а, например, 
0ahb282M-J2hbM->M-nYM-VgdM-OJM-
CM->M-nivlm4M-T5M-FM-p1M-t5M-
fM-uM-IvLM-HM-NM-aM-IM-eLAM-
BM-TM-qM-KM-UDM-NM-uM-]M-WM-
jM-DdbM->M-k.QVM-lM-uM-`v

(это один длиииный адрес сайта в интернетах, написанный столбиком для удобства неразрыва ваших френдлент)

Ресолвер пойдёт на example.com и спросит его об этом адресе. А если в адрес закодировано послание? (Криптоложцы встрепенулись — закодированное в имени послание!)
А если?.. Да, именно так. Имя содержит в себе зашифрованное послание. Мы нашли метод передачи информации на сервер. DNS-сервер. Или фальшивый сервер, который притворяется DNS-сервером, а на самом деле слушает зашифрованные в именах послания и отвечает на них зашифрованными посланиями в ответах на запросы.

Другими словами, мы получаем канал передачи данных на сервер и с сервера клиенту через DNS-ресолвер.

Read more: Habrahabr.ru