Esistono diverse possibilità, a seconda di come si desidera decidere quali pacchetti vanno dove. La maggior parte richiederà una certa comprensione del funzionamento della rete TCP / IP in Linux. Gli strumenti principali che devi sapere per fare cose complesse sono iptables
(Ubuntu: iptables ) e iproute2 ( ip
comando) (Ubuntu: iproute , iproute-doc ).
Se riesci a discriminare completamente in base all'indirizzo IP di destinazione, è semplice: indirizza gli indirizzi IP in base ai tuoi desideri. Ad esempio, i seguenti comandi causeranno tutti i pacchetti per 1.2.3. x e 1.2.4.2 per passare ppp0
, e altri pacchetti per passare eth0
.
route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
Per requisiti più complessi, è necessario iniziare a utilizzare iptables
e ip route
. Ad esempio, i seguenti comandi impostano tabelle di routing speciali in modo che tutti i pacchetti contrassegnati con 1 vengano espulsi tramite eth0
e tutti i pacchetti contrassegnati con 2 vengano disattivati tramite ppp0
(tranne che i pacchetti intesi per localhost
aderire all'interfaccia di loopback).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
Ora puoi usare iptables
per "manipolare" i pacchetti in uscita, aggiungendo un segno che deciderà quale percorso prendere. Ad esempio, ecco come inviare tutto il traffico SMTP in uscita (porta 25) via eth0
e tutto il traffico originato da un'applicazione in esecuzione come utente proxy
via ppp0
.
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
Vedi anche 2 interfacce di rete connesse a Internet. Scegli quello da utilizzare in base al nome di dominio e associa il software a diverse interfacce di rete .
Dovrai disporre che questi comandi vengano eseguiti quando entrambe le interfacce sono collegate. Ti consiglio di scrivere uno script chiamato /etc/network/if-up.d/0justin-routes
che esegua i comandi desiderati. Questo script verrà eseguito ogni volta che viene visualizzata un'interfaccia di rete; poiché il suo nome inizia con un 0
, verrà eseguito all'inizio del processo, prima della configurazione specifica dell'applicazione che potrebbe prevedere che le route siano in atto. C'è una simmetria /etc/network/if-down.d/
nel caso in cui si desideri fare anche le cose quando una delle interfacce si disattiva. (Tutti i percorsi associati verranno automaticamente cancellati, il che potrebbe lasciare alcuni pacchetti bloccati quando si desidera che ricadano sull'altra interfaccia.)
Gli script ifup sono documentati in interfaces(5) man page
. La cosa principale da sapere è che il nome dell'interfaccia che viene attivata o disattivata si trova nella variabile di ambiente IFACE
. Puoi scoprire se l'altra interfaccia è già compatibile if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
.