J'ai tellement de mal avec ceci alors voici une solution COMPLÈTE. Il est testé sur Ubuntu 15 et 16. Vous pouvez notamment l'utiliser avec OpenVPN pour router certaines applications en dehors de l'interface du tunnel VPN.
La solution complète "cgroup"
Comment ça marche?
- Le noyau Linux placera l'application dans un groupe de contrôle . Le trafic réseau des applications de ce groupe de contrôle sera identifié par leur ID de classe au niveau du contrôleur de réseau.
- iptables marquera ce trafic et le forcera à sortir avec la bonne IP
- ip route traitera le trafic marqué dans une table de routage différente, avec une route par défaut vers la passerelle IP que vous souhaitez.
Script automatisé
J'ai créé un script novpn.sh pour automatiser l'installation et l'exécution des dépendances. Testé sur Ubuntu.
Démarrez d'abord votre 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
HowTo manuel
Tout d'abord, installez le support et les outils de cgroup:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
Redémarrez (peut ne pas être nécessaire).
Vous avez besoin d'iptables 1.6 .0+. Obtenez la source de publication d'iptables 1.6.0 , extrayez-la, puis exécutez ceci (l' --disable-nftables
indicateur évitera les erreurs) à partir du répertoire source d'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
Maintenant, la vraie config. Définissez un groupe de contrôle nommé novpn
. Les processus de ce groupe de contrôle auront 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
Maintenant, nous supposerons que l'interface que vous souhaitez utiliser pour l'application spécifique est eth0
avec une IP de passerelle 10.0.0.1
. Remplacez- les par ce que vous voulez vraiment (obtenez les informations ip route
). Exécuter toujours en tant que 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
Enfin, exécutez votre application sur l'interface spécifique:
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
Ou si vous souhaitez déplacer un processus déjà en cours d'exécution vers le groupe de contrôle, eh bien ... vous ne pouvez pas! Cela semble être dû à la fonction NAT (mascarade): iptables -nvL -t nat
ne correspond pas lorsque le groupe de contrôle est commuté, mais iptables -nvL -t mangle
correspond.
# 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édits: Aucune réponse ne fonctionnait comme prévu, mais une combinaison d'entre elles a fonctionné: chripell answer evolware article Par process routing take 2: using cgroups, iptables and policy routing , comment puis-je faire en sorte qu'un processus spécifique ne passe pas par une connexion OpenVPN? , Kill switch pour OpenVPN sur la base d'iptables
cgexec -g net_cls:novpn apache2
et m'a donné toute la liste des erreurs non définies variables!