Я уже писал когда-то про обход ограничений интернет провайдера в отеле с помощью ICMP туннеля. Вот, недавно я столкнулся с новым подобным ограничением, но в этот раз мой интернет провайдер по ошибке решил что я не уплатил за услуги. Так как был уже поздний вечер, связаться с тех поддержкой не получилось. Это подтолкнуло меня немного поисследовать провайдерскую сеть. В первую очередь проверил ICMP, но пропинговать 8.8.8.8 не получилось. Второй проверкой была попытка обратится к DNS серверу Google. Когда команды dig @8.8.8.8 google.com вернула мне адрес вернула мне IP адрес, я понял что смогу использовать технику DNS туннелирования для полноценного доступа в Интернет. Собственно об этом я и расскажу в данном посте.
Вкратце расскажу о том, как работает DNS туннелинг. Этот вид туннелинга позволяет заворачивает полезный для нас трафик (web,ssh) в UDP пакеты. Эти пакеты посылаются на управляемый нами сервер, на котором работает приложение, слушающее 53 порт. Приложение распаковывает пакеты, извелкает из них данные и дальше уже на основе этих данных, устанавливает TCP соединение с нужным сервером/сервисом. После того как наш DNS-прокси сервер получает ответы по TCP, он упаковывает эти данные обратно в UDP пакет и отвечает запрашивающей стороне. На стороне клиента происходит повторное изьятие данных из пакета. С токи зрения интернет-провайдера (если не вчитываться в содержимое пакета) все выглядит так, будто бы вы со своей клиентской машине активно пытаетесь резолвить доменные имена с одного DNS сервера.
Теперь ближе к реализации. Думаю всем понятно, что для того что б все заработало, надо либо что б все было предварительно настроено, либо воспользоваться альтернативным подключением к Интернету для настройки. Сам тунель подымается с помощью набора perl скриптов под названием OzymanDNS, с сайта dnstunnel.de. По каким-то причинам линка на скрипт на официальном сайте битая, но гугл мне помог и я нашел копию скриптов и выложил у себя.
Скачать скрипты для DNS туннелинга.
Для того что б все заработало необходимо иметь следующее:
1. Свой домен (к примеру бесплатный из org.ua зоны
2. Сервер с выделенным IP адресом и рутовыми правами на нем (для запуска серверной части и возможности работать по 53 порту), perl. Выполняет роль DNS-тунеллинг прокси сервера.
3. Клиентский компьютер, желательно по Linux. На нем нужен perl и openssh-client.
Настройка этого всего состоит из трех этапов:
1. Настройка доменной зоны
2. Настройка сервера
3. Настройка клиента
Настройка доменной зоны
На этом этапе надо заставить нашего клиента обращаться именно на наш сервер с DNS запросами. Делаеться это путем делегирования части вашего домена другому DNS серверу. В моем случае я просто зашел в админку, в которой обслуживается мой домен, и добавил следующие записи в описание зоны:
dnstun.example.com. IN NS ns3.example.com
ns3.example.com IN A 12.12.12.12
Теперь при попытке узнать адрес любого из поддоменовв зоне dnstun.example.com, запросы будут автоматически отправлятся на сервер с адресмо 12.12.12.12. Адрес должен указывать на тот сервер, где у вас будет запущена серверная часть DNS туннелинг скриптов.
Настройка сервера
Создаем директорию /opt/dnstunnel:
# mkdir -p /opt/dnstunnel
Качаем туда архив:
# cd /opt/dnstunnel
# wget http://chooselinux.org.ua/wp-content/uploads/2011/11/dnstunnel.tar.gz
# tar zxvf dnstunnel.tar.gz
# rm -f dnstunnel.tar.gz
Доставляем нужные пакеты:
# apt-get install screen libnet-dns-perl libmime-base32-perl liblwp-useragent-determined-perl
Редактируем /opt/dnstunnel/dnstunneld.wrapper, вписываем следующее:
DNSHOST="ns3.example.com" # имя моего сервера
REPLYIP="127.0.0.1" # что отвечать на реальные DNS запросы на этот сервер
OPTIONS="-l 12.12.12.12 -u nobody -g nogroup" # IP, на котором будет работать DNS туннель
Создаем симлинк в /etc/init.d для удобного запуска скрипта:
# ln -s /opt/dnstunnel/dnstunneld.init /etc/init.d/dnstunnel
Запускаем:
# /etc/init.d/dnstunnel start
Настройка клиента
Ставим необходимые пакеты:
# apt-get install libnet-dns-perl libmime-base32-perl
Качаем и ставим DNStunnel:
# cd /tmp
# wget http://chooselinux.org.ua/wp-content/uploads/2011/11/dnstunnel.tar.gz
# tar zxvf dnstunnel.tar.gz dnstunnelc
# mv dnstunnelc /usr/bin/
# rm -f dnstunnel.tar.gz
Подключеяемся:
$ ssh -C -D5500 -o ProxyCommand="dnstunnelc sshdns.dnstun.example.com" user@12.12.12.12
После ввода пароля тунель можно считать установленным. Теперь только остается прописать в настройках браузера SOCKS прокси 127.0.0.1:5500 и все.
Я попытался протестировать скорость закачки файлов при таком туннелировании и получил результат около 15-20КБайт/с. По нынешним меркам это очень мало, но тем не менее, это доказывает что такой способ туннелирования работает.
Удачи!

