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-nftables
indicador 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 eth0
con 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 nat
no coincide cuando se cambia el cgroup, pero iptables -nvL -t mangle
sí 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 apache2
y me di una lista completa de erros indefinidos variables!