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!apache2
direkt vom Terminal aus ausgeführt werden. Dasapache2
liegt daran, dass normalerweise als Dienst mit gestartet wirdsystemctl start apache2
. Das geht aber nichtcgexec
. Das aufgerufene Programm muss ein übergeordnetesapache2
Element des gewünschten ( ) - Prozesses sein, damit net_cls cgroup weitergegeben werden kann. Sie müssen also das Startskript finden. In diesem Fall ist essudo cgexec -g net_cls:novpn /usr/sbin/apache2ctl start
. Überprüfen Sie mit./novpn.sh --list
.eth0
durch etwas ersetzenenp7s0
. Holen Sie sich die Informationen aus demifconfig
Befehl.Einige Leute haben Shims geschrieben, die die LD_PRELOAD-Funktion von Linux verwenden, um dies zu erreichen:
quelle
Durch die Kombination der hervorragenden Antworten von mariusmatutiae und KrisWebDev habe ich eine umfassend modifizierte Version des hervorragenden
novpn.sh
Skripts von KrisWebDev erstellt . Während das Skript von KrisWebDev darauf ausgelegt ist, einen spezifischeren Juckreiz (das Ausführen und Verschieben von Prozessen innerhalb / außerhalb eines VPN) zu verhindern, können Sie in meiner Version grundsätzlich jeden Befehl in einer von Ihnen angegebenen Netzwerkumgebung ausführen. Sie können die Schnittstelle angeben, an die gebunden werden soll, die Standardroute, Ihre eigenen Iptables-Regeln, statische Routen, einen "Test" angeben, um zu bestätigen, dass alles wie gewünscht funktioniert, bevor Sie den Befehl ausführen. Sie können mehrere Konfigurationsdateien verwenden, um eine beliebige Anzahl spezifischer Netzwerkumgebungen zu definieren, in denen Sie Befehle / Prozesse ausführen können.Ich habe es als Zusammenfassung hier gepostet: https://gist.github.com/level323/54a921216f0baaa163127d960bfebbf0
Es kann sogar die cgroup / iptables / routing-Tabellen danach bereinigen!
Feedback erwünscht.
PS - Es wurde für Debian 8 (Jessie) entwickelt
quelle
Nicht pro Anwendung, nein. Sie können dies pro Port oder pro IP-Adresse usw. tun, oder eine Anwendung selbst kann an eine bestimmte Netzwerkkarte binden (und diese verwenden).
Sie können jedoch keine Regel dafür festlegen.
quelle