Wie kann die Standard-Quell-IP-Adresse so geändert werden, dass sie nicht der Adresse entspricht, die der Standardroute zugewandt ist?

Wie kann die Standard-Quell-IP-Adresse so geändert werden, dass sie nicht der Adresse entspricht, die der Standardroute zugewandt ist?

Hintergrundinformation

  • Ich verwende ein Linux-System, um den Datenverkehr für einen kleinen Block öffentlicher IPv4-Adressen weiterzuleiten (indem ich die IP-Weiterleitung in aktiviere sysctrl.conf).

  • eth1Der Router stellt über PPPoE eine Verbindung zum ISP her .

  • Die für PPP verwendete lokale Peer-Adresse ist eine manuell konfigurierte IP-Adresse, die vom ISP angegeben wurde. Die lokale Peer-Adresse lautet 10.0.0.10.

  • Die für PPP verwendete Remote-Peer-Adresse ist ebenfalls eine manuell konfigurierte IP-Adresse, die vom ISP angegeben wurde. Die Remote-Peer-Adresse lautet 10.0.0.9.

  • Die Standardroute des Routers erfolgt 10.0.0.9über 10.0.0.10.

  • Der Router ist über mit einem Ethernet-Switch verbunden und eth0für eth0die Verwendung einer der öffentlichen Adressen konfiguriert.

  • Der Switch verbindet alle anderen öffentlichen Hosts. Jeder verbundene Host verwendet eine öffentliche IP-Adresse.

  10.0.0.9
ISP ----------+
              |   10.0.0.10                       X.X.X.X
              +------------- (eth1) ROUTER (eth0) --------------- SWTICH 
                                                                     |     
                                                                     +-- X.X.X.Y
                                                                     +-- X.X.X.Z
                                                                     ...

Mein Problem

Alles funktioniert wie erwartet, mit Ausnahme der Programme, die auf dem Router laufen. Jede Anwendung, die ich auf dem Router ausführe, verwendet 10.0.0.10die Quell-IP-Adresse als Verbindung zum Internet. Das ist verständlich, da eth1dort das Internet verfügbar ist. Da die Adresse jedoch nicht öffentlich geroutet werden kann, aptfunktionieren ping, und andere Programme nicht. Wenn ich die Quelladresse bei Anwendungen, die dies unterstützen (z. B. ping), explizit einstelle, funktionieren die Anwendungen.

Meine Frage

eth1Wie kann ich den Router so konfigurieren, dass er unbekannte Pakete über / weiterleitet 10.0.0.9und gleichzeitig eth0beim Initiieren neuer Verbindungen die öffentliche IP-Adresse als Standardquelle verwendet?

Antwort1

Hinweis: Ich gehe davon aus, dass das LAN Ihres Routers 192.0.2.0/24 ist und seine LAN-IP aufeth0ist 192.0.2.1/24, um konkrete Erklärungen und eine Lösung geben zu können.

Ihr ISP hat Ihnen, um einige öffentliche IP-Adressen zu sparen, eine private IP für interne Routing-Zwecke zugewiesen. Das ist in Ordnung, da diese IP niemals für die Außenwelt bestimmt ist (und schnell gelöscht würde vonStrikte Reverse Path Forwardingauf dem Weg, wenn er jemals über den Kabelanschluss hinter Ihrem ISP-Router gelegt wird, oder wenn nicht, wird er nie eine Antwort erhalten, da er nicht routbar ist). Dadurch wird Ihre Konfiguration jedoch komplexer, da Sie vermeiden möchten, dass diese IP in allen Fällen außer bei der Verbindung zum ISP von Ihrem Router verwendet wird.

Sie haben wahrscheinlich etwas Ähnliches wie das hier (es kann etwas anders sein, das spielt keine Rolle):

# ip route
default via 10.0.0.9 dev ppp0 
10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10 
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.1 

Es ist beispielsweise möglich, dass Sie stattdessen haben default via 10.0.0.9 dev ppp0 src 10.0.0.10oder dass dies via 10.0.0.9nicht einmal angezeigt wird, da es sich um einen Layer-3-Link und nicht um einen Layer-2-Link handelt, sodass es vianicht erforderlich ist (aber dennoch akzeptiert wird). Passen Sie einfach die Einstellungen unten entsprechend an.

Derzeit wählt der Kernel die scheinbar am besten geeignete IP, also die auf derselben Seite festgelegte IP-Adresse, um das Internet zu erreichen, da ihm nichts anderes mitgeteilt wird (oder er ausdrücklich anweist, die nicht gewünschte IP-Adresse zu verwenden):

# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 10.0.0.10 uid 0 
    cache 

Sie müssen lediglich das Routing-Verhalten ändern, wenn der Kernel prüft, wie das Internet erreicht werden kann, und eine bestimmte bevorzugte Quell-IP-Adresse angeben. Beachten Sie, dass Sie im Falle von Fehlern und unvorhergesehenen Problemen möglicherweise die Verbindung verlieren. Wenn möglich, haben Sie einen alternativen (Konsolen-)Zugriff:

# ip route replace default via 10.0.0.9 dev ppp0 src 192.0.2.1
# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 192.0.2.1 uid 0 
    cache 

Das war‘s. Ihr Router routet wie üblich, wählt aber 192.0.2.1, wenn eine lokal erzeugte ausgehende IP-Adresse gewählt werden muss, sofern nicht ausdrücklich etwas anderes angegeben wird (z. B.: Prozess bindet die Quell-IP explizit an seinen Socket).

Diese Route muss jedes Mal neu eingerichtet werden, wenn die Verbindung unterbrochen und wieder aufgebaut wird. Es liegt an Ihnen, dies in ein PPPoE-Skript zu integrieren, nachdem die Verbindung vollständig hergestellt wurde.

Beachten Sie auch, dass der Schnittstellennameppp0könnte sich ändern zuppp1oder einen beliebigen anderen Namen. Sie müssen dies in Ihren Setup-Skripten selbst handhaben.


Alternative Methoden zum Festlegen derselben Routeneinstellung:

  1. eine niedrigere Metrik hinzufügen, wenn eine Metrik anfänglich festgelegt wird

    Wenn die ursprüngliche Metrik festgelegt war (d. h. sie war nicht 0, sondern beispielsweise 100), können Sie stattdessen eine alternative Standardroute mit einer niedrigeren Metrik hinzufügen, anstatt die vorherige zu ersetzen:

    # ip route add default via 10.0.0.9 dev ppp0 src 192.0.2.1 metric 50
    
  2. Dedizierte Routing-Regel

    Wenn Sie eine Interaktion mit verschiedenen an PPPoE beteiligten Tools befürchten, die die obige Route entfernen könnten, können Sie diese Einstellung in einer alternativen Routing-Tabelle installieren und ihr in den Routing-Regeln Vorrang einräumen, wobei eine Teilkopie der Haupttabelle erstellt wird, um Störungen zu vermeiden. Dies muss nach jeder Trennung/Wiederherstellung der Verbindung erneut durchgeführt werden, da die Route trotzdem verschwindet. Hier iif loist speziell und bedeutet eigentlich „lokal erzeugtes ausgehendes Paket“ und nicht eingehendes, und 109 ist ein beliebig gewählter Tabellenwert:

    # ip rule add iif lo lookup 109 # needed only once
    # ip route add table 109 10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10 # to keep using 10.0.0.10 for local link, just in case
    # ip route add table 109 192.0.2.0/24 dev eth0 src 192.0.2.1 # will disappear if eth0 is brought down
    # ip route add table 109 default via 10.0.0.9 dev ppp0 src 192.0.2.1 # will disappear if ppp0 is brought down
    

    Wenn Sie der Haupttabelle weitere Routing-Einträge hinzugefügt haben, müssen Sie diese wahrscheinlich auch oben kopieren.

    # ip route get 8.8.8.8
    8.8.8.8 via 10.0.0.9 dev ppp0 table 109 src 192.0.2.1 uid 0 
        cache 
    
  3. Routingregeln mit vereinfachter Route

    Man kann die Routen in der Haupttabelle behalten und nur die Standardroute mit einem präfixbasierten Suppressor in der Regel überschreiben: Dies vermeidet das KopierenalleRouten: Man kann die Standardroute einfach kopieren und ändern.

    Ersetzen Sie 2. durch (unter Angabe der Präferenzwerte, wobei Sie diese dennoch in absteigender Reihenfolge anordnen, wie es auch ohne Angabe der Werte der Fall wäre):

    # ip rule add pref 32765 iif lo lookup 109 # needed only once
    # ip rule add pref 32764 iif lo lookup main suppress_prefixlength 0 # needed only once
    
    # ip rule
    0:      from all lookup local
    32764:  from all iif lo lookup main suppress_prefixlength 0
    32765:  from all iif lo lookup 109
    32766:  from all lookup main
    32767:  from all lookup default
    
    # ip route add table 109 default via 10.0.0.9 dev ppp0 src 192.0.2.1 # will disappear if ppp0 is brought down
    

    Für alles, was nicht die Standardroute ist, wird zuerst die Hauptroutingtabelle verwendet. Für lokal ausgehenden Datenverkehr wird dann die Standardroute in Routingtabelle 109 bereitgestellt. Für alles andere wird fortgefahren und die Standardroute wird wie üblich erneut in der Haupttabelle nachgeschlagen.

    Der Vorteil gegenüber 2. besteht darin, dass keine (nicht standardmäßigen) Routen aus der Tabelle dupliziert werden müssen.hauptsächlichin Tabelle 109 nicht mehr. Unten, Tabellehauptsächlichliefert im Gegensatz zur 2. Methode das Ergebnis für eine nicht standardmäßige Route:

    # ip route get 8.8.8.8
    8.8.8.8 via 10.0.0.9 dev ppp0 table 109 src 192.0.2.1 uid 0 
        cache 
    # ip route get 192.0.2.2
    192.0.2.2 dev eth0 src 192.0.2.1 uid 0 
        cache 
    

Antwort2

Genau wie Sie gesagt haben. Die anderen Clients auf dem Switch mit Ihrem Router als Gateway haben öffentliche IP-Adressen. Ihr Router hat keine. Er hat eine LAN-Adresse, die nicht weitergeleitet wird. Da Ihr Internetdienstanbieter Ihnen KEINE öffentliche Adresse gegeben hat, kann der Router NICHT rausgehen.

Wenn Sie eine andere öffentliche IP haben, erstellen Sie eine virtuelle ETH-Konfiguration auf eth1 und routen Sie sie entsprechend. Dann kann auch Ihr Router ausgehen.

verwandte Informationen