Table of Contents

Problemi ARP

In generale ad una richiesta ARP ricevuta da una interfaccia di rete, il kernel Linux risponde se l'indirizzo IP richiesto è assegnato ad una qualunque delle interfacce configurate. Il MAC address nella risposta è quello dell'interfaccia attraverso cui viene inviata la risposta stessa.

Un host con due interfacce di rete e due indirizzi IP in classi diverse che sia collegato ad un unico switch riceverà le richieste di ARP per entrambi gli indirizzi su entrambe le interfacce. Le risposte gerate dall'host avranno in un caso con il MAC address “giusto”, nell'altro caso con il MAC address “sbagliato”.

Questo comportamento in linea di principio dovrebbe garantire la massima possibilità di comunicazione, ma nella pratica crea enormi grattacapi in caso di loop involontari nella topologia della rete.

Ci sono due parametri che possono essere configurati per garantire le risposte ARP “corrette”, uno agisce da filtro in input, l'altro agisce da filtro nelle risposte ARP; si tratta di rp_filter e arp_ignore rispettivamente, che il kernel Linux imposta per valore predefinito a 0.

Questi parametri possono essere configurati per la singola interfaccia oppure per all (tutte le interfacce), il valore effettivamente utilizzato sarà il maggiore dei due.

rp_filter 0 (default): No source validation.
1: Strict mode as defined in RFC3704 Strict Reverse Path. Each incoming packet is tested against the FIB and if the interface is not the best reverse path the packet check will fail. By default failed packets are discarded.
2: Loose mode as defined in RFC3704 Loose Reverse Path. Each incoming packet's source address is also tested against the FIB and if the source address is not reachable via any interface the packet check will fail.
arp_ignore 0 (default): reply for any local target IP address, configured on any interface.
1: Reply only if the target IP address is local address configured on the incoming interface.
2: Reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface.
3: …

Per conoscere lo stato attuale dei parametri si legge lo pseudo-file, per impostare il valore si può scrivere sullo pseudo-file oppure usare il comando sysctl:

cat /proc/sys/net/ipv4/conf/eth2/rp_filter
0
cat /proc/sys/net/ipv4/conf/all/rp_filter
0
echo 1 > /proc/sys/net/ipv4/conf/eth2/rp_filter
sysctl net.ipv4.conf.eth2.rp_filter=1

rp_filter=1

Con il parametro rp_filter=1 il pacchetto ARP ricevuto viene ispezionato: se l'interfaccia su cui è stato ricevuto non corrisponde alla route che si dovrebbe usare per comunicare con l'IP sorgente, il pacchetto viene scartato (nota bene: il pacchetto ARP request contiene l'indirizzo IP dell'host che lo ha generato).

arp_ignore=2

Con il parametro arp_ignore=2 viene fatto un controllo ancora più stringente, ma in una fase successiva. Il pacchetto ARP request viene accettato, ma la risposta viene generata solo se l'IP richiesto è configurato sull'interfaccia in questione e se l'IP mittente è nella stessa subnet di questa interfaccia.

Shorewall, /etc/sysctl.conf, etc

ATTENZIONE: Le impostazioni predefinite del kernel potrebbero essere modificate da qualche software di firewall come Shorewall oppure da qualche file di configurazione.

Controllare il valore corrente e verificare il cotenuto del file /etc/sysctl.conf e di /etc/sysctl.d/*.

Per quanto riguarda il programma Shorewall, nel file /etc/shorewall/shorewall.conf potrebbe essere presente l'opzione

ROUTE_FILTER=Yes

in questo caso viene configurato net.ipv4.conf.all.rp_filter=1.

Il file di configurazione /etc/shorewall/interfaces potrebbe invece contenere l'opzione routefilter per una singola interfaccia (es. eth2), in tal caso viene configurato net.ipv4.conf.eth2.rp_filter=1.