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/iodine

Overview

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