networking

IGMP (Internet Group Management Protocol) Cos'è e Snooping

IGMP (Internet Group Management Protocol) Cos'è e Snooping

Scopri IGMP (Internet Group Management Protocol) e come funziona: versioni v1, v2 e v3, snooping, querier, pentest, proxy, analisi Wireshark, e sicurezza.

  • Pubblicato il 2026-03-23
  • Tempo di lettura: 18 min

IGMP: guida completa a snooping, querier, proxy, pacchetti e sicurezza #

IGMP (Internet Group Management Protocol) è il protocollo con cui un host dice alla rete “voglio ricevere il traffico di questo gruppo multicast”, e con cui un router (o uno switch) controlla chi è ancora interessato. Senza IGMP il multicast (IPTV, feed finanziari, cluster, protocolli di routing) arriverebbe a tutti, come un broadcast. Con IGMP, e con l’IGMP snooping sugli switch, arriva solo a chi l’ha chiesto. Il significato di IGMP snooping è: lo switch ascolta di nascosto i messaggi IGMP per sapere su quali porte inoltrare il multicast.

In questa guida trovi cos’è IGMP e come funziona, le differenze tra IGMPv1, IGMPv2 e IGMPv3, i messaggi e il formato dei pacchetti, IGMP query e IGMP querier (elezione e configurazione), IGMP snooping (abilitazione su Cisco, MikroTik, Juniper e Linux), IGMP proxy e IGMP proxying (pfSense e Linux, e come disabilitarlo), il legame con il multicast routing, l’analisi dei pacchetti con Wireshark e Scapy, il troubleshooting, gli attacchi e come difendersi.


Cos’è IGMP (Internet Group Management Protocol) e a cosa serve #

Il protocollo IGMP, in italiano protocollo di gestione dei gruppi Internet, lavora al livello 3 e viaggia direttamente dentro IP. È definito in tre RFC: IGMPv1 in RFC 1112, IGMPv2 in RFC 2236 , IGMPv3 in RFC 3376 .

Cos’è IGMP multicast, in una frase: IGMP è la parte “di iscrizione” del multicast. Il multicast manda un pacchetto a un gruppo di destinatari, IGMP decide chi fa parte del gruppo.

Una precisazione che confonde molti: IGMP non usa nessuna porta TCP o UDP. Non ha un numero di porta. Ha un numero di protocollo IP, il 2, come TCP ha il 6 e UDP il 17. Per questo in un firewall non scrivi “porta 2” ma “protocollo 2” (-p igmp in iptables). Se cerchi la porta del protocollo IGMP o il numero di protocollo IGMP: nessuna porta, protocollo 2.

CaratteristicaValore
Livello3 (dentro IP, senza TCP né UDP)
Numero di protocollo IP2
Porte TCP/UDPNessuna
TTL dei pacchetti1 (non escono dal segmento)
Opzione IPRouter Alert (header di 24 byte invece di 20) in IGMPv2 e IGMPv3. Il significato è: avviso al router
Indirizzi usati224.0.0.1, 224.0.0.2, 224.0.0.22 e l’indirizzo del gruppo
IPv6Non esiste: si usa MLD (vedi sotto)

Per il pacchetto IP in cui viaggia, vedi IP Internet Protocol .


Multicast in due minuti: indirizzi e MAC #

Il multicast IPv4 usa la classe D, da 224.0.0.0 a 239.255.255.255. Un pacchetto va a un gruppo di host interessati, non a uno solo (unicast) né a tutti (broadcast).

IndirizzoUso
224.0.0.1Tutti gli host del segmento (le General Query vanno qui)
224.0.0.2Tutti i router (i Leave Group vanno qui)
224.0.0.5 / 224.0.0.6OSPF
224.0.0.9RIPv2
224.0.0.10EIGRP
224.0.0.13PIM
224.0.0.18VRRP
224.0.0.22IGMPv3 (i Report vanno qui)
224.0.0.251mDNS
239.255.255.250SSDP (UPnP)
232.0.0.0/8Source-Specific Multicast (SSM)
239.0.0.0/8Scope privato, come gli IP privati

Tutto 224.0.0.0/24 è link-local: i router non lo inoltrano mai, e di solito gli host non mandano nemmeno un Report IGMP per questi gruppi. Ha una conseguenza pratica per il pentest, spiegata più avanti.

Da IP multicast a MAC. Gli switch ragionano sui MAC. Il MAC multicast si calcola con il prefisso 01:00:5e più gli ultimi 23 bit dell’indirizzo IP. Esempio: 239.255.10.10 diventa 01:00:5e:7f:0a:0a. Poiché i bit usati sono 23 e non 28, 32 gruppi IP diversi condividono lo stesso MAC: 224.1.1.1 e 239.129.1.1 finiscono sullo stesso MAC e uno switch senza snooping non li distingue.


IGMPv1, IGMPv2 e IGMPv3: differenze #

VersioneRFCNovitàLeave
IGMPv11112Query e Report, nient’altroNessuno: il gruppo scade per timeout
IGMPv22236Leave Group, Group-Specific Query ed elezione del querierSì, verso 224.0.0.2
IGMPv33376Filtro per sorgente (include/exclude), Report verso 224.0.0.22Sì, come cambio di stato nel Report

Il significato di Leave Group è: messaggio con cui un host esce da un gruppo. Quello di Group-Specific Query è: domanda su un solo gruppo.

IGMPv2 vs IGMPv3, il confronto che serve davvero:

IGMPv2IGMPv3
Cosa chiede l’hostIl gruppoIl gruppo e, volendo, le sorgenti
Filtro per sorgenteNoSì (include/exclude)
Source-Specific Multicast (SSM)NoSì (RFC 4604)
Destinazione dei ReportL’indirizzo del gruppo224.0.0.22
Tipo di Report0x160x22
LeaveMessaggio 0x17 verso 224.0.0.2Report con record di cambio di stato
Un Report per host o per gruppo?Uno per gruppo, gli altri host tacciono (suppression)Uno per host, senza suppression
QueryGeneral e Group-SpecificGeneral, Group-Specific e Group-and-Source-Specific

Le versioni sono retrocompatibili: se in un segmento c’è anche un solo dispositivo IGMPv2, il querier scende a IGMPv2 e le funzioni IGMPv3 smettono di funzionare per tutti. È una causa classica di problemi con il multicast (vedi troubleshooting).


Messaggi IGMP e formato del pacchetto #

Il messaggio IGMPv1/v2 è lungo 8 byte:

CampoDimensioneDescrizione
Type1 byteTipo di messaggio (tabella sotto)
Max Response Time1 byteSolo nelle Query, in decimi di secondo
Checksum2 byteChecksum del messaggio
Group Address4 byteIl gruppo (0.0.0.0 nella General Query)
TypeMessaggioDestinazione IPChi lo manda
0x11Membership Query (General o Group-Specific)224.0.0.1 o il gruppoRouter / querier
0x12Membership Report IGMPv1Il gruppoHost
0x16Membership Report IGMPv2 (il “join”)Il gruppoHost
0x17Leave Group224.0.0.2Host
0x22Membership Report IGMPv3224.0.0.22Host

Il significato di Membership Query è: domanda “chi è iscritto?”. Quello di Membership Report è: risposta “io sono iscritto a questo gruppo”.

Il Report IGMPv3 contiene uno o più record di gruppo, ognuno con un tipo:

Record typeNomeUso
1MODE_IS_INCLUDEStato attuale: solo queste sorgenti
2MODE_IS_EXCLUDEStato attuale: tutte tranne queste sorgenti
3CHANGE_TO_INCLUDECambio di stato. Con lista vuota equivale a un leave
4CHANGE_TO_EXCLUDECambio di stato. Con lista vuota equivale a un join su qualsiasi sorgente
5ALLOW_NEW_SOURCESAggiunge sorgenti
6BLOCK_OLD_SOURCESToglie sorgenti

Come funziona IGMP: query, report e leave #

Il flusso con IGMPv2, con i tempi di default:

  1. Il querier manda una General Query a 224.0.0.1 ogni 125 secondi (query interval).
  2. Gli host interessati rispondono con un Membership Report all’indirizzo del gruppo, ognuno dopo un ritardo casuale entro 10 secondi (query response interval).
  3. Se un host riceve il Report di un altro host per lo stesso gruppo, sopprime il proprio: basta un Report per gruppo per tenerlo attivo.
  4. Quando un host vuole entrare, manda subito un Report senza aspettare la Query (è il “join”).
  5. Quando un host esce, manda un Leave Group a 224.0.0.2.
  6. Il querier risponde con una Group-Specific Query per quel gruppo (una al secondo, due volte). Se nessuno risponde, il gruppo viene tolto.
  7. Se un gruppo non riceve Report per 260 secondi (due volte l’intervallo più il tempo di risposta), scade.

Quel numero, 260 secondi, è la chiave del troubleshooting più comune: se in una VLAN nessuno manda le Query, il multicast funziona per circa 4 minuti e poi si ferma.

IGMP query: General Query e Group-Specific Query #

Le IGMP query sono di tre tipi:

QueryDestinazioneCampo gruppoQuando si usa
General Query224.0.0.10.0.0.0Ogni 125 secondi: “chi è iscritto a qualcosa?”
Group-Specific QueryL’indirizzo del gruppoIl gruppoDopo un Leave: “c’è ancora qualcuno per questo gruppo?”
Group-and-Source-Specific QueryL’indirizzo del gruppoIl gruppo più la lista sorgentiSolo IGMPv3, dopo un cambio di sorgenti

Il significato di General Query è: domanda generale a tutti gli host.

IGMP leave group e membership report #

Il Membership Report è il “join” (e la risposta alle Query). Il Leave Group è l’uscita. In IGMPv1 il Leave non esiste: l’host tace e il gruppo scade dopo il timeout. In IGMPv2 il Leave porta il tempo di uscita a pochi secondi. In IGMPv3 il Leave diventa un Report con record di tipo 3 e lista vuota.


IGMP querier: elezione e configurazione #

L’IGMP querier è il dispositivo che manda le Query in un segmento. In ogni segmento ce ne deve essere uno solo attivo.

Come funziona la querier election (elezione del querier). All’inizio ogni router multicast crede di essere il querier e manda una General Query. Quando ne vede una con un indirizzo IP sorgente più basso del proprio, smette. Vince l’IP più basso. Gli altri restano in ascolto e riprendono il ruolo se il querier tace per circa 255 secondi (other querier present interval).

Due conseguenze importanti: chiunque nel segmento possa mandare una Query con un IP più basso diventa il querier (è un attacco, spiegato sotto), e in una VLAN senza router multicast serve uno snooping querier configurato sullo switch, altrimenti nessuno manda Query.

IGMP querier configuration: Cisco, MikroTik e Linux #

text
# Cisco: snooping querier with a fixed source address (the lowest IP on the VLAN)
configure terminal
ip igmp snooping querier
ip igmp snooping querier address 10.10.10.2
end
show ip igmp snooping querier
text
# MikroTik (RouterOS): querier on the bridge
/interface bridge set [find name=bridge1] igmp-snooping=yes multicast-querier=yes
bash
# Linux bridge: enable the querier and check which groups it learned
sudo ip link set br0 type bridge mcast_snooping 1 mcast_querier 1
bridge mdb show

Su un router multicast con IGMP attivo su un’interfaccia (tipicamente una SVI) il querier è il router stesso: non serve altro. Con più router nella stessa VLAN, dai a quello che vuoi come querier l’IP più basso.


IGMP snooping: cos’è, come funziona e come si configura #

Cos’è IGMP snooping: una funzione degli switch che legge i Report e i Leave che passano e costruisce una tabella con gruppo e porte interessate. Uno switch senza snooping tratta il multicast come un broadcast e lo manda su tutte le porte della VLAN. Con lo snooping il multicast va solo sulle porte dove qualcuno ha chiesto quel gruppo, più la porta del router.

Come si comporta uno switch con IGMP snooping:

SituazioneComportamento
Un host manda un ReportLa porta entra nella tabella di quel gruppo
Un host manda un LeaveLo switch manda una Group-Specific Query, poi toglie la porta se nessuno risponde (subito, con Fast Leave)
Arrivano QueryLo switch le inoltra e segna la porta come mrouter port (porta del router)
Traffico verso 224.0.0.0/24Inoltrato su tutte le porte, sempre
Traffico verso un gruppo senza iscrittiInoltrato alle sole mrouter port, oppure inondato, a seconda del modello
Nessuna Query per circa 260 secondiLe voci scadono e il multicast si ferma

Il significato di Fast Leave è: uscita immediata, la porta viene tolta appena arriva il Leave, senza controllare se c’è ancora qualcuno. Va bene con un host per porta, è sbagliato con più host sulla stessa porta (access point, switch a valle).

Come abilitare IGMP snooping su Cisco switch #

Su molti Catalyst è già attivo a livello globale. Configurazione per una VLAN senza router multicast:

text
configure terminal
ip igmp snooping
ip igmp snooping vlan 10
ip igmp snooping querier
ip igmp snooping querier address 10.10.10.2
end

La sintassi esatta varia tra Catalyst, IOS e IOS XE: digita ? dopo ip igmp snooping per vedere cosa supporta il tuo switch.

IGMP snooping per VLAN: configurazione e verifica #

text
! Snooping enabled only on VLAN 10, disabled on VLAN 20
ip igmp snooping vlan 10
no ip igmp snooping vlan 20

! Fixed multicast router port, instead of learning it from any Query
ip igmp snooping vlan 10 mrouter interface GigabitEthernet1/0/24

! Static group on a port (for devices that never send Reports)
ip igmp snooping vlan 10 static 239.255.10.10 interface GigabitEthernet1/0/5

! Fast Leave, only if there is one host per port
ip igmp snooping vlan 10 immediate-leave

Verifica:

text
show ip igmp snooping
show ip igmp snooping vlan 10
show ip igmp snooping groups
show ip igmp snooping querier
show ip igmp snooping mrouter

IGMP snooping su MikroTik, Juniper, Linux e altri switch #

text
# MikroTik (RouterOS): snooping on the bridge, then list the learned groups
/interface bridge set [find name=bridge1] igmp-snooping=yes
/interface bridge mdb print

# Juniper EX: snooping on all VLANs, then check membership
set protocols igmp-snooping vlan all
show igmp-snooping membership
bash
# Linux bridge
sudo ip link set br0 type bridge mcast_snooping 1
bridge mdb show

Sugli switch Netgear, Zyxel e simili l’opzione è nel menu web (cerca “IGMP Snooping” e “IGMP Querier” nella sezione Multicast). Attiva sempre lo snooping insieme a un querier, se nella VLAN non c’è un router multicast.

Errori tipici con IGMP snooping #

  • Snooping attivo e nessun querier: il multicast si ferma dopo circa 260 secondi.
  • Snooping attivo solo su alcuni switch della catena: il multicast viene inondato dove è spento.
  • Fast Leave con più host per porta: chi resta perde il flusso.
  • Dispositivi che non mandano Report (alcune telecamere, apparati industriali): serve un gruppo statico sulla porta.
  • Snooping spento: il multicast arriva a tutti gli host, anche a chi non lo vuole.

IGMP proxy e IGMP proxying: cos’è, upstream e downstream #

L’IGMP proxy è una funzione di un router (non di uno switch) che inoltra gli IGMP Report ricevuti dalle interfacce interne (downstream) verso un’interfaccia esterna (upstream), senza far girare un vero protocollo di routing multicast come PIM. Il router si comporta come un host verso l’upstream e come un querier verso il downstream. L’azione si chiama anche IGMP proxying.

Il caso tipico: un router riceve IPTV multicast dal provider sulla WAN e lo distribuisce ai dispositivi della LAN.

TermineSignificato
UpstreamL’interfaccia verso la sorgente del multicast (di solito la WAN). Il proxy qui si comporta come un host e manda i Report
DownstreamLe interfacce verso gli host (la LAN). Il proxy qui si comporta come un querier
Networks / altnetLe reti sorgente ammesse da cui accettare il multicast
ThresholdSoglia di TTL sotto la quale i pacchetti non vengono inoltrati

Una limitazione: igmpproxy gestisce una sola interfaccia upstream.

IGMP proxy su pfSense: configurazione #

Percorso: Services, IGMP Proxy.

  1. Attiva “Enable IGMP”.
  2. Aggiungi l’interfaccia upstream: interfaccia WAN, tipo Upstream, e nel campo Networks le reti sorgente del multicast del provider (ad esempio 10.20.0.0/16).
  3. Aggiungi l’interfaccia downstream: interfaccia LAN, tipo Downstream, e come rete la subnet della LAN (ad esempio 192.168.1.0/24).
  4. Nel firewall, sulla WAN, aggiungi una regola che permetta il protocollo IGMP con l’opzione “Allow IP options” attiva (altrimenti l’opzione Router Alert blocca i pacchetti), e una regola che permetta il traffico multicast 224.0.0.0/4 verso la LAN.

Se il flusso non arriva, controlla prima le regole del firewall: è la causa più frequente.

IGMP proxy su Linux con igmpproxy #

bash
sudo apt install igmpproxy

File /etc/igmpproxy.conf:

text
quickleave

phyint eth0 upstream ratelimit 0 threshold 1
        altnet 10.20.0.0/16

phyint eth1 downstream ratelimit 0 threshold 1

phyint eth2 disabled
bash
# The reverse path filter must be off on the upstream interface
sudo sysctl -w net.ipv4.conf.all.rp_filter=0
sudo sysctl -w net.ipv4.conf.eth0.rp_filter=0

# Run in the foreground with debug to see joins and forwarding
sudo igmpproxy -d -v /etc/igmpproxy.conf

quickleave è l’equivalente del Fast Leave: togli il gruppo appena arriva il Leave, senza Group-Specific Query.

Come disabilitare IGMP proxying (e se conviene) #

bash
# Linux
sudo systemctl stop igmpproxy
sudo systemctl disable igmpproxy

Su pfSense togli la spunta a “Enable IGMP” in Services, IGMP Proxy. Sui router di casa è un’opzione tra le impostazioni WAN o avanzate (spesso con il nome “IGMP Proxy” o “IGMP Proxying”).

Devo disabilitare IGMP proxying?

SituazioneCosa fare
Usi IPTV o multicast che arriva dalla WANLascialo attivo, altrimenti i flussi non arrivano
Non usi nessun multicast dalla WANPuoi disabilitarlo senza conseguenze
Il router è esposto e il multicast non serveDisabilitalo: una funzione in meno da proteggere

Non è una funzione critica per la sicurezza: ha senso accenderla solo quando serve.

IGMP snooping, IGMP proxy e querier a confronto #

IGMP snoopingIGMP proxyIGMP querier
Dove giraSwitch (livello 2)Router (livello 3)Router o switch
Cosa faLimita il multicast alle porte interessateInoltra i Report verso l’upstreamManda le Query e tiene vive le iscrizioni
Serve un routing multicast?NoNo (sostituisce PIM nei casi semplici)No
Problema tipicoMulticast che si ferma dopo 260 secondiIPTV che non arrivaDue querier o nessun querier

IGMP e multicast routing: dove entra PIM #

IGMP lavora solo tra gli host e il router a cui sono collegati. Per portare il multicast tra router serve un protocollo di routing multicast, di solito PIM (Protocol Independent Multicast). Il flusso: l’host fa un join con IGMP, il router riceve il Report e chiede il gruppo ai router a monte con PIM.

text
! Cisco: enable multicast routing and PIM on the interface where the hosts are
ip multicast-routing
ip pim rp-address 10.255.0.1

interface Vlan10
 ip address 10.10.10.1 255.255.255.0
 ip pim sparse-mode
 ip igmp version 3
text
show ip igmp groups
show ip pim neighbor
show ip pim rp mapping
show ip mroute 239.255.10.10

Se l’albero multicast non si forma, guarda in quest’ordine: i Report arrivano al router (show ip igmp groups)? Il router vede i vicini PIM (show ip pim neighbor)? C’è un RP raggiungibile (show ip pim rp mapping)? La voce (*, G) esiste in show ip mroute?


Comandi Cisco IGMP: cheat sheet #

Sui router e sugli switch di livello 3:

text
! Show groups learned on the router and the interface state
show ip igmp groups
show ip igmp interface

! Force IGMP version on an interface
interface Vlan10
 ip igmp version 2

! The router itself becomes a member of the group (useful to test the multicast path)
 ip igmp join-group 239.255.10.10

! The router forwards the group out of this interface as if hosts had joined, without being a member itself
 ip igmp static-group 239.255.10.10

Per limitare i gruppi che un host può chiedere su una porta dello switch si usa un profilo IGMP:

text
ip igmp profile 10
 permit
 range 239.255.10.0 239.255.10.255
!
interface GigabitEthernet1/0/5
 ip igmp filter 10
 ip igmp max-groups 3

Con questo profilo la porta può unirsi solo ai gruppi 239.255.10.x, e a un massimo di 3. È una delle difese più efficaci contro i join non autorizzati.


NLB e IGMP multicast #

Il Network Load Balancing di Windows Server può lavorare in modalità unicast, multicast o IGMP multicast. Nell’ultima il cluster usa un gruppo 239.255.x.x, con MAC 01:00:5e:7f:xx:xx, e manda Report IGMP in modo che lo snooping porti il traffico solo alle porte dei nodi. Se in una VLAN con NLB in questa modalità c’è lo snooping attivo ma nessun querier, il traffico verso il cluster si ferma dopo i 260 secondi di cui sopra. Se invece lo snooping è spento, il traffico viene inondato su tutta la VLAN.


Analisi dei pacchetti IGMP con Wireshark, tshark e tcpdump #

Il traffico IGMP è raro e si vede subito. Guide generali: Wireshark , tcpdump , TShark , Sniffing .

Packet capture con tcpdump:

bash
# All IGMP traffic (protocol 2)
sudo tcpdump -i eth0 -nn -vv igmp

# Save a capture for Wireshark
sudo tcpdump -i eth0 -nn igmp -w igmp.pcap

Filtri Wireshark per l’analisi dei pacchetti IGMP:

text
igmp
igmp.type == 0x11
igmp.type == 0x16
igmp.type == 0x17
igmp.type == 0x22
igmp.version == 3

Il primo mostra tutto, gli altri isolano le Query (0x11), i join IGMPv2 (0x16), i Leave (0x17) e i Report IGMPv3 (0x22).

Estrarre chi chiede cosa con tshark:

bash
# Source IP, destination, type and group
tshark -i eth0 -f "igmp" -T fields -e ip.src -e ip.dst -e igmp.type -e igmp.maddr

Cosa guardare in una cattura:

  • Chi manda le Query (tipo 0x11): dovrebbe essere un solo IP. Due IP diversi vuol dire due querier o un attacco.
  • Il TTL: deve essere 1. Un pacchetto IGMP con TTL diverso è anomalo.
  • L’opzione Router Alert nell’header IP: negli IGMPv2/v3 deve esserci.
  • Il ritardo tra Query e Report: fino a 10 secondi, con Report scaglionati.
  • Le versioni: una Query IGMPv2 in mezzo a host IGMPv3 abbassa tutto il segmento.

Generare pacchetti IGMP con Scapy #

Per il packet crafting e per capire il formato dei pacchetti, la strada più veloce è Scapy . I pacchetti sotto sono stati costruiti e controllati con Scapy: protocollo 2, TTL 1, Router Alert, tipi 0x16, 0x17, 0x11.

python
from scapy.all import IP, IGMP, send
from scapy.contrib.igmpv3 import IGMPv3, IGMPv3mr, IGMPv3gr
from scapy.layers.inet import IPOption_Router_Alert

ROUTER_ALERT = [IPOption_Router_Alert()]
GROUP = "239.255.10.10"

# IGMPv2 join (Membership Report, type 0x16), sent to the group address
join_v2 = IP(dst=GROUP, ttl=1, options=ROUTER_ALERT) / IGMP(type=0x16, gaddr=GROUP)

# IGMPv2 Leave Group (type 0x17), sent to all routers
leave_v2 = IP(dst="224.0.0.2", ttl=1, options=ROUTER_ALERT) / IGMP(type=0x17, gaddr=GROUP)

# General Query (type 0x11), sent to all hosts, max response 10 seconds (100 tenths)
general_query = IP(dst="224.0.0.1", ttl=1, options=ROUTER_ALERT) / IGMP(type=0x11, mrcode=100, gaddr="0.0.0.0")

# Group-Specific Query for one group, max response 1 second
group_query = IP(dst=GROUP, ttl=1, options=ROUTER_ALERT) / IGMP(type=0x11, mrcode=10, gaddr=GROUP)

# IGMPv3 join: Report to 224.0.0.22, record type 4 (CHANGE_TO_EXCLUDE) with no sources
join_v3 = (
    IP(dst="224.0.0.22", ttl=1, options=ROUTER_ALERT)
    / IGMPv3(type=0x22)
    / IGMPv3mr(numgrp=1)
    / IGMPv3gr(rtype=4, maddr=GROUP)
)

send(join_v2, iface="eth0")

Con send() scrivi il pacchetto IGMP a mano, ma il kernel non sa di essere iscritto. Per un join vero, dove il sistema operativo manda i Report e riceve i dati, usa il sistema operativo:

python
import socket
import struct

GROUP = "239.255.10.10"
PORT = 5000

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("", PORT))

# This call makes the kernel send the IGMP Membership Report
membership = struct.pack("4s4s", socket.inet_aton(GROUP), socket.inet_aton("0.0.0.0"))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, membership)

while True:
    data, sender = sock.recvfrom(2048)
    print(sender, data[:60])

Per vedere cosa succede, in un altro terminale:

bash
# Groups the host is joined to, per interface
ip maddr show dev eth0
cat /proc/net/igmp

IGMP in un pentest: ricognizione #

Nel pentest di rete IGMP serve soprattutto per la ricognizione: scopri quali applicazioni multicast girano e quali host le usano.

1. Ascolto passivo (il metodo più silenzioso):

bash
sudo tcpdump -i eth0 -nn igmp

Le Query rivelano chi è il querier e la versione. I Report rivelano quali host sono iscritti a quali gruppi, quindi che servizi usano: un gruppo 239.x.x.x fisso indica un’applicazione (streaming, market data, cluster).

2. Query attiva con Nmap. Lo script NSE broadcast-igmp-discovery manda una Query e raccoglie i Report:

bash
sudo nmap --script broadcast-igmp-discovery -e eth0

3. Gruppi multicast in uso senza IGMP. Molti servizi vivono su 224.0.0.0/24 e non fanno Report. Si vedono ascoltando tutto il multicast:

bash
sudo tcpdump -i eth0 -nn 'dst net 224.0.0.0/4'
DestinazioneCosa rivela
224.0.0.5 / 224.0.0.6OSPF attivo nel segmento
224.0.0.10EIGRP attivo
224.0.0.9RIPv2 attivo
224.0.0.18VRRP (c’è un gateway ridondato)
224.0.0.251mDNS (Apple, stampanti, Chromecast)
239.255.255.250SSDP / UPnP

Per i protocolli di routing che trovi, vedi OSPF, EIGRP, BGP e RIP .

4. Ping a 224.0.0.1. Si usa ancora, ma funziona meno di quanto si dica:

bash
ping -I eth0 -c 3 224.0.0.1

Windows e molti dispositivi embedded (stampanti, telecamere, apparati di rete) rispondono. Linux, di default, non risponde a echo request inviati a indirizzi broadcast o multicast (net.ipv4.icmp_echo_ignore_broadcasts=1). Se non risponde nessuno, non significa che la rete sia vuota. Per l’ICMP in generale vedi ICMP , per lo scanning Nmap .

Un’informazione importante per chi attacca. Con lo snooping attivo i gruppi 224.0.0.0/24 vengono inondati su tutte le porte. Quindi sullo stesso segmento un host qualsiasi vede già gli Hello di OSPF o EIGRP, senza nessun join e senza nessun pacchetto spoofato. Non serve inviare un Report finto per ricevere 224.0.0.5: basta mettere la scheda in ascolto.


Attacchi a IGMP: cheat sheet #

IGMP non ha autenticazione: chiunque nel segmento può mandare Report, Leave e Query. Questi sono gli abusi reali, con comando e impatto. Usali solo in laboratorio o su reti per cui hai l’autorizzazione.

AttaccoComeImpattoCome si vede
Join non autorizzatoReport per un gruppo a cui non dovresti accedereRicevi flussi riservati (video, dati di mercato)Report da host inattesi
Querier takeoverQuery con IP sorgente più basso del querierPrendi il controllo delle Query, puoi smettere di mandarleDue IP che mandano Query
IGMP floodTanti Report per gruppi diversiTabella di snooping piena, lo switch inonda tuttoPicco di Report, CPU alta
Leave spoofatoLeave a nome di un altro hostIl flusso si interrompe per quell’hostGroup-Specific Query anomale
Report suppressionReport falsi per far tacere gli host (IGMPv1/v2)Iscrizioni che scadonoPochi Report legittimi

Il significato di IGMP flood è: inondazione di messaggi IGMP.

Join non autorizzato a un gruppo #

Il metodo pulito è chiedere al kernel di fare il join, con lo script Python della sezione Scapy (IP_ADD_MEMBERSHIP). Se il flusso arriva, la rete non filtra chi può iscriversi. Il test vale per ogni gruppo che non dovresti vedere (239.x.x.x di streaming o di dati interni).

Querier takeover #

Un host manda una Query con un IP sorgente più basso di quello del querier legittimo. Gli altri smettono di mandare Query e riconoscono l’attaccante come querier. Poi basta non mandare più Query: dopo 260 secondi le iscrizioni scadono e il multicast si ferma per tutti.

python
from scapy.all import IP, IGMP, send
from scapy.layers.inet import IPOption_Router_Alert

# Query with a source IP lower than the legitimate querier (lab only)
query = (
    IP(src="10.10.10.1", dst="224.0.0.1", ttl=1, options=[IPOption_Router_Alert()])
    / IGMP(type=0x11, mrcode=100, gaddr="0.0.0.0")
)
send(query, iface="eth0", count=3, inter=1)

Per funzionare, l’IP usato deve essere più basso di quello del querier reale. Alcuni switch usano 0.0.0.0 come sorgente per le Query di snooping: guarda cosa vedi in cattura prima di scegliere.

IGMP flood: Report e Leave in massa #

Un attaccante manda molti Report per gruppi sempre diversi. Se la tabella di snooping dello switch si riempie, molti modelli passano a inondare il multicast su tutte le porte (si “aprono” invece di bloccare), con perdita di isolamento e di banda. Un test controllato, limitato a 200 pacchetti:

python
from scapy.all import IP, IGMP, send
from scapy.layers.inet import IPOption_Router_Alert

# Lab only: 200 Reports for different groups, to see how the switch table reacts
for i in range(200):
    group = f"239.1.{i // 250}.{i % 250 + 1}"
    report = IP(dst=group, ttl=1, options=[IPOption_Router_Alert()]) / IGMP(type=0x16, gaddr=group)
    send(report, iface="eth0", verbose=False)

Poi guarda lo switch: show ip igmp snooping groups per le voci create e show processes cpu per l’effetto sulla CPU. Se non hai limiti sul numero di gruppi (ip igmp max-groups), il test mostra quanto è esposta quella porta.

Leave spoofato e report suppression #

Un Leave Group inviato con l’IP di un altro host fa partire le Group-Specific Query: se l’host vero risponde, l’effetto è nullo. Diventa un problema con il Fast Leave attivo e più host sulla stessa porta, perché lo switch toglie la porta senza chiedere. La report suppression (IGMPv1/v2) sfrutta il fatto che gli host tacciono se vedono un Report altrui: un attaccante che risponde per primo per un gruppo riduce i Report reali.


IGMP troubleshooting: multicast che non funziona #

SintomoCausa probabileCome verificare / soluzione
Il multicast funziona 4 minuti e poi si fermaNessun querier nella VLANshow ip igmp snooping querier; attiva uno snooping querier
Il multicast arriva solo a una parte degli hostSnooping senza mrouter portshow ip igmp snooping mrouter; configura la porta del router
Nessun flusso, tutto sembra configuratoIl firewall blocca il protocollo 2sudo iptables -A INPUT -p igmp -j ACCEPT
IGMPv3 non funzionaUn dispositivo IGMPv2 abbassa la versioneControlla la versione delle Query in cattura
Il multicast non attraversa le VLANManca il routing multicast (PIM) o l’IGMP proxyshow ip igmp groups e show ip mroute sul router di confine
Il flusso arriva a tutti gli hostSnooping disabilitatoshow ip igmp snooping
Il flusso si ferma quando un host esceFast Leave con più host sulla portaDisattiva l’immediate leave su quella porta
Il flusso non supera il primo routerTTL 1 dalla sorgenteAumenta il TTL dell’applicazione
NLB non raggiunge il clusterSnooping senza querier, o gruppo non gestitoVerifica querier e MAC 01:00:5e:7f:xx:xx

Comandi utili sul lato Linux:

bash
# Groups joined on this host
ip maddr show
cat /proc/net/igmp

# Force the host to speak IGMPv2 on an interface (to test version compatibility)
sudo sysctl -w net.ipv4.conf.eth0.force_igmp_version=2

Test end-to-end con iperf (multicast di prova). Sul ricevitore, che fa il join:

bash
iperf -s -u -B 239.255.10.10 -i 1

Sul mittente:

bash
iperf -c 239.255.10.10 -u -T 32 -t 5 -i 1

Mentre il test gira, controlla in cattura che il ricevitore mandi il Report e che sullo switch compaia il gruppo (show ip igmp snooping groups). Se il ricevitore non vede traffico, il problema è tra il Report e la tabella dello switch. Se non c’è nemmeno il Report, è il ricevitore o il suo firewall.


IGMP e IPv6: MLD #

IGMP esiste solo per IPv4. In IPv6 lo stesso lavoro lo fa MLD (Multicast Listener Discovery), che viaggia dentro ICMPv6. MLDv1 corrisponde a IGMPv2, MLDv2 a IGMPv3. Lo snooping per IPv6 si chiama MLD snooping. Per il confronto tra i due protocolli vedi IPv4 e IPv6 .


Cheat sheet #

AzioneComando
Catturare IGMPsudo tcpdump -i eth0 -nn -vv igmp
Query attiva con Nmapsudo nmap --script broadcast-igmp-discovery -e eth0
Gruppi dell’host Linuxip maddr show / cat /proc/net/igmp
Forzare IGMPv2sudo sysctl -w net.ipv4.conf.eth0.force_igmp_version=2
Permettere IGMP in iptablessudo iptables -A INPUT -p igmp -j ACCEPT
Snooping su Linux bridgesudo ip link set br0 type bridge mcast_snooping 1 mcast_querier 1
Gruppi snooping su Linuxbridge mdb show
Test multicastiperf -s -u -B 239.255.10.10 -i 1
Cisco: stato snoopingshow ip igmp snooping
Cisco: gruppi snoopingshow ip igmp snooping groups
Cisco: queriershow ip igmp snooping querier
Cisco: gruppi sul routershow ip igmp groups
Cisco: tabella multicastshow ip mroute
Filtro Wireshark Queryigmp.type == 0x11
Filtro Wireshark join v2igmp.type == 0x16
Filtro Wireshark Leaveigmp.type == 0x17
Filtro Wireshark Report v3igmp.type == 0x22

Come difendersi: IGMP security e hardening #

IGMP non ha autenticazione, quindi la difesa è controllare chi può parlare IGMP, a quali gruppi può iscriversi e quanto. In ordine di priorità:

1. Configura un querier fisso e affidabile. Il querier legittimo deve avere l’IP più basso della VLAN, così un host qualsiasi non lo scalza. Sugli switch usa uno snooping querier con un indirizzo scelto da te:

text
ip igmp snooping querier
ip igmp snooping querier address 10.10.10.2

2. Filtra i gruppi consentiti per porta e metti un massimo. Un profilo IGMP su ogni porta utente impedisce i join a gruppi non previsti, e max-groups limita i flood di Report:

text
ip igmp profile 10
 permit
 range 239.255.10.0 239.255.10.255
!
interface GigabitEthernet1/0/5
 ip igmp filter 10
 ip igmp max-groups 3

3. Limita il multicast che una porta può generare:

text
interface GigabitEthernet1/0/5
 storm-control multicast level 10

4. Disattiva il Fast Leave sulle porte dove ci può essere più di un host (access point, switch a valle, telefoni con PC dietro).

5. Segmenta. Metti le applicazioni multicast in VLAN dedicate : un host in un’altra VLAN non vede né i gruppi né i Report.

6. Fissa le mrouter port. Dichiara staticamente la porta del router multicast, invece di impararla da qualunque Query che passi.

7. Disabilita IGMP dove non serve. Sui segmenti utente senza applicazioni multicast, spegni l’IGMP proxying e blocca 224.0.0.0/4 in uscita dove ha senso. Sui router di casa lascia l’IGMP proxying attivo solo se usi IPTV.

8. Autentica la porta. L’accesso alla rete con 802.1X o port security riduce chi può parlare IGMP, perché l’host non autorizzato non arriva nemmeno alla VLAN.

Cosa monitorare (detection):

  • Più di un IP che manda Query nella stessa VLAN: possibile querier takeover.
  • Report da host che non dovrebbero usare multicast o verso gruppi fuori dal piano.
  • Picchi di Report o di Leave: possibile IGMP flood. Controlla anche la CPU dello switch e la dimensione della tabella di snooping.
  • Group-Specific Query frequenti per gli stessi gruppi: possibile Leave spoofato.
  • Pacchetti IGMP con TTL diverso da 1 o senza Router Alert.

Una verifica rapida dei querier su un segmento, da una macchina di monitoraggio:

bash
# Lists every source IP sending Queries; there should be exactly one
tshark -i eth0 -Y "igmp.type == 0x11" -T fields -e ip.src | sort | uniq -c

Sul lato syslog e SNMP, abilita il log delle modifiche di querier e della tabella IGMP sui router e sugli switch, e invia gli eventi al SIEM.

Usa le tecniche di questo articolo solo su reti per cui hai l’autorizzazione: inviare pacchetti IGMP falsificati o in massa può interrompere i servizi.


FAQ #

Cos’è IGMP? È il protocollo con cui gli host IPv4 comunicano al router locale a quali gruppi multicast vogliono partecipare.

IGMP usa una porta? No. È un protocollo IP con numero 2, senza porte TCP o UDP.

Cos’è l’IGMP snooping? È la funzione con cui uno switch ascolta i messaggi IGMP e manda il multicast solo alle porte interessate.

Qual è la differenza tra IGMP snooping e IGMP proxy? Lo snooping gira sugli switch e limita il multicast alle porte interessate. Il proxy gira sui router e inoltra le richieste degli host verso un’interfaccia upstream.

Cos’è l’IGMP querier? È il dispositivo che manda le Query in un segmento. Se ne elegge uno solo: vince l’indirizzo IP più basso.

Cos’è una IGMP General Query? È una domanda mandata a 224.0.0.1 con gruppo 0.0.0.0: “chi è iscritto a qualcosa?”. La Group-Specific Query chiede invece di un gruppo preciso.

Differenza tra IGMPv2 e IGMPv3? IGMPv3 aggiunge il filtro per sorgente (include/exclude), che permette l’SSM, e manda i Report a 224.0.0.22. IGMPv2 conosce solo il gruppo.

Perché il multicast si ferma dopo qualche minuto? Quasi sempre non c’è un querier: le iscrizioni scadono dopo circa 260 secondi.

Devo disabilitare IGMP proxying? Se non usi IPTV o multicast che arriva dalla WAN, puoi disabilitarlo. Se li usi, no.

IGMP è sicuro? No, non ha autenticazione. Si difende con filtri sui gruppi, limiti per porta e un querier fisso.

Come abilito IGMP snooping su Cisco? ip igmp snooping (globale) e ip igmp snooping vlan 10, più ip igmp snooping querier se nella VLAN non c’è un router multicast.

#IGMP #IGMP Snooping #Networking #Multicast #Network Security

lascia un messaggio

Non sono un robot