DNS Tunneling via iodine: сыр действительно бесплатный

    Есть:
    — отключенный за неуплату интернет (adsl, lan, etc)
    или
    — нешифрованная wi-fi сеть c закрытым интернетом, но работающим dns
    или
    — очень строгий firewall с открытым dns

    Хочется:
    полноценный интернет, пусть даже очень медленно

    Прежде, чем ответить на вопрос «как?» — несколько замечаний.

    1. Эта статья — практическое руководство, а не теоретический курс «введение в особенности работы служб DNS» (на эту тему и так написано достаточно).

    2. Все примеры приводятся для платформы windows, как самой популярной на десктопах. С другой стороны, все приведенные методы работают не хуже и в unix-окружении (google без труда подскажет альтернативы там, где у меня упоминаются windows-only решения).

    3. Чтобы описанный способ заработал, вам понадобится в качестве сервера постоянно работающий и подключенный к интернету компьютер с «белым» IP (не важно, статическим или динамическим, но адреса вида 192.168.*.* или 10.*.*.* не подойдут).

    4. Эй, provider guys! NSTX, использующий аналогичный метод, известен уже лет 7, а все равно до сих пор в большинстве сетей этот трюк срабатывает. Теперь и «под винду» есть решение «под ключ». Берегите dns'ы :)

    Введение

    Во всех случаях, перечисленных в начале статьи, остается одна лазейка — dns-сервер, до которого обычно можно «достучаться». Что нам дает dns сервер? Теоретически — возможность послать запрос произвольного содержания на произвольный другой dns-сервер (уже за пределами «закрытой/отключенной» зоны), и получить произвольный ответ. Теоретически, это позволяет получить доступ к сети, инкапсулируя IP пакеты в dns запросы и ответы. Сейчас я расскажу, как это сделать на практике.

    Часть 1. Регистрация
    • Регистрируемся на сервисе dyndns.com
    • Заводим себе динамический dns, выбираем адрес (скажем, dnstun.dyndns.org)
    • Регистрируемся на сервисе co.cc
    • Регистрируем себе у них бесплатный домен (скажем, dnstun.co.cc), и указываем для него dns сервером наше dyndns-имя, dnstun.dyndns.org (если такой способ не сработает, можно добавить к домену nx-запись для его поддомена, ссылающуюся на наш dyndns-домен, это делается в «Zone Records», к примеру, host: tunnel.dnstun.co.cc, type: NS, Value: dnstun.dyndns.org", и в дальнейшем вместо dnstun.co.cc везде использовать tunnel.dnstun.co.cc)
    • Ждем делегирования домена и появления его на всех dns серверах (до 48 часов)
    Часть 2. Сервер (т.е. тот компьютер, который находится в «большом» интернете, без всяких firewall и т.д.)
    • Скачиваем и устанавливаем dyndns updater:
      www.dyndns.com/support/clients
    • Скачиваем и устанавливаем TAP драйвер из пакета OpenVPN:
      openvpn.net/release/openvpn-2.0.9-install.exe
    • Скачиваем свежую сборку iodine:
      code.kryo.se/iodine/iodine-latest-win32.zip
    • Запускаем сервер iodine:
      iodined -f 10.0.0.1 dnstun.co.cc
    • С помощью kerio или встроенных средств windows создаем общий доступ к интернету для вновь появившегося сетевого соединения (через виртуальный адаптер TAP-Win32 Adapter V8)
    Часть 3. Клиент (тот компьютер, которому из всего интернета доступен только dns)
    • Скачиваем и устанавливаем TAP драйвер из пакета OpenVPN:
      openvpn.net/release/openvpn-2.0.9-install.exe
    • Скачиваем свежую сборку iodine:
      code.kryo.se/iodine/iodine-latest-win32.zip
    • Запускаем клиент:
      iodine -f 92.162.2.72 dnstun.co.cc
      Здесь 92.162.2.72 это IP адрес любого доступного dns сервера
      (именно IP, писать ns1.provider.ru нельзя — не сработает).
      Узнать IP dns серверов, установленных в системе, можно по команде
      ipconfig /all
    • Теперь остается настроить роутинг так, чтобы все пакеты, кроме тех, что идут к dns серверу, заворачивались на вновь поднятый виртуальный интерфейс. Это — домашнее задание. Подсказка.

    P.S. Оно есть и под maemo, и под win mobile.
    P.P.S. Умный читатель догадается, что чтобы совсем все хорошо работало, нужно еще подправить MTU в реестре.

    UPD: ссылка для желающих поучаствовать в разработке iodine
    Поделиться публикацией

    Похожие публикации

    Комментарии 70
      +1
      может бизнес открыть: поднять у себя сервер описанный в части 2?
      интересно, будет ли спрос…

      кстати, какая скорость инета у Вас получилась?
        0
        0,6-2,2 Кбит в секунду на iperf. Но это без учета сжатия, т.к. трафик iperf практически не сжимаем. Под Opera Turbo (а еще лучше Opera Mini Proxy) google и википедия юзабельны.
          0
          Полагаю, скорость можно значительно увеличить, если dns сервер будет в России (я использовал co.cc как первый попавшийся сервис, позволяющий указать свои nx для бесплатного домена).
          0
          Спрос будет как минимум для тех, кому аську на работе на дают. Только вот клиент запустить без прав администратора не получится. Так что мало сервера — для бизнеса надо еще какой-нибудь клиент на джаве-флеше написать, чтобы в браузере работал. Тогда — может быть и получится интересный проект.
            0
            На джаваскрипте написать и в Firefox расширением поставить, ага.
              +1
              А в js уже есть raw sockets? Если да, то вариант. Если нет, то во флеше последнем они точно есть, так что можно из js юзать флешёвые сокеты.
                +1
                Джаваскрипт — просто язык; возможности его определяются той объектной моделью, которая скриптуется им.

                Расширения Файерфокса имеют дело с компонентами XPCOM.

                На этом этапе проблема в том, что документация по nsISocketTransportService содержит алые пометки<.nobr> «Native code!», которые значат, что соответствующие функции доступны языку C/C++, но не джаваскрипту.

                Досадно.
                  +1
                  Справедливо, правильнее было бы спросить «имеют ли реализации js в браузерах доступ к socket api».

                  Да, досадно. А флеш-компоненты в расширениях использовать нельзя? Я просто не в курсе.

                  Должен быть какой-то выход, пишут же энтузиасты как-то bittorrent-клиент в виде расширения фокса.
                    0
                    В коде www.fireaddons.com/js/mozadd.js видно, что для Win и Mac и Linux предлагаются различные версии расширения.

                    На мой первый беглый взгляд, это свидетельствует о том, что расширение FireTorrent использует не только джаваскрипт (который, естественно, кросс-платформенный), но и некоторый компилируемый код (различный для различных платформ).
                      0
                      Я привел этот пример к тому, что реализация iodine client в виде дополнения к FF должна быть возможна аналогичным способом.
                        +1
                        Верно; однако не на чистом джаваскрипте, вот что прискорбно.
                      0
                      Подозреваю, что можно использовать flash в расширении, если грузить flash в невидимый iframe, например. Однако мне никогда не доводилося.
                    0
                    Есть. В частности, его использует расширение «яббер клиент», не помню как точно называется.
                      0
                      Очень интересно! Если бы Вы смогли найти ссылку, был бы признателен.
                        0
                        Ну, например www.sameplace.cc/, кажется он не содержит нативного кода. Во всяком случае, два года назад я видел экстеншен, который содержал полноценный xmpp-клиент без нативного кода.
                        Необходимо понимать, что есть привилегированный код, внутри расширений например, и есть простой черный код внутри веб страниц. Так вот, первый почти наверняка имеет полноценный доступ к кукам, а вот последний совершенно точно не имеет.
                  0
                  а чем вам www.meebo.com/ не подходит?
                    –1
                    Meebo — это чужой сервер, а iodine даёт возможность поднять свой собственный.
                +2
                Клёвая штука! +1 в топик, +1 в карму.

                Присоединяюсь к вопросу предыдущего оратора о скорости.
                  +2
                  Спасибо! Увидев знакомое имя, подумал: вот гоняли в свое время фидошный трафик бесплатно по телефонным линиям на модемах в 2400 бод, а сейчас примерно на той же скорости можно бесплатно через «отключенный» интернет трафик гнать. История повторяется :)
                    +4
                    Собственно говоря, можно и фидошный траффик гнать, если binkd поднять на той же машине, на которой клиент iodine. Я как раз это обдумывал в качестве средства раздачи пойнтов (а затем и бандлов) зафайерволленным фидошникам.
                      +1
                      Что ж, если идея найдет такое применение, я, как старый фидошник, улыбнусь довольный :)
                  0
                  Думаю, что многим будет интересен ответ на ещё один напрашивающийся вопрос: как по-простому проверить наличие этой дыры в DNS-сервере, к которому идут запросы клиента? Просто «nslookup что.угодно.dnstun.co.cc» из-под той винды, на которую предполагается ставить клиента?
                    0
                    Это не совсем дыра, это формально законное использование протокола dns. Поэтому, видимо, и не закрыто до сих пор.

                    Что касается простой проверки, как правило, если работает dns (ipconfig /flushdns, затем nslookup ya.ru), то заработает и тоннель. В случае, если конкретно NULL-записи через данную dns цепочку не передаются, можно попробовать NSTX, Ozyman DNS и другие аналогичные проекты, которые используют не NULL, а более распространенные CNAME запросы (но заставить это работать под win32 будет куда сложнее, хотя у меня однажды получилось, уже сам точно не помню, каким колдовством, но cygwin'ом там пахло точно). Они заработают наверняка, если только администратор dns сервера специально не заблокировал возможность dns tunneling'а (а я не слышал пока о софте/патчах к известным серверам, которые могли бы реализовать такую блокировку, хотя в теории это не должно быть сложно).

                    Однозначно простую проверку, будут ли работать NULL-запросы (и, следовательно, описанный метод) в конкретном случае я привести не берусь. Разве что сделать где-то в сети базу публичных iodined-серверов, чтобы можно было хранить у себя копию базы и проверять связь на одном из них.
                    –1
                    Прикольно! Только одна неувязочка есть, если отключен за неуплату интернет, то нельзя скачать все, что нужно. :)
                    Но это если сильно придираться и не иметь телефон под рукой. :)
                      0
                      Надо позаботится заранее :)
                      +2
                      статья интерестная. В своё время, пока не было нормального инета пытался этой ерундой заниматься. Использовал гентуху, так как другого у меня не было(спасибо срезам XOR'а). Действительно, небольше 1.5 килобайта. Но когда нет инета, пойдет :)
                      ЗЫ авторо молодец что сделал такое ограничение как правку MTU самому, ибо кулхацкеры не смогут догодатсо что это :).
                        0
                        Расчет был на то, что кулхацкеры не разберуться в том, что такое роутинг. С MTU случайно вышло :)
                          0
                          Для кул хацкеров нужно было в base64 писать статью. :)
                        +2
                        Защититься от такого туннелинга можно, если запрещать рекурсивные запросы на DNS сервере для отключенных клиентов. Но это даёт хорошую нагрузку на железо, т.к. приходится bind скрещивать с SQL сервером (memcached+SQL сервером) и поддерживать отдельный acl в актуальном состоянии.
                        Есть ещё способы, но они к настройке dns сервера отношения не имеют (например, изолирование сетей)
                          0
                          А разве что-то похожее на динамический view еще не придумано?
                            0
                            Я не встречал пока. Получается, что мы его реализуем сами так как нам удобнее.
                            +1
                            Не только биндом живы DNS-сервера ;)
                              0
                              Для ipfw есть вариант использовать table + NAT для отключённых клиентов. Вариант очень удобный, ибо table можно динамически править, а для отначенной айпихи понаделать разных вещей, не только отказ в рекурсивных DNS-запросах, но и заворот всех обращений на 80 порт на локальный HTTP-сервер с custom error page, в котором будет сообщаться об исчерпании баланса.
                              0
                              Я на связке локалхост — Виртуальная Машина получил скорость что-то около 10 кБ/с
                              Страшно было подумать, какая же скорость будет в реальных условиях, поэтому забросил эксперименты.
                                0
                                написали же выше: максимум 2-3 кб/сек. Я вообще считаю, что это хоть и может кому то пригодиться на практике, но бОльшая польза все-таки в самом знание о существовании этой фичи
                                –15
                                «динамический белый IP»… это пост максимум для журнала хакер :)
                                  0
                                  поясните глубокую мысль
                                    –12
                                    бл, можно пример, есть ли какой-то смысл в публичном IP если он не статический?
                                      +3
                                      во-первых, dyndns не вчера придумали
                                      во-вторых, почему в этом должен быть какой-то смысл?
                                        –1
                                        торренты лучше работают
                                          –10
                                          ниебацо аргументов. вот так дибилы и растут, ты (и следующий) ознакомься с термином «маршрутизация». а dyndns придумали наверное в 90-х для таких же тупых пользователей AOL в штатах, когда провайдеры кому-то еще давали не локальный IP при подключении.
                                            +1
                                            Чаше всего у провайдера upnp не настроен.
                                            Без настроенного upnp порт переброшен не будет -> отдача точно будет хреновой.
                                            Поэтому лучше иметь любой внешний ip, неважно, статический или динамический.
                                            Я не прав?
                                              0
                                              Если не брать в расчет UDP hole punching, то прав. Почти. Хреновой будет не конкретно отдача или получение. Хреновой будет возможность соединения с другим пиром с таким же внутренним адресом, а именно, такая возможность чуть более чем полностью будет зависеть от успешности этого самого hole punching'а.
                                              +1
                                              у меня белый динамический айпи
                                              что я делаю не так?

                                              PS если вы знаете как сделать, чтобы с серым айпи можно было раздавать торренты другим пользователям с серым айпи — поделитесь опытом
                                                0
                                                См. комментарий выше, все-таки такая возможность есть, хоть и срабатывает не всегда и не везде (а вы думаете, как скайп завоевал популярность?). Но в общем случае Вы, безусловно, правы.
                                                  0
                                                  разве для этого не нужна поддержка с обоих сторон?
                                            +1
                                            Спасибо, пожрал. Для p2p сетей вообще пофиг статический он или динамический, а если нужен доступ, то можно написать скрипт, который апдейтит ip в dns записях.
                                          0
                                          В Хакере об этом действительно писали, кстати.
                                          0
                                          А давным-давно на ЛОРе пробегал чей-то личный проектик, с помощью которого инкапсулировался трафик в jabber-сообщения. Если в локалке есть jabber-сервер и с него можно писать наружу — вполне себе альтернатива. К сожалению, канал был довольно падуч, но при дефолтных настройках лимитов можно получать около 6 КБ/сек, а вся схема несколько попроще будет :)
                                            0
                                            ppp4j назывался если мне память не изменяет. 8КБ/с вытягивал (против КБ/с через иодин к тому же серверу), но реально было проще незакрытый ssh с -D использовать ;)
                                              +2
                                              pppoj, если быть точным, что все еще лежит здесь.
                                                0
                                                Спасибо, интересно! Тред на лоре на тему pppoj тоже любопытно было почитать.
                                                  0
                                                  Еще раз спасибо. Посмотрел уже более внимательно. В итоге решил предложить разработчикам iodine вот такую идею.
                                              –9
                                              Разве в век технологий WiMAX / 3G это кому-то актуально?
                                                +6
                                                Речь совершенно о других вещах
                                                  +4
                                                  Жертва цивилизации! О чем вы говорите, какой в топку 3G/WiMAX, причем тут это?
                                                    –2
                                                    Согласитесь, сегодня при отключении основного интернет канала никто не будет использовать данный способ именно по причине доступности соседского wi-fi/wimax/gprs/3g.
                                                      +3
                                                      Конечно, большинство не будет, соглашусь. Но разве интересно было бы читать здесь про использование так называемого мобильного интернета в качестве резервного способа выхода в Сеть? К тому же предлагается абсолютно бесплатный способ.
                                                        0
                                                        Я сам использовал такой способ лет 7 назад.
                                                        Просто хочу сказать, что это все не актуально на практике и может быть интересно лишь для каких-нибудь академических целей.
                                                          0
                                                          Безусловно, не актуально! И еще это как минимум является нарушением договора с провайдером или оферты, в случае публичной wi-fi точки.

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

                                                          PS: С другой стороны, это вариант срочно прочитать почту, когда нет времени бежать платить за связь :)
                                                        0
                                                        а что делать тем, у кого нету соседского wi-fi/wimax/gprs/3g?
                                                          0
                                                          А что значит «нет gprs»? Думаю такое сейчас только в тайге можно найти.
                                                            0
                                                            соседского нет :) а свой денег стоит, причем иногда неадекватных
                                                              0
                                                              Совершенно спокойно можно найти, живя в поселке в трех километрах от Твери.
                                                              DSLAM на АТС забит по самые гланды, расширения не обещают, => подключить линию не выйдет; БД всех трех ОПСОСов переодически же падают даже от звонков, и платить даже два пятьдесят за скорость в 1 кбайт\с я не согласен.
                                                      0
                                                      А я делал такое через GVPE :)
                                                        0
                                                        на что народ только не идет… в моей сети я помню какие-то студенты траффик в arp запросы инкапсулировали…
                                                        а вообще, чтобы пост был достойным тематики, куда его поместили, не плохо было бы разместить в нем средство противодействия
                                                          0
                                                          Можно подробнее про трафик в arp запросах?

                                                          Про средство противодействия: я уже писал, что готового решения не существует, так как эта техника формально является корректным использованием dns. Каждый провайдер придумывает, как избежать злонамеренного использования, сам. Или вообще не думает на эту тему. Я ждал пары-тройки типовых решений в комментариях — и они там появились. Спасибо авторам.
                                                            0
                                                            ну про протокол можно прочитать в вики и рфц, там просто использовались поля для логического адреса отправителя и получателя, а по сути «их arp» протокол был похож на udp в пределах физической сети из свичей L2 и с маленьким размером
                                                            0
                                                              0
                                                              какие-то кривоватые решения
                                                              первый сложен в реализации(я молчу про операцию скрещивания bind acl + sql — это вообще отдельно патчи писать надо), скорее всего будет существенная потеря в производительности, что совершенно не допустимо для dns сервиса.
                                                              а второй… я работаю в провайдере уже не первый год, на какие только ухищрения не приходится идти, чтобы убрать одно правило из фаервола для увеличения производительности. А тут так просто решили — давайте сделаем еще одну таблицу… Что касается переадресации всего трафика на 80 порт локального сервера — бред полнейший. Ну вот у человека кончились деньги, он заходит на сайт гугля, его перекидывает на страничку прова «пора платить» — это понятно, тут даже не обязательно, чтобы у человека днс работал(редирект делается обычно по ипу). Но зачем это делать для других протоколов? Неужели вы думаете, что если человек будет пробовать залогиниться в аське, то он туда получит это сообщение? А в итоге мы получим кучу бесполезный запросов на вебсервер с разных протоколов, включая днс.
                                                              А эффективное решение в данном случае очень простое:
                                                              у провайдера 2 днс сервера, первый из них доступен только при открытом инете, второй же доступен и при закрытом, но он в состоянии резолвить только допустимые адреса, а именно: домен провайдера и разрешенные сайты(скажем те, через которые он может оплатить инет).
                                                              На сколько мне известно, что большинство сетевых ОС не распределяет нагрузку перед указанными днс, а шлет все по первому, а уже если он не доступен, то по второму и т.д. Так что это не должно вызвать затруднений.

                                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                          Самое читаемое