Il modo corretto per farlo è legare () all'interfaccia che si desidera utilizzare per i pacchetti in uscita. Poiché è quindi possibile impostare percorsi con i comandi ip route
e ip rule
per controllare il modo in cui i pacchetti vengono instradati in base alla loro interfaccia in uscita. Per il mio esempio, assumerò la seguente rete:
- eth0:
- Indirizzo: 192.168.0.2/24
- Gateway predefinito: 192.168.0.1
- eth1:
- Indirizzo: 192.168.1.2/24
- Gateway predefinito: 192.168.1.1
Creerò due tabelle di routing, una per il traffico in uscita per eth0 chiamato alternate e una tabella per eth1 chiamata main. La tabella principale di routing esiste sempre ed è la tabella normale utilizzata dai comandi route
e ip route
. La maggior parte delle persone non ha mai a che fare con nessun altro tavolo. Per creare la tabella denominata alternativa, aggiungeremo la seguente riga a /etc/iproute2/rt_tables
:
10 alternate
La tabella principale ha una priorità predefinita di 254. Le regole per le quali è attiva la tabella di routing sono controllate dal ip rule
comando. Per impostazione predefinita, quel comando stamperà un elenco di regole esistenti che dovrebbero assomigliare a questo:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Questo in pratica dice che cercherà una route nella tabella local
che è una tabella speciale gestita dal kernel per route locali come il mio indirizzo IP. Quindi proverà la tabella principale e la tabella predefinita. Il valore predefinito della tabella è normalmente vuoto, quindi se non esiste alcuna corrispondenza in main, non esiste alcun percorso verso l'host. Innanzitutto, lascia che la tabella di riempimento si alterni con le regole per eth0.
sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1
Normalmente vorrai che la alternate
tabella sia simile alla main
tabella. Le uniche differenze sono quando il routing dovrebbe essere diverso. È possibile che non si desideri includere la seconda riga sopra se si desidera letteralmente che tutto il traffico NFS, HTTP, ecc. Passi attraverso il gateway predefinito su eth0 anche se è destinato alla rete su eth1. Il prossimo passo è aggiungere una regola per quando usare questa tabella di routing alternativa:
sudo ip rule add from 192.168.0.0/24 pref 10 table alternate
Questa regola dice che tutto il traffico proveniente da un indirizzo sulla rete 192.168.0 utilizzerà la alternate
tabella di routing invece della main
tabella normale . L'ultimo passaggio è assicurarsi che tutti i client che devono utilizzare si eth0
associno ad esso. Con wget
, ad esempio, impostato --bind-address=192.168.0.2
, per NFS impostare ilclientaddr=192.168.0.2
opzione di montaggio. Se si utilizza LibWWW con Perl, è possibile impostare l'opzione localaddr in LWP :: UserAgent per controllare l'interfaccia locale a cui si lega. Se ti capita di avere un client che non riesci a controllare l'associazione e la compilazione dell'origine non è un'opzione, potresti essere in grado di usare una regola iptables per modificare il suo indirizzo, ma questo è più un hack e potrebbe non funzionare. Avresti bisogno di una regola SNAT impostata nella catena PREROUTING della tabella nat o della tabella mangle. Per funzionare, avrai comunque bisogno delle tabelle di routing modificate indicate sopra.
iftop
e stanno mostrando il giusto tipo di traffico. Grazie mille.