IODINE
IP-OVER-DNS
NULL RECORDS
TUN
DetectionBlue TeamSOCOctober 12, 2026•9 min read

Detecting iodine: IP-over-DNS Tunnels, NULL Records and tun Interfaces

iodine builds a real network interface and carries IP packets through DNS. That gives us two things to catch: the interface on the host and the record-type bias on the wire.

Scroll

iodine tunnels IPv4 over DNS. The client creates a virtual network interface (on Linux, dns0 by default), sends packets as encoded hostnames and receives replies in a record type negotiated with the server. Unlike a message-oriented DNS C2 channel, iodine aims for throughput, so its record-type mix and query shape stand apart from ordinary resolver traffic.

Signals at a Glance

SignalWhereATT&CK
iodine or iodined process, or -f -P with a domain argumentauditd, Sysmon for Linux, EDRT1572
New tun/tap interface such as dns0 on a host with no VPN roleauditd, EDR, interface inventoryT1572
Heavy NULL-type DNS queries and responsesZeek dns.log, resolver logsT1071.004
Encoded long hostnames under one operator-controlled zoneDNS logsT1572
Handshake probes cycling through record types before steady trafficDNS logsT1572

NULL Records and Query Shape

During setup iodine probes which record types the path will pass, and it then favours the largest: NULL when permitted, then PRIVATE, TXT, SRV, MX and CNAME as fallbacks. A NULL query (type 10) is almost never seen in ordinary traffic, so even a small count from one client is a strong signal. Zeek records the type name directly:

# Zeek - find clients using NULL queries and the zones they target
zeek-cut id.orig_h query qtype_name < dns.log \
  | awk '$3=="NULL" {c[$1" "$2]++} END {for (k in c) print c[k], k}' \
  | sort -rn | head -50

# Splunk equivalent
index=zeek sourcetype=bro_dns qtype_name IN ("NULL","PRIVATE","TXT")
| stats count AS q, dc(query) AS unique_names BY id.orig_h, qtype_name
| where q > 200
| sort - unique_names
# tune/validate: TXT has many legitimate uses (SPF, verification); NULL and
# PRIVATE are the high-confidence types.

Process and Interface Artifacts

The client needs privilege to create a tun device. That produces interface and process events that are easy to detect on servers and workstations that have no VPN role. The server side, iodined, needs the operator to control an NS delegation, which is an infrastructure signal you can look for in passive DNS:

title: iodine DNS Tunnel Client or Server
logsource:
  category: process_creation
  product: linux
detection:
  selection_img:
    Image|endswith:
      - '/iodine'
      - '/iodined'
  selection_cli:
    CommandLine|contains|all:
      - ' -f '
      - ' -P '
  condition: selection_img or selection_cli
level: high
# tune/validate: operators rename binaries; add an auditd rule on tun device
# creation (ioctl TUNSETIFF) and an inventory check for unexpected dns0 or tun interfaces.
Vetted sources

Use the iodine project documentation for protocol behaviour, Zeek dns.log, SigmaHQ Linux tunneling-tool rules, Elastic DNS tunneling content and Splunk ESCU DNS analytics. Always baseline your own environment — renamed binaries and alternate record types change the surface, so combine host, interface and wire signals.

Build Detections That Fire

Mjolnir Security helps blue teams turn threat intelligence into high-fidelity detections across endpoint, network, identity and cloud telemetry.

Detection EngineeringManaged Detection & ResponseThreat HuntingIncident ResponsePurple Teaming
  • Detection Engineering We build and tune detections mapped to ATT&CK from your own telemetry.
  • Threat Hunting as a Service Hypothesis-driven hunts for the behaviours on this page.
  • 24/7 Incident Response Containment when a detection fires. Call +1 833 403 5875.
Written by: Mjolnir Threat Research (MTAC)  |  Published: October 12, 2026  |  Last reviewed: October 12, 2026