← retour aux outils back to tools

# 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