Hay varias posibilidades, según cómo desee decidir qué paquetes van a dónde. La mayoría de ellos requerirá cierta comprensión de cómo funciona la red TCP / IP en Linux. Las principales herramientas que deberá conocer para hacer cosas complejas son iptables
(Ubuntu: iptables ) e iproute2 ( ip
comando) (Ubuntu: iproute , iproute-doc ).
Si puede discriminar completamente por la dirección IP de destino, es simple: enrute las direcciones IP de acuerdo con sus deseos. Por ejemplo, los siguientes comandos generarán todos los paquetes para 1.2.3. x y 1.2.4.2 para pasar ppp0
, y otros paquetes para pasar 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
Para requisitos más complejos, debe comenzar a usar iptables
y ip route
. Por ejemplo, los siguientes comandos configuran tablas de enrutamiento especiales para que todos los paquetes marcados con 1 salgan por eth0
y todos los paquetes marcados con 2 salgan por ppp0
(excepto los paquetes destinados a localhost
adherirse a la interfaz de bucle invertido).
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
Ahora puede usar iptables
para "destrozar" paquetes salientes, agregando una marca que decidirá qué ruta tomarán. Por ejemplo, a continuación se explica cómo enviar todo el tráfico SMTP saliente (puerto 25) a través de eth0
, y todo el tráfico originado por una aplicación que se ejecuta a proxy
través del usuario 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
Consulte también 2 interfaces de red conectadas a internet. Elija el que usará de acuerdo con el nombre de dominio y vincular el software a diferentes interfaces de red .
Deberá organizar estos comandos para que se ejecuten cuando ambas interfaces estén conectadas. Le recomiendo que escriba un script llamado /etc/network/if-up.d/0justin-routes
que ejecute los comandos que desee. Este script se ejecutará siempre que aparezca una interfaz de red; como su nombre comienza con a 0
, se ejecutará al principio de ese proceso, antes de la configuración específica de la aplicación que podría esperar que las rutas estén en su lugar. Hay una simétrica /etc/network/if-down.d/
en caso de que también desee hacer cosas cuando una de las interfaces se cae. (Todas las rutas asociadas se borrarán automáticamente, lo que puede dejar algunos paquetes varados cuando desee que vuelvan a la otra interfaz).
Los scripts ifup están documentados en el interfaces(5) man page
. Lo principal que debe saber es que el nombre de la interfaz que se activa o desactiva se encuentra en la variable de entorno IFACE
. Puede averiguar si la otra interfaz ya está funcionando if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
.
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip
dondeppp_ip
está la dirección IP de ese adaptador. En segundo lugar, deberá desactivar estrictamenterp_filter
a las/proc/sys/net/ipv4/config/ppp0/rp_filter
. Funciona cuando se configura en modo de relajación, que es 2.