Ändern Sie die Standardroute ohne Auswirkungen auf vorhandene TCP-Verbindungen

1547
Patrick Horn

Angenommen, ich habe zwei öffentliche Netzwerkadressen auf meinem Server: eine NAT über einen ISP (192.168.99.0/24) und ein VPN über einen anderen ISP (192.168.1.0/24), der bereits mit einer Route pro Host zum konfiguriert ist VPN-Server über meinen ISP.

Hier ist meine anfängliche Routingtabelle. Ich leite gerade durch meinen ISP im Subnetz 192.168.99.0/24.

$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.99.1 0.0.0.0 UG 0 0 0 eth1 55.66.77.88 192.168.99.1 255.255.255.255 UGH 0 0 0 eth1 192.168.99.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 tap0 

Jetzt möchte ich, dass neue TCP-Verbindungen auf meine 192.168.1.0/24 umgestellt werden, also gebe ich Folgendes ein:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0 

Wenn ich dies mache, hängen einige langjährige TCP-Verbindungen. Gibt es eine Möglichkeit, die Standardschnittstelle für neue Verbindungen sicher zu ändern und gleichzeitig zuzulassen, dass vorhandene TCP-Verbindungen die alte Route verwenden (dh muss eine Stateful-Routing-Tabelle aktiviert sein)?

Ich bin in Ordnung mit einer Lösung, die nur mit etablierten TCP-Verbindungen funktioniert, und es ist mir egal, wie hackig es ist. Wenn zum Beispiel eine Möglichkeit besteht, temporäre iptables-Regeln für vorhandene Verbindungen hinzuzufügen, um sie über die alte Route zu erzwingen. Aber es muss einen Weg geben, dies zu tun.

BEARBEITEN: Nur eine Anmerkung zu einem einfachen "route add -host ..." für bestehende Verbindungen: Diese Lösung würde funktionieren, wenn es mir gut geht, wenn ich eine Untermenge von IPs auf der alten Schnittstelle belasse. In meiner Anwendung löst dies jedoch mein Problem nicht, da ich neue Verbindungen über die neue Schnittstelle zulassen möchte, selbst wenn sie dieselbe Quell-IP haben. Ich schaue mir jetzt den Befehl "ip route" an, um quellenbasierte Routing-Regeln festzulegen.

3
Sie sollten es für immer richtig beheben und quellbasiertes (Richtlinien-) Routing verwenden. David Schwartz vor 11 Jahren 0
@DavidSchwartz Cool! Das ist genau die Antwort, nach der ich gesucht habe. Ich wusste ehrlich gesagt nicht einmal, dass es ein solches Konzept gibt: Ich hätte eigentlich eher nach "ip route" als nach altem "route" suchen sollen - das habe ich völlig vergessen. Wenn Sie die Frage formell beantworten, indem Sie das quellenbasierte Routing aktivieren oder genauere Angaben zu den Arten von IP-Befehlen machen, mit denen einfache quellbasierte Routingtabellen erstellt werden können, würde ich die Antwort gerne annehmen. Patrick Horn vor 11 Jahren 0

1 Antwort auf die Frage

1
Paul

Der folgende Befehl untersucht die offenen TCP-Verbindungen und listet die Ziele außerhalb des lokalen Netzwerks auf:

$ netstat -4ntu | tail -n +3 | cut -c45-65 | cut -d: -f1 | grep -v '192.168.99' | grep -v '192.168.1' 214.236.220.101 63.171.235.16 174.63.61.132 159.47.216.178 62.59.197.29 139.47.218.150 56.4.17.22 204.63.49.5 155.9.79.196 144.31.207.66 

Wir müssen also nur diese Liste durchlaufen und bestimmte Routen in Richtung des Hauptrouters legen, bevor Sie die Standardroute ändern:

for i in $(netstat -4nt | tail -n +3 | cut -c45-65 | cut -d: -f1 |grep -v '192\.168\.99' | grep -v '192\.168\.1') ; do echo route add -host $i gw 192.168.1.99; done 

(Ich habe den "Echo" -Befehl dort gelassen, damit Sie sehen können, was er tut. Sie können ihn entfernen, wenn Sie es tatsächlich tun möchten.

Dann ändern Sie Ihre Standardroute:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0 

Da die hinzugefügten Routen spezifischer sind, werden sie der Standardroute vorgezogen. Natürlich können Sie dies in ein Skript schreiben, um es einfacher zu machen.

Die Routingtabellenlösung * würde * funktionieren, wenn es mir gut geht, wenn ich eine Untermenge von IPs auf der alten Schnittstelle belasse. In meiner Anwendung löst dies jedoch mein Problem nicht, da ich neue Verbindungen über die neue Schnittstelle zulassen möchte, selbst wenn sie dieselbe Quell-IP haben. Außerdem habe ich diese Frage teilweise gestellt, weil ich auf die Möglichkeit gehofft hatte eines weniger groben Ansatzes. Patrick Horn vor 11 Jahren 0
@PatrickHorn Es empfiehlt sich, Ihre Frage zu klären, da andere Personen, die Hilfe suchen, diesen Kommentar möglicherweise nicht finden Paul vor 11 Jahren 0