IP over DNS: а почему бы и нет?

()

Система доменных имён (DNS) создана в первую очередь как распределённая база данных, содержащая информацию о соответствии имён хостов и их IP-адресах, а так же дополнительную информацию вроде маршрутов почты. Сама архитектура предполагает передачу только небольших фрагментов информации на каждый запрос, однако оказалось что и этого достаточно чтобы организовать "заворачивание" IP-трафика в серию DNS-запросов и ответов.

На github есть репозиторий проекта iodine с реализацией клиента и сервера IP over DNS. Автор объясняет название проекта тем что с одной стороны сокращение от "IP over DNS" это "IoD", а с другой - порядкой номер йода в таблице менделеева составляет 53, что совпадает с номером UDP-порта, используемого службой DNS. Отсюда и название проекта - Iodine (в переводе на русский - Йод).

Мы будем разворачивать Iodine сервер на VPS от Vultr под управлением Ubuntu 18.04. В качестве клиента будет настольный компьютер под управлением Lubuntu 18.04.

Кроме того нам понадобится зарегистрировать доменное имя, делегировать его на какие либо NS-сервера (тот же Vultr в дополнение к VPS предоставляет бесплатный DNS-хостинг), и добавить в зону следующие записи:

j   IN  NS  jns.ylsoftware.com.
jns IN  A   107.191.43.122

В данном примере используется зона "ylsoftware.com" и подразумевается что VPS имеет IP-адрес "107.191.43.122". При повторении конфигурации читателю надо указывать свои данные.

Переходим к настройке сервера. Для начала установим необходимые пакеты:

apt install iodine iptables-persistent

Далее открываем файл "/etc/default/iodine" и приводим его к виду:

# Разрешаем запуск демона
START_IODINED="true"

# Демон будет слушать на всех IP-адресах, обслуживать зону j.ylsoftware.com
# Адрес сервера внутри VPN-сети 172.16.12.1/26
# Ключ -c разрешает одному клиенту обращаться одновременно с нескольких IP, это позволяет
# обходить проблемы при использовании DNS-кластеров
IODINED_ARGS="-l 0.0.0.0 -c 172.16.12.1/26 j.ylsoftware.com"

# Пароль, используемый клиентами.
IODINED_PASSWORD="53cr3tp4s5"

Запускаем сервис:

systemctl unmask iodined.service
service iodined start

Включаем пересылку (forwarding) сетевых пакетов:

echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99_my.conf
sysctl -p /etc/sysctl.d/99_my.conf

Минимальные настройки файрвола (NAT+пересылка пакетов) и сохранение их для автоматической загрузки при старте системы:

iptables -t nat -A POSTROUTING -o ens3 -s 172.16.12.0/26 -j MASQUERADE
iptables -A FORWARD -i ens3 -o dns0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i dns0 -o ens3 -j ACCEPT
netfilter-persistent save

На этом настройка сервера заканчивается и мы переходим к настройке клиента. Если вы используете Network-Manager то вам достаточно поставить следующие дополнительные пакеты:

apt install network-manager-iodine network-manager-iodine-gnome

А затем создать VPN-соединение с типом Iodine и указать используемый для передачи трафика поддомен и пароль.

Настройка Iodine-соединения в Network Manager

Вы также можете явно указать DNS-сервер, к которому будет обращаться iodine, вместо указанного в настройках соединения. Это может быть важно если ваш основной сервер по медленно отвечает на запросы или ограничивает скорость отправки запросов.

Если есть необходимость запускать соединение из терминала то стоит обратить внимание на скрипт iodine-client-start идущий вместе с iodine. Для его настройки необходимо создать файл "/etc/default/iodine-client" примерно такого содержания:

subdomain=j.ylsoftware.com
passwd=53cr3tp4s5
interface=enp10s11

Параметр interface указывать не обязательно, но в ряде случаев скрипт не может сам определить интерфейс, через который машина подключена к сети и в этом случае ему нужно подсказать.

Закончив настройку можно поднять соединение командой:

iodine-client-start

Если что-то идёт не так то поиск проблем стоит начинать с просмотра логов на стороне сервера командой:

journalctl -xe -u iodine.service

Затем уже смотреть логи клиентов. Стоит отметить ещё несколько важных вещей. Если клиент может напрямую обратиться на порт 53/UDP сервера то клиент начинает пользоваться этой возможностью и пропускная способность туннеля возрастает. Но даже в этом случае туннель плохо справляется с большим количеством одновременных TCP-соединений.

Поэтому популярные браузеры вроде Chrome и Firefox плохо подходят для использования совместно с iodine, так как быстро забивают туннель потоками телеметрии, синхронизации пользовательских данных и прочими подобными вещами.

Однако в связке с браузерами вроде Falkon или Midori веб-сёрфинг вполне комфортен. Хотя просмотр видео и прослушивание музыки практически не возможно. Кроме того следует отметить отсутствие шифрования.

Учитывая что трафик iodine может проходить через большое количество чужих DNS-серверов следует быть готовым к перехвату трафика. Решением может стать использование только протоколов с шифрованием внутри туннеля. В качестве возможного решения можно начать использовать OpenVPN внутри iodine. Кроме того это поможет решить проблему "торможения" IP over DNS-туннеля при большом количестве TCP-сессий. Но об этом как-нибудь в другой раз.

Приятной работы!

Ключевые слова: dns, tunnel, iodine, vpn.

Подписаться на обновления: RSS-лента Telegram канал Twitter

Комментарии:

Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2018 Вадим Калинников aka MooSE