He luchado muchísimo con esto, así que aquí hay una solución COMPLETA. Se probó en Ubuntu 15 y 16. Puede usarlo especialmente con OpenVPN para enrutar ciertas aplicaciones fuera de la interfaz del túnel VPN.
La solución completa "cgroup"
¿Cómo funciona eso?
- El kernel de Linux colocará la aplicación en un grupo de control . El tráfico de red de las aplicaciones en este cgroup se identificará por su ID de clase en el nivel del controlador de red.
- iptables marcará este tráfico y lo obligará a salir con la IP correcta
- ip route procesará el tráfico marcado en una tabla de enrutamiento diferente, con una ruta predeterminada a la IP de la puerta de enlace que desee.
Script automatizado
He creado un script novpn.sh para automatizar las dependencias de instalación y ejecución. Probado en Ubuntu.
Comience su VPN primero.
wget https://gist.githubusercontent.com/kriswebdev/a8d291936fe4299fb17d3744497b1170/raw/cf8b37fbe6c3f50a0be825eb77cafa3e0134946f/novpn.sh
# If you don't use eth0, edit the script setting.
sudo chmod +x novpn.sh
./novpn.sh traceroute www.google.com
./novpn.sh --help
Manual de instrucciones
Primero, instale el soporte y las herramientas de cgroup:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
Reiniciar (puede no ser necesario).
Necesita iptables 1.6 .0+. Obtenga la fuente de lanzamiento de iptables 1.6.0 , extráigala, luego ejecute esto (el --disable-nftablesindicador evitará errores) desde el directorio de origen de iptables:
sudo apt-get install dh-autoreconf bison flex
./configure --prefix=/usr \
--sbindir=/sbin \
--disable-nftables \
--enable-libipq \
--with-xtlibdir=/lib/xtables
make
sudo make install
iptables --version
Ahora, la configuración real. Defina un grupo de control llamado novpn. Los procesos en este cgroup tendrán un classid de 0x00110011(11:11).
sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid
Ahora, supondremos que la interfaz que desea utilizar para la aplicación específica es eth0con una puerta de enlace IP de 10.0.0.1. Reemplácelos por lo que realmente desea (obtenga la información de ip route). Ejecutar todavía como root:
# Add mark 11 on packets of classid 0x00110011
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11
# Force the packets to exit through eth0 with NAT
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o eth0 -j MASQUERADE
# Define a new "novpn" routing table
# DO THIS JUST ONCE !
echo 11 novpn >> /etc/iproute2/rt_tables
# Packets with mark 11 will use novpn
ip rule add fwmark 11 table novpn
# Novpn has a default gateway to the interface you want to use
ip route add default via 10.0.0.1 table novpn
# Unset reverse path filtering for all interfaces, or at least for "eth0" and "all"
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done
Finalmente, ejecute su aplicación en la interfaz específica:
exit
sudo cgcreate -t $USER:$USER -a $USER:$USER -g net_cls:novpn
cgexec -g net_cls:novpn traceroute www.google.com
# Close all Firefox windows first
cgexec -g net_cls:novpn firefox
O si desea mover un proceso que ya se está ejecutando al cgroup, bueno ... ¡no puede! Eso parece deberse a la función NAT (mascarada): iptables -nvL -t natno coincide cuando se cambia el cgroup, pero iptables -nvL -t manglesí coincide.
# Get PID of the process (we'll then suppose it's 1234)
pidof firefox
# Add to cgroup - THIS DOESN'T WORK! Silently fails to produce the final result.
sudo echo 1234 > /sys/fs/cgroup/net_cls/novpn/tasks
# Remove - but this works...
sudo echo 1234 > /sys/fs/cgroup/net_cls
Créditos: ninguna respuesta funcionó como se esperaba, pero una combinación de ellos funcionó: chripell answer artículo evolware Por enrutamiento de proceso, toma 2: usando cgroups, iptables y enrutamiento de políticas , ¿Cómo hago que un proceso específico NO atraviese una conexión OpenVPN? , Kill Switch para OpenVPN sobre la base de iptables
cgexec -g net_cls:novpn apache2y me di una lista completa de erros indefinidos variables!