Ich versuche herauszufinden, ob es möglich ist, IP-Pakete von einem Prozess oder einer Prozessgruppe selektiv über eine bestimmte Schnittstelle zu leiten, während alle anderen Pakete über eine andere Schnittstelle geleitet werden. Das heißt, ich möchte, dass der gesamte Datenverkehr von /usr/bin/testapp
durchgeleitet wird, eth1
während alle anderen Pakete durchgehen eth0
. Pakete können in diesem Fall TCP, UDP, ICMP usw. sein und können von den Endbenutzern so konfiguriert werden, dass sie verschiedene Ports verwenden.
Da ich den betreffenden Prozess nicht einfach zwingen kann, sich an eine bestimmte Schnittstelle zu binden, versuche ich, dasselbe Ergebnis über das Routing zu erreichen. Ist das möglich?
--- bearbeiten ---
Ein hilfreicher Vorschlag hier und an vielen anderen Stellen ist, Pakete basierend auf der UID zu markieren; das ist nicht wirklich das Ziel. Das Ziel ist, basierend auf dem Prozess zu markieren/filtern/routenunabhängig vom Benutzer. Das heißt, wenn alice
und bob
alle charlie
ihre eigene Instanz von ausführen /usr/bin/testapp
, sollten alle Pakete aller drei Instanzen durchgehen eth1
, während alle anderen Pakete des Systems durchgehen sollten eth0
.
Beachten Sie, dass die Markierung nach Quell-/Zielport, Benutzername/UID usw. nicht ausreicht, da verschiedene Benutzer ausgeführt werden können testapp
und diese möglicherweise unterschiedliche Ports in ihren eigenen ~/.config/testapp.conf
oder anderen Bereichen einrichten. Die Frage betrifft das Filtern nach Prozess.
Eine verfügbare Option, von der ich allerdings nicht weiß, wie hilfreich sie ist, besteht darin, einen /bin/(ba|z)?sh
-basierten Wrapper um die native Binärdatei zu verwenden.
--- bearbeiten ---
Ich beziehe mich auf das Routing auf einem System mit einem modernen Linux-Kernel, sagen wir 4.0 oder besser. Wenn es Softwareabhängigkeiten über iproute2
, und ähnliche Tools hinaus gibt, bin ich bereit nftables
, conntrack
Open-Source-Lösungen zu erkunden, obwohl grundlegende Tools vorzuziehen sind.
Antwort1
Das Routing der Pakete über eth1 oder eth0. tables mangle sollte dies beheben. Dazu musste ich Pakete markieren und Regeln für deren Handhabung einrichten. Fügen Sie zunächst eine Regel hinzu, die den Kernel veranlasst, Pakete, die mit 2 markiert sind, über table zu routen.
ip rule add fwmark 2 table 3
Fügen Sie eine Route zur Umleitung des Datenverkehrs über eine andere Schnittstelle hinzu, wobei davon ausgegangen wird, dass das Gateway 10.0.0.1 ist:
ip route add default via 10.0.0.1 table 3
Leeren Sie Ihren Routing-Cache.
ip route flush cache
Legen Sie nun eine Firewall-Regel zum Markieren bestimmter Pakete fest:
iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2
Zum Schluss lockern Sie die Quellvalidierung des umgekehrten Pfads. Manche schlagen vor, den Wert auf 0 zu setzen, aber 2 scheint laut die bessere Wahl zu sein https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
. Wenn Sie dies überspringen, erhalten Sie zwar Pakete (dies kann mit bestätigt werden tcpdump -i tap0 -n
), aber Pakete werden nicht akzeptiert. Der Befehl zum Ändern der Einstellung, damit Pakete akzeptiert werden:
sysctl -w net.ipv4.conf.tap0.rp_filter=2
Referenz :http://serverfault.com/questions/345111/iptables-target-to-route-packet-to-specific-interface
Antwort2
Sie können den Prozess mit einem bestimmten Benutzer ausführen und die Pakete mit der Erweiterung der iptable abgleichen owner
. Nach der Übereinstimmung können Sie sie markieren und mit einer anderen Routing-Tabelle POSTROUTING
oder einer anderen Lösung Ihrer Wahl verwenden.
DasDer Beitrag erklärt das Paket-Matching besser mit owner
.
Antwort3
Dies ist möglich, indem Sie Netzwerk-Namespaces verwenden, um den Prozess zu isolieren, und eine virtuelle Ethernet-Verbindung, um diesen Netzwerk-Namespace mit Ihrem Haupt-Namespace zu verbinden. Sie können dann iptables verwenden, um basierend auf dieser Quelle zu routen.
Hier ist ein Beispiel. Ich verwende den Netzwerkmanager für einige Befehle, aber Sie können es auch einfach tun
# Create a namespace
ip netns add ns1
# create a bridge between them
nmcli connection add type veth ifname virt0 peer virt1
ip link set virt1 netns ns1
ip addr add 192.168.69.1/24 dev virt0
ip netns exec ns1 ip addr add 192.168.69.2/24 dev virt1
ip netns exec ns1 ip link up virt1
echo 1 > sudo tee /proc/sys/net/ipv4/ip_forward
# At this point traffic from ns1 will appear in your main network namespace as coming from ip 192.168.69.2 dev virt0, so you can handle it from there. You will need NAT to make it go somewhere useful.
# In this case I want the traffic to go out through interface vpn1, which is not a default route on my system.
# Add your process-specific routing rules in a non-default table (12345 in this case)
ip route add default dev vpn1 table 12345 proto static scope link metric 50
# Set up a rule to use that table for the traffic coming from that IP, with lower priority than the default table's rule.
ip rule add priority 30000 from 192.168.69.0/24 lookup 12345
# Add the nat, so that the traffic can actually exist on your outbound interface
iptables -t nat -A POSTROUTING -o vpn1 -j MASQUERADE
# At this point traffic from ns1 will go out through interface vpn1. Now you can run command sin that netns to utilize this.
nsenter --net=/var/run/netns/ns1 your_program
Antwort4
Nun, da Sie uns Folgendes gesagt haben:
Da ich den betreffenden Prozess nicht einfach zwingen kann, sich an eine bestimmte Schnittstelle zu binden, versuche ich, dasselbe Ergebnis über das Routing zu erreichen. Ist das möglich?
Wir können Ihnen genau an diesem Punkt helfen. Es gab einmal einen jail
Systemaufruf in FreeBSD, der dazu diente, einen Prozess oder eine Gruppe von Prozessen auf einen bestimmten Teilbereich der Systemressourcen zu beschränken. Insbesondere konnte man eine IP-Adresse angeben, die diese „isolierten“ Prozesse für ihre Netzwerkaktivität verwenden würden. Das war so praktisch, dass ich diese Funktion in Linux sehr vermisst habe. Aber auch Linux bietet einige Möglichkeiten, um ähnliche Ergebnisse zu erzielen:
oder, am einfachsten, das manuelle Herumspielen mit Namespaces:https://unix.stackexchange.com/questions/155446/linux-is-there-handy-way-to-exec-a-program-binding-it-to-ip-address-of-choice