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-nftables
flag 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 eth0
un 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 nat
non corrisponde quando il cgroup viene cambiato, ma iptables -nvL -t mangle
corrisponde.
# 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 apache2
e mi ha dato un intero elenco di errori variabili indefiniti!