iodine
Outil de tunneling DNS. Fait transiter du trafic IP à travers des requêtes DNS : contourne les pare-feux et portails captifs qui autorisent le DNS mais bloquent le reste du trafic. DNS tunneling tool. Tunnels IP traffic over DNS queries — bypasses firewalls and captive portals that allow DNS but block other traffic.
↗ https://github.com/yarrick/iodineOverview
iodine tunnels IPv4 traffic over DNS by encoding data in DNS queries and responses. It’s used to bypass captive portals (airport/hotel Wi-Fi), restrictive firewalls that allow DNS but block TCP/UDP, and for covert C2 communications. Requires control of a DNS server and domain.
Setup Requirements
1. A domain you control: tunnel.example.com
2. An NS record pointing to your server:
tunnel.example.com NS ns.example.com
3. An A record for your nameserver:
ns.example.com A 1.2.3.4
4. iodined running on your server (1.2.3.4)
Server Setup (iodined)
Start iodine server on your VPS -f: run in foreground 10.0.0.1/24: tunnel IP range (server gets .1, client gets .2) tunnel.example.com: your subdomain
sudo iodined -f 10.0.0.1 tunnel.example.com
With password
sudo iodined -f -P secretpassword 10.0.0.1 tunnel.example.com
As background daemon
sudo iodined 10.0.0.1 tunnel.example.com
Use specific network interface
sudo iodined -i 0.0.0.0 -f 10.0.0.1 tunnel.example.com
Client Usage (iodine)
Connect from a restricted network (where only DNS is allowed)
sudo iodine -f tunnel.example.com
With password
sudo iodine -f -P secretpassword tunnel.example.com
Specify DNS resolver (use a public one if local blocks external)
sudo iodine -f -r 8.8.8.8 tunnel.example.com
Result: tunnel interface (dns0) appears with IP 10.0.0.2
ip addr show dns0
Using the Tunnel
# After connecting, route traffic through tunnel
# Server IP in tunnel is 10.0.0.1
# Your IP in tunnel is 10.0.0.2
SSH through the tunnel
ssh user@10.0.0.1
Or use sshuttle to route all traffic
sshuttle --dns -r user@10.0.0.1 0/0
Set up SOCKS proxy through tunnel
ssh -D 1080 user@10.0.0.1
Test connectivity
ping 10.0.0.1
Encoding Types
Auto-detect best encoding (default)
sudo iodine -f tunnel.example.com
sudo iodine -f -T TXT tunnel.example.com # TXT records
sudo iodine -f -T MX tunnel.example.com # MX records
sudo iodine -f -T CNAME tunnel.example.com # CNAME records
Force raw UDP mode (fastest, needs direct DNS access)
sudo iodine -f -r 1.2.3.4 tunnel.example.com
Performance Considerations
DNS tunneling is slow by nature:
- Typical throughput: 1-10 KB/s
- Latency: high (multiple DNS round trips per packet)
- Good for: SSH sessions, web browsing (painful), C2 comms
- Bad for: video streaming, large file transfers
Optimization:
- Use -m to set max downstream fragment size
- Lower MTU helps with fragmentation
- Raw mode (direct UDP to DNS server) is fastest
Tips
- DNS tunneling is detectable by high-volume DNS queries to a single domain
- Use for captive portal bypass or low-bandwidth covert channel, not high-speed data exfil
- Test from a restricted network first with
nslookup test.tunnel.example.com - Combine with SSH multiplexing to reduce the number of queries needed
Help / Man page
iodined [options] <tunnel_ip> <domain>
Server: runs on your public server
-f Foreground (don't daemonize)
-P PASSWORD Password
-i IP Listen on specific interface
iodine [options] [nameserver] <domain>
Client: runs on restricted network
-f Foreground
-P PASSWORD Password
-r DNS Use specific resolver
-T TYPE Record type: NULL,TXT,SRV,MX,CNAME
-O ENC Encoding: Base32,Base64,Base128,Raw
-m N Max downstream fragment size
-M N Max upstream fragment size
Vue d’ensemble
iodine fait transiter du trafic IPv4 à travers le DNS en encodant les données dans les requêtes et réponses DNS. Il sert à contourner les portails captifs (Wi-Fi d’aéroport/hôtel), les pare-feux restrictifs qui autorisent le DNS mais bloquent TCP/UDP, ainsi que pour des communications C2 furtives. Nécessite le contrôle d’un serveur DNS et d’un domaine.
Prérequis de configuration
1. Un domaine que vous contrôlez : tunnel.example.com
2. Un enregistrement NS pointant vers votre serveur :
tunnel.example.com NS ns.example.com
3. Un enregistrement A pour votre serveur de noms :
ns.example.com A 1.2.3.4
4. iodined en cours d'exécution sur votre serveur (1.2.3.4)
Configuration du serveur (iodined)
# Démarrer le serveur iodine sur votre VPS
# -f : s'exécuter au premier plan
# 10.0.0.1/24 : plage IP du tunnel (le serveur reçoit .1, le client .2)
# tunnel.example.com : votre sous-domaine
sudo iodined -f 10.0.0.1 tunnel.example.com
# Avec mot de passe
sudo iodined -f -P secretpassword 10.0.0.1 tunnel.example.com
# En tant que démon en arrière-plan
sudo iodined 10.0.0.1 tunnel.example.com
# Utiliser une interface réseau spécifique
sudo iodined -i 0.0.0.0 -f 10.0.0.1 tunnel.example.com
Utilisation du client (iodine)
# Se connecter depuis un réseau restreint (où seul le DNS est autorisé)
sudo iodine -f tunnel.example.com
# Avec mot de passe
sudo iodine -f -P secretpassword tunnel.example.com
# Spécifier le résolveur DNS (utiliser un résolveur public si le local bloque l'externe)
sudo iodine -f -r 8.8.8.8 tunnel.example.com
# Résultat : une interface de tunnel (dns0) apparaît avec l'IP 10.0.0.2
ip addr show dns0
Utilisation du tunnel
# Une fois connecté, router le trafic à travers le tunnel
# L'IP du serveur dans le tunnel est 10.0.0.1
# Votre IP dans le tunnel est 10.0.0.2
# SSH à travers le tunnel
ssh user@10.0.0.1
# Ou utiliser sshuttle pour router tout le trafic
sshuttle --dns -r user@10.0.0.1 0/0
# Mettre en place un proxy SOCKS à travers le tunnel
ssh -D 1080 user@10.0.0.1
# Tester la connectivité
ping 10.0.0.1
Types d’encodage
# Détection automatique du meilleur encodage (par défaut)
sudo iodine -f tunnel.example.com
sudo iodine -f -T TXT tunnel.example.com # Enregistrements TXT
sudo iodine -f -T MX tunnel.example.com # Enregistrements MX
sudo iodine -f -T CNAME tunnel.example.com # Enregistrements CNAME
# Forcer le mode UDP brut (le plus rapide, nécessite un accès DNS direct)
sudo iodine -f -r 1.2.3.4 tunnel.example.com
Considérations de performance
Le tunneling DNS est lent par nature :
- Débit typique : 1-10 Ko/s
- Latence : élevée (plusieurs allers-retours DNS par paquet)
- Adapté pour : sessions SSH, navigation web (pénible), communications C2
- Peu adapté pour : streaming vidéo, transferts de fichiers volumineux
Optimisation :
- Utiliser -m pour définir la taille max des fragments descendants
- Un MTU plus faible aide contre la fragmentation
- Le mode brut (UDP direct vers le serveur DNS) est le plus rapide
Conseils
- Le tunneling DNS est détectable par un volume élevé de requêtes DNS vers un seul domaine
- À utiliser pour le contournement de portail captif ou un canal furtif bas débit, pas pour l’exfiltration de données à haute vitesse
- Tester depuis un réseau restreint d’abord avec
nslookup test.tunnel.example.com - Combiner avec le multiplexage SSH pour réduire le nombre de requêtes nécessaires
Aide / Page de manuel
iodined [options] <tunnel_ip> <domain>
Server: runs on your public server
-f Foreground (don't daemonize)
-P PASSWORD Password
-i IP Listen on specific interface
iodine [options] [nameserver] <domain>
Client: runs on restricted network
-f Foreground
-P PASSWORD Password
-r DNS Use specific resolver
-T TYPE Record type: NULL,TXT,SRV,MX,CNAME
-O ENC Encoding: Base32,Base64,Base128,Raw
-m N Max downstream fragment size
-M N Max upstream fragment size