Система доменных имён (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 и указать используемый для передачи трафика поддомен и пароль.
Вы также можете явно указать 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-сессий. Но об этом как-нибудь в другой раз.
Приятной работы!