iodine
iodine — утилита-туннель, гоняющая IPv4 внутри DNS-запросов. Классика обхода captive-portals (например, Wi-Fi в отеле, где всё блокировано но DNS работает). Проект code.kryo.se/iodine, автор Bjorn Andersson, релизы с 2006.
Идея
Даже в самой закрытой сети DNS-резолвер обычно доступен — иначе браузер не покажет login-страницу captive-portal. Iodine пользуется этим:
- Регистрируешь домен, скажем
t.example.com. - Ставишь NS-запись:
t.example.com NS iodine-server.example.com. - iodine-сервер на iodine-server.example.com слушает UDP:53.
- Клиент за captive-portal шлёт DNS-запросы с payload в поддомене:
<base32-encoded-data>.t.example.com. - Local DNS-резолвер (тот что доступен) рекурсивно запрашивает эти домены → доходит до iodine-сервера.
- iodine-сервер декодирует, обрабатывает, кладёт ответ в DNS-ответ (в TXT/NULL/CNAME record).
- Клиент декодирует и получает IP-пакет.
Установка сервера
# Debian / Ubuntu
apt install iodine
# У домена example.com сделать делегирование:
# t IN NS tns.example.com.
# tns IN A 1.2.3.4 (IP сервера)
# На сервере (1.2.3.4)
iodined -f -c -P mysecret 10.0.0.1 t.example.com
Клиент
# Автодетект настроек по домену
iodine -f -P mysecret t.example.com
# Использовать конкретный DNS-резолвер (тот что открыт в captive-portal)
iodine -f -r -P mysecret 8.8.8.8 t.example.com
# Ключи:
# -f — foreground
# -P — пароль
# -r — не пытаться прямой UDP, только через DNS
# -T — тип запроса (NULL, TXT, SRV, MX, CNAME, A)
Типы записей
iodine пробует разные DNS-типы, выбирая тот что даёт больший upstream/downstream:
| Тип | Payload downstream | Обход |
|---|---|---|
| NULL | ~1000 байт | Максимальная пропускная, но многие резолверы режут |
| TXT | ~200-500 байт | Лучше проходит |
| SRV | ~200 байт | Иногда единственный не заблокированный |
| CNAME/A | ~100 байт | Совсем плохой канал, но проходит везде |
Пропускная способность
Реалистично: 1-100 КБ/с. Хватает на SSH, IRC, лёгкий веб. Не для видео.
Задержка — сотни мс (каждый DNS-round-trip проходит через промежуточный резолвер). SSH ощущается лаггово, но работает.
DNS-tunneling — не только iodine
| Инструмент | Особенности |
|---|---|
| iodine | UDP/DNS, IPv4-туннель, TUN-интерфейс, шифрование опционально |
| dnscat2 | C2-фреймворк (для pentest), не полноценный VPN, зашифровано |
| dns2tcp | TCP-туннель, проще iodine |
| heyoka | Многопоточный, быстрее iodine, для больших передач |
| ozymandns | Perl, историческая |
Обнаружение
DNS-tunneling довольно легко ловится:
- Большие TXT/NULL-ответы от одного домена.
- Много запросов на подмены одного parent-домена (base32/base64 префиксы).
- Регулярные шаблоны времени (keepalive).
- Enthropy DNS-имён высокая (случайные буквы вместо слов).
Коммерческие DPI (Palo Alto, Cisco Umbrella, Cloudflare Gateway) детектят iodine сходу. Работает только против неквалифицированных фильтров.
Использование в вредоносах
DNS-tunneling — классика C2 (command-and-control) для APT. Известные семейства использовавшие DNS-туннели: DNSMessenger (Cisco Talos 2017), Denis, PlugX. Именно поэтому корпоративные security решения умеют детектить.
Легальные применения
- Wi-Fi в отеле/аэропорту — пробить captive-portal.
- Крайний фолбэк VPN когда всё остальное заблокировано.
- IoT-устройства в закрытых сетях.
- Академические демонстрации/пентесты.