Solución I: precargando una biblioteca específica
App-Route-Jail : use ld_preload para forzar la puerta de enlace de la interfaz (gran idea pero requiere capacidades de root o marcas) el uso se detalla en las notas a continuación
Proxybound : use ld_preload para forzar un proxy a una aplicación específica (esto es usar proxy en lugar de interfaz)
Force-Bind : tiene muchas características, pero el enlace tiene fugas (no confiable)
Bind-Interface-IP : conexiones demasiado simples y con fugas (no confiable)
Bind-IP : conexiones demasiado simples y con fugas (no confiable)
Solución II: espacio de usuario de Linux
Espacio de usuario clásico de Linux ip-netns : gran solución, pero requiere root e interfaz solo puede existir en un solo espacio de usuario
Firejail : Firejail puede obligar a una aplicación a usar una red específica, pero la compatibilidad es limitada (por ejemplo, no es compatible con las interfaces tun). firejail no requiere rootfirejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command
Firejail con netns : Firejail puede obligar a una aplicación a usar un espacio de usuario específico que se creó por separado, esto nos permite nombrar espacios sin rootfirejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command
Firejail con mascarada y puente : Firejail puede obligar a una aplicación a usar una interfaz específica con iptables masquerade , esto es genial y no requiere root pero requiere ip_forward y podría implicar un impacto en la seguridadfirejail --net=br0 firefox
Solución III: iptables de Linux
Iptables podrían usarse para este propósito, pero esto requiere ip_forward y podría implicar un impacto en la seguridad si no está configurado correctamente, ejemplo 1 , ejemplo 2 , ejemplo 3 , ejemplo 4
Notas de soluciones (I, II y III):
Wireguard
Si está utilizando una VPN (especialmente Wireguard) y desea aplicar esta solución a una interfaz Wireguard ( Wireguard con espacio de usuario ), puede seguir las instrucciones vinculadas para crear un espacio de usuario que contenga una interfaz wg (y por lo tanto limitado a una interfaz vpn ) también se puede combinar firejail --netns=container
para poder usar el espacio de usuario sin root.
Cómo encontrar la puerta de enlace de la interfaz
Hay muchas soluciones para encontrar la puerta de enlace, aquí hay algunos comandos que permiten encontrar la puerta de enlace utilizada
$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0
Cómo usar App-Route-Jail
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
- Agregar una ruta para los futuros paquetes marcados (para la aplicación encarcelada) en este ejemplo
192.168.1.1
se usa como puerta de enlace forzada, esta regla de ruta no afectará a otras aplicaciones, esta manipulación debe hacerse solo una vez en el arranque del sistema, por ejemplo, si desea usa esta solución diariamente
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
- Inicie la aplicación que desea encarcelar
MARK=10 LD_PRELOAD=./mark.so firefox
- Probar la dirección IP wan
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me