DNS-туннелинг или халявный dialup

Дмитрий Докучаев aka Forb

Xakep, номер #051, стр. 051-058-1

(forb@real.xakep.ru)

Сейчас многие провайдеры предоставляют так называемые free-аккаунты, необходимые для пополнения счета через Web или просто для посещения провайдерского сайта. Доступ в интернет через такие аккаунты конечно же перекрыт фаерволом, поэтому они никому не нужны и малоинтересны.

Но, как известно, у медали две стороны. В наш бурный век протоколы расширяются до неимоверных пределов. DNS не исключение, так как именно через него стало возможным создание полноценного IP-туннелинга. Конечно, реализация непростая. Тут и обмен по UDP вместо надежного TCP, требование полной синхронизации данных, а также фрагментации пакетов, по той причине, что DNS-запрос может состоять лишь из 512 байт. Казалось бы, все не в пользу программиста, но и они, в свою очередь, не лыком шиты и вполне способны сделать из мухи слона =).

Первое рождение - NSTX

Итак, после долгих мучений родилась первая версия сервера и клиента NSTX (что в расшифровке означает "NameServer Transfer Protocol). Эта программа позволяет построить туннель между двумя UNIX-серверами посредством интерфейса Ethertap. Чтобы воспользоваться этой программой, нам также нужен будет собственный домен, а точнее, доступ к зонам на каком-либо dns-сервере. Механизм передачи будет примерно следующим: клиент, запущенный локально с параметром домена и dns-сервера, будет передавать зашифрованный трафик через Ethertap. Dns-сервер вернет серваку прова поле NS, тот, конечно же, обратится на эту тачку, на которой будет стоять nstx-daemon, возвращающий трафик по ethertap-интерфейсу, стоящему на системе конечной точки. В итоге получаем полноценный обмен трафиком.

Переходим от теории к практике. Для удачного эксперимента тебе понадобится домашний сервер на пингвине, который ты, надеюсь, ставил не один раз =), шелл в забугорье без установленного named'а на нем, а также собственный домен (второе и третье ты можешь попросить у кого-нибудь за символическое пиво). Далее, создаешь домен третьего уровня с полем NS, значение которого будет адресом тачки с установленным nstx.

Установка

Топаем на эту самую тачку, устанавливаем nstx и поднимаем ethertap (непосредственно через него и будет проходить весь трафик). Для начала создадим блочный файл /dev/tap0, командой "mknod /dev/tap0 c 36 16". Затем подгружаем модуль ethertap.o (locate ethertap.o, insmod /path/to/ethertap.o) и, наконец, поднимаем интерфейс:

ifconfig tap0 up 192.168.0.1, присваивая тем самым адрес.

Напоследок создаем роутинг: route add -host 192.168.0.2 gw 192.168.0.1, чтобы сервер мог видеть клиента =). И запускаем nstxd с параметром созданного домена третьего уровня.

На домашнем компьютере проделываем в точности такую же операцию, только запускаем клиент nstxcd с двумя параметрами: домен и dns-сервер, на котором прописаны зоны к этому домену, логически завершая туннелинг. Ehtertap'у клиента присваиваем ip-адрес 192.168.0.2. Затем пробуем пингануть 192.168.0.1. Если пинги пойдут, значит, тоннель работает. В моем случае все заработало со второго раза, и то из-за невнимательности :). Но так как шелл стоял очень далеко, да и коннект у прова был паршивый, такой интернет разочаровал своей медлительностью, и я забил на эту идею. Но ненадолго.

Содержание  Вперед на стр. 051-058-2

ttfb: 3.2861232757568 ms