Check out the new blog at http://linuxehacking.ovh , this one will no longer be updated

sabato 1 febbraio 2014

Routing da, alla rete di provenienza con Linux

Molto spesso può capitare di voler fare il forwarding dalla LAN alla LAN, ovvero avere un router che accetta i pacchetti in ingresso, e li reimmette sulla stessa rete magari eseguendoci sopra il load balancing o traffic shaping, ad esempio potrei avere una lan composta da un router alice, un router fastweb ed un server su cui ho a disposizione una sola interfaccia ethernet, ad occhio un sistemista non smanettone vi direbbe subito che dovete mettere altre 2 interfacce di rete sul server o non si può fare, FALSO.

Ora tralasciando la parte di traffic shaping e network balancing che è adeguatamente documentata altrove, vediamo come è possibile la cosa a livello teorico


Prendiamo in esempio la rete 192.168.0.0/24
Mettiamo che il server dove volete fare routing sia configurato per avere gateway predefinito 192.168.0.1 (Il router alice ) e che il server abbia indirizzo 192.168.0.2, teoricamente se io da una macchina con configurato gatweay 192.168.0.2, invio un pacchetto che ha come indirizzo di destinazione ad esempio 8.8.4.4 e come mac address di destinazione quello del server 192.168.0.2, il server lo riceverà, gli cambia di nuovo mac address di destinazione con quello del suo gateway e lo rispedisce in LAN di nuovo.
Se proviamo a farlo praticamente ci accorgiamo di una cosa però...

tiziano@tiziano-VPCF12Z1E ~ $ ping 8.8.4.4
PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data.
64 bytes from 8.8.4.4: icmp_seq=1 ttl=46 time=99.5 ms
From 192.168.0.2: icmp_seq=2 Redirect Host(New nexthop: 192.168.0.1)
From 192.168.0.2 icmp_seq=2 Redirect Host64 bytes from 8.8.4.4: icmp_seq=2 ttl=46 time=71.9 ms
64 bytes from 8.8.4.4: icmp_seq=3 ttl=46 time=115 ms







Quello che sta succedendo in pratica è che il server sta dicendo al client che deve contattare direttamente 192.168.0.1 invece di lui, e questa cosa non va assolutamente bene perché se andiamo a fare un traceroute ci accorgiamo che il nostro server che dovrebbe fare traffic shaping oppure load balancing è stato bypassato, il traceroute partirà direttamente dal router di alice.

Questo problema si risolve disabilitando l'invio di pacchetti ICMP Redirect Host, utilizzando
sysctl -w net.ipv4.conf.all.send_redirects=0
E per ogni interfaccia
sysctl -w net.ipv4.conf.INTERFACCIA.send_redirects=0


http://www.cisco.com/en/US/tech/tk365/technologies_tech_note09186a0080094702.shtml Qui è documentato l'utilizzo del pacchetto ICMP Redirect in modo dettagliato

Una volta risolto questo problema al quale non sempre è scontata la soluzione dato che sono pochi ad avere setup funzionanti del genere, il resto della configurazione è praticamente uguale ad un normale routing, ovviamente quando si lavora sulle regole iptables , essendo l'interfaccia di ingresso ed uscita la stessa , si deve lavorare sugli indirizzi per distinguere i pacchetti