====== 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**.