Es gibt verschiedene Möglichkeiten, je nachdem, wie Sie entscheiden möchten, welche Pakete wohin gehen. Die meisten von ihnen erfordern ein gewisses Verständnis der Funktionsweise von TCP / IP-Netzwerken unter Linux. Die wichtigsten Tools, die Sie kennen müssen, um komplexe Aufgaben zu erledigen, sind iptables
(Ubuntu: iptables ) und iproute2 ( ip
Befehl) (Ubuntu: iproute , iproute-doc ).
Wenn Sie die Ziel-IP-Adresse vollständig unterscheiden können, ist es ganz einfach: Leiten Sie die IP-Adressen gemäß Ihren Wünschen weiter. Beispielsweise verursachen die folgenden Befehle alle Pakete für 1.2.3. x und 1.2.4.2 gehen über ppp0
und andere Pakete gehen über eth0
.
route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
Für komplexere Anforderungen müssen Sie mit iptables
und beginnen ip route
. Mit den folgenden Befehlen werden beispielsweise spezielle Routing-Tabellen eingerichtet, sodass alle mit 1 gekennzeichneten Pakete über eth0
und alle mit 2 gekennzeichneten Pakete über ausgehen ppp0
(mit Ausnahme der Pakete, die zum localhost
Festhalten an der Loopback-Schnittstelle bestimmt sind).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
Jetzt können Sie iptables
ausgehende Pakete „entstellen“ und eine Markierung hinzufügen, die entscheidet, welchen Weg sie einschlagen. Hier erfahren Sie beispielsweise, wie Sie den gesamten ausgehenden SMTP-Verkehr (Port 25) über eth0
und den gesamten Verkehr senden , der von einer Anwendung stammt, die als Benutzer proxy
über ausgeführt wird ppp0
.
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
Siehe auch 2 mit dem Internet verbundene Netzwerkschnittstellen. Wählen Sie die zu verwendende entsprechend dem Domänennamen aus und binden Sie die Software an verschiedene Netzwerkschnittstellen .
Sie müssen dafür sorgen, dass diese Befehle ausgeführt werden, wenn beide Schnittstellen verbunden sind. Ich empfehle Ihnen, ein Skript mit dem Namen zu schreiben /etc/network/if-up.d/0justin-routes
, das die gewünschten Befehle ausführt. Dieses Skript wird immer dann ausgeführt, wenn eine Netzwerkschnittstelle aufgerufen wird. Da der Name mit a beginnt 0
, wird er zu Beginn dieses Prozesses ausgeführt, bevor ein anwendungsspezifisches Setup durchgeführt wird, bei dem die Routen möglicherweise vorhanden sind. Es gibt eine Symmetrie /etc/network/if-down.d/
für den Fall, dass Sie auch Dinge tun möchten, wenn eine der Schnittstellen ausfällt. (Alle zugehörigen Routen werden automatisch gelöscht, wodurch einige Pakete möglicherweise gestrandet bleiben, wenn Sie möchten, dass sie auf die andere Schnittstelle zurückgreifen.)
Die ifup-Skripte sind in der dokumentiert interfaces(5) man page
. Das Wichtigste ist, dass der Name der Schnittstelle, die hoch- oder runtergefahren wird, in der Umgebungsvariablen steht IFACE
. Sie können herausfinden, ob die andere Schnittstelle bereits verfügbar ist if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
.
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip
, woppp_ip
ist die IP-Adresse dieses Adapters. Zweitens müssen Sie aus streng drehenrp_filter
an/proc/sys/net/ipv4/config/ppp0/rp_filter
. Es funktioniert, wenn der Entspannungsmodus auf 2