Ich habe sooo damit gekämpft, dass es hier eine KOMPLETTE Lösung gibt. Es wurde auf Ubuntu 15 und 16 getestet. Sie können es insbesondere mit OpenVPN verwenden, um bestimmte Apps außerhalb der VPN-Tunnelschnittstelle weiterzuleiten.
Die komplette "cgroup" -Lösung
Wie das funktioniert?
- Der Linux-Kernel ordnet die App einer Kontrollgruppe zu . Der Netzwerkverkehr von Apps in dieser C-Gruppe wird durch ihre Klassen-ID auf Netzwerkcontrollerebene identifiziert.
- iptables markiert diesen Datenverkehr und erzwingt, dass er mit der richtigen IP beendet wird
- ip route verarbeitet den markierten Datenverkehr in einer anderen Routingtabelle mit einer Standardroute zu der von Ihnen gewünschten Gateway-IP.
Automatisiertes Skript
Ich habe ein novpn.sh- Skript erstellt, um die Installation und Ausführung von Abhängigkeiten zu automatisieren. Getestet auf Ubuntu.
Starten Sie zuerst Ihr 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
Handbuch HowTo
Installieren Sie zunächst die cgroup-Unterstützung und -Tools:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
Neustart (möglicherweise nicht erforderlich).
Sie benötigen iptables 1.6 .0+. Holen Sie sich die iptables 1.6.0-Release-Quelle , extrahieren Sie sie und führen Sie diese aus ( --disable-nftables
Flag vermeidet Fehler):
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
Nun ist die echte Konfig. Definieren Sie eine Kontrollgruppe mit dem Namen novpn
. Prozesse in dieser Gruppe haben die Klasse 0x00110011
(11:11).
sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid
Nun nehmen wir an, dass die Schnittstelle, die Sie für die bestimmte App verwenden möchten, eth0
eine Gateway-IP von ist 10.0.0.1
. Ersetzen Sie diese durch das, was Sie wirklich wollen (Informationen erhalten Sie von ip route
). Laufen Sie immer noch als 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
Führen Sie schließlich Ihre App auf der spezifischen Oberfläche aus:
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
Oder wenn Sie einen bereits laufenden Prozess in die cgroup verschieben möchten, können Sie das nicht! Das scheint an der NAT (Masquerade) -Funktion zu liegen: iptables -nvL -t nat
Stimmt nicht überein, wenn die cgroup umgeschaltet wird, iptables -nvL -t mangle
stimmt aber überein.
# 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
Credits: Keine Antwort hat wie erwartet funktioniert, aber eine Mischung aus beiden hat funktioniert: chripell answer evolware article Pro Prozess-Routing dauert es 2: Verwenden von Cgroups, Iptables und Richtlinien-Routing . Wie kann ich einen bestimmten Prozess NICHT über eine OpenVPN-Verbindung führen? , Kill Switch für OpenVPN auf Basis von Iptables
cgexec -g net_cls:novpn apache2
und gab mir die ganze Liste der Variablen undefinierte Fehler!