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 ( ipcomando) (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 iptablese ip route. Ad esempio, i seguenti comandi impostano tabelle di routing speciali in modo che tutti i pacchetti contrassegnati con 1 vengano espulsi tramite eth0e tutti i pacchetti contrassegnati con 2 vengano disattivati tramite ppp0(tranne che i pacchetti intesi per localhostaderire 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 iptablesper "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 eth0e tutto il traffico originato da un'applicazione in esecuzione come utente proxyvia 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-routesche 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 ….