Permanente Route auf OS-X einrichten

Zusätzliche Routen werden im Netzwerk immer mal wieder benötigt, wenn ein Netzwerk über einen anderen Router als über das Default Gateway zu erreichen sind.

Damit diese auch nach einem Neustart des Betriebssystems noch bestehen, müssen diese permanent gemacht werden. Unter Linux funktioniert das am einfachsten in den Startup Scripts der Netzwerk Interfaces. Unter Windows ist der Parameter „-p“ des „route“ Befehls dafür vorgesehen.

Ausgerechnet bei Apples Betriebssystem OS-X, welches für einfache Bediehnung bekannt ist, gestaltet sich die Sache etwas komplizierter.

Um eine temporäre Route anzulegen, in diesem Beispiel für das Netzwerk 10.10.10.0/24 über das Gateway 192.168.1.100 ist im Terminal folgender Befehl einzugeben: „sudo route add -net 10.10.10.0 -netmask 255.255.255.0 192.168.1.100„.

Viele Anleitungen zum Setzen einer permanenten Route empfehlen ein Script für den LaunchDaemon zu erstellen, welches die Route direkt anlegt. Die entsprechenden .plist Files liegen dann unter „/Library/LaunchDaemons/“.

Bei meinen Versuchen wurde die Route angelegt, wenn ich direkt in der Konsole startete: „launchctl load /Library/LaunchAgents/routes.static.plist„, nach einem Neustart fehlte die Route dann aber. Mir kam der Verdacht, das in dem Moment, wo die Route angelegt werden sollte, das entsprechende Netzwerkinterface noch gar nicht aktiv ist. Durch Ausgabe des Ergebnis in eine Log Datei wurde der Verdacht bestätigt.

Deshalb starte ich den Route Befehl nun über ein Shell Script, welches vorher mit „scutil“ prüft, ob das Interface up ist (hier für en0): „/usr/sbin/scutil -w State:/Network/Interface/en0/IPv4

Hier ein komplettes Script als Beispiel, welches unter „/usr/local/bin/static-routes.sh“  liegt und mittels „chmod +x“ ausführbar gemacht wurde:


#!/bin/bash
function testandwait {
/usr/sbin/scutil -w State:/Network/Interface/en0/IPv4
if [ $? != 0 ] ; then
logger "warte auf Netzwerk"
sleep 30
testandwait
else
addroute
fi
}
function addroute {
route -n add -net 10.10.10.0 192.168.1.100
exit
}
testandwait

Das Script ist zwar alles andere als perfekt, aber auf diese Weise wird die Route angelegt sobald das Interface bereit ist.

6 Kommentare

  1. Da heute mal wieder eine Frage zu dem Thema aufkam, möchte ich einen eleganteren Weg mittels der Option „-setadditionalroutes“ von „networksetup“ vorstellen, welche bei neueren Betriebssystem Versionen vorhanden ist.

    Zuerst schauen wir mal nach, welche Interfaces der Mac hat:

    networksetup -listallnetworkservices

    Dann wird das entsprechender Interface noch mal geprüft, ob es auch das richtige ist:

    networksetup -getinfo "Ethernet 1"

    Angenommen, die Route für das Netz 10.10.10.0/24 soll, wie im obigen Beispiel, über den Router mit der IP Adresse 192.168.1.100 gehen:

    networksetup -setadditionalroutes "Ethernet 1" 10.10.10.0 255.255.255.0 192.168.1.100

    Werden Routen für mehrere Netze benötigt, so muss alles in einem Befehl geschrieben werden, da die bestehenden Einträge sonst überschrieben werden:

    networksetup -setadditionalroutes "Ethernet 1" 10.10.10.0 255.255.255.0 192.168.1.100 10.10.11.0 255.255.255.0 192.168.1.100

    1. Hallo
      vielen Dank das ist sehr informativ. Vielleicht können sie mir ja mit einem kleinen Problem weiterhelfen:
      Ich versuche macOs zu zwingen auf eine bestimmte IP (genauer mein NAS) nur mittels eines bestimmten Interfaces zu gelangen. Ginge das auch mittels networksetup?

      1. Hallo,

        prinzipiell kann das funktionieren, es kommt halt darauf an, in welchem IP-Kreis sich die jeweiligen Geräte befinden und wie dann das Routing eingerichtet ist.

        1. es ist ein total simples setup eigentlich, der Mac Pro hat die IP 192.168.1.111 und 192.168.1.112 (Lan und Wlan)
          Das NAS die 192.168.1.101
          Beide selbes subnet 255.255.255.0 und selben Router 192.168.1.1

          Ich möchte etlich nur festlegen das der MacPro nur übers LAN aufs NAS geht. (erbringt das leider manchmal durcheinander und geht per WLan aufs NAS)

          1. Hallo Tino,
            die Frage ist zwar schon alt, aber möglicherweise hilft jemand anderem noch der Ansatz einer exklusiven Route für ein einzelnes Gerät als Ziel:
            Im Routen-Eintrag als Subnetzmaske nur 32 Bit angeben, also 255.255.255.255, dann gilt der Routing-Eintrag exklusiv für die Ziel-IP-Adresse des NAS (in dem Fall).
            Nur -das sei hier angemerkt- je nach Netzwerkaufbau könnte es sein, dass das Antwortpaket vom NAS nicht zurückkommt, das hängt von dessen Konfiguration ab.

            Viel Erfolg und LG!
            Erik

  2. Danke für den Tipp!
    Falls noch die Frage aufkommt, wie man eine per networksetup erstellte Route wieder weg bekommt: Keine Routen mitgeben:
    networksetup -setadditionalroutes „Ethernet 1“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert