Ho davvero lottato con questo, quindi ecco una soluzione COMPLETA. È testato su Ubuntu 15 e 16. Puoi usarlo in particolare con OpenVPN per indirizzare determinate app al di fuori dell'interfaccia del tunnel VPN.
La soluzione completa "cgroup"
Come funziona?
- Il kernel Linux inserirà l'app in un gruppo di controllo . Il traffico di rete dalle app in questo cgroup verrà identificato dall'ID classe a livello del controller di rete.
- iptables segnerà questo traffico e lo costringerà ad uscire con l'IP giusto
- ip route elaborerà il traffico contrassegnato in una tabella di routing diversa, con una route predefinita a qualsiasi IP gateway desiderato.
Script automatizzato
Ho creato uno script novpn.sh per automatizzare l'installazione e l'esecuzione delle dipendenze. Testato su Ubuntu.
Avvia prima la tua VPN.
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
Manuale HowTo
Innanzitutto, installa il supporto e gli strumenti di cgroup:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
Riavvia (potrebbe non essere necessario).
Hai bisogno di iptables 1.6 .0+. Ottieni il sorgente di rilascio iptables 1.6.0 , estrailo, quindi esegui questo ( --disable-nftablesflag eviterà errori) dalla directory dei sorgenti di 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
Ora, la vera configurazione. Definire un gruppo di controllo denominato novpn. I processi in questo cgroup avranno un classid di 0x00110011(11:11).
sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid
Ora supponiamo che l'interfaccia che desideri utilizzare per l'app specifica abbia eth0un IP gateway di 10.0.0.1. Sostituiscili con ciò che vuoi veramente (ottieni le informazioni da ip route). Esegui ancora come 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
Infine, esegui la tua app sull'interfaccia specifica:
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 se vuoi spostare un processo già in esecuzione nel cgroup, beh ... non puoi! Ciò sembra essere dovuto alla funzione NAT (mascherata): iptables -nvL -t natnon corrisponde quando il cgroup viene cambiato, ma iptables -nvL -t manglecorrisponde.
# 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
Riconoscimenti: nessuna risposta funzionava come previsto, ma un mix di loro ha funzionato: risposta chripell articolo evolware Per routing di processo prendere 2: utilizzo di cgroups, iptables e routing di criteri , come faccio a fare in modo che un processo specifico NON passi attraverso una connessione OpenVPN? , Uccidi l'interruttore per OpenVPN sulla base di iptables
cgexec -g net_cls:novpn apache2e mi ha dato un intero elenco di errori variabili indefiniti!