ubuntuusers.de

Du betrachtest eine alte Revision dieser Wikiseite.

Dispatcher

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist mit keiner aktuell unterstützten Ubuntu-Version getestet! Bitte teste diesen Artikel für eine Ubuntu-Version, welche aktuell unterstützt wird. Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Der NetworkManager kann mehr als nur einfach eine Verbindung auf- und wieder abbauen. Er ist in der Lage, zusätzliche Skripte beim Verbindungsauf- und -abbau ausführen. Dies erfolgt über Dispatcher-Skripte, die ausgeführt werden, wenn der NetworkManager eine Aktion durchführt, z.B. wenn er sich zu einem WLAN verbindet oder davon trennt. Diese Funktionen sind jedoch nicht von der grafischen Oberfläche aus konfigurierbar.

Achtung!

Das Skript /etc/NetworkManager/dispatcher.d/01ifupdown sollte man niemals löschen oder modifizieren. Es ist ein grundlegender Bestandteil der Funktionalität des NetworkManagers und wird in unveränderter Form für die Funktion des NetworkManagers benötigt.

Was ist ein Dispatcher-Skript

Grundsätzlich ist ein Dispatcher-Skript ein ganz normales Shellskript, das im Ordner /etc/NetworkManager/dispatcher.d/ liegt. Diese Skripte werden dann vom NetworkManager bei einer Änderung an den Netzwerken mit zwei Parametern aufgerufen: Netzwerkschnittstelle und Aktion. Wichtig dabei ist, dass root der Besitzer der Skripte ist, da sie sonst nicht ausgeführt werden können.

In dem Ordner können mehrere Skripte liegen, diese werden in alphabetischer Reihenfolge abgearbeitet. Ein Skript liegt bereits in dem Ordner, 01ifupdown, dieses ist das Grundskript des NetworkManagers und sorgt dafür, dass die Netzwerkschnittstellen richtig initialisiert werden.

Aktionen

Als zweiter Parameter wird dem Script vom NetworkManager der Name der Aktion übergeben, welche die Dispatcherausführung ausgelöst hat.

Dispatcher Aktionen
AktionBedeutungAnwendungsbeispiel
up Eine reelle Netzwerkverbindung wurde aktiviert. Mountet man Netzwerkfreigaben über ein Netzwerk, so kann man dieses an dieser Stelle ausführen lassen.
down Eine reelle Netzwerkverbindung wurde deaktiviert. Hat man Netzwerkfreigaben eingebunden, so sollte man diese vor dem Verbindungsabbau aushängen. Erst dann kann man sicher gehen, dass alle Daten korrekt geschrieben wurden.
vpn-up Eine virtuelle(VPN) Netzwerkverbindung wurde aktiviert.
vpn-down Eine virtuelle(VPN) Netzwerkverbindung wurde deaktiviert.
hostname Der Hostname wurde geändert
dhcp4-change Der DHCP lease hat sich gändert (IPv4 Verbidungen)
dhcp6-change Der DHCP lease hat sich gändert (IPv6 Verbidungen)

Was kann man damit machen?

Eigentlich alles was ein Skript so kann... man sollte aber nur sinnvolle Dinge wie z.B. automatischer Uhrzeitabgleich, Starten eines VPN-Clients oder Umschalten der iptables-Konfiguration machen.

Beispiele

VPNC starten

Man kann auch bei wechselnden WLAN-Umgebungen für einzelne Netze bestimmte Funktionen durchführen lassen. Dies wird hier gezeigt mit dem Beispiels "VPNC in der Uni".

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
## INITIALISIERUNG
#Diese Werte werden vom NetworkManager an das Skript übergeben
INTERFACE=$1
ACTION=$2

## ESSID des Universitäts-Netzwerkes
ESSID_VPN="VPN/WEB"

## ESSID des verbundenen Netzwerks bestimmen
ESSID=$(iwconfig $INTERFACE | grep ESSID | cut -d":" -f2 | \
        sed 's/^[^"]*"\|"[^"]*$//g')

## Funktionen durchführen, je nach Aktion eine andere
case "$2" in
        up)
                if [ "$ESSID" = "$ESSID_VPN" ]; then 
                        vpnc /etc/vpnc/uni.conf
                fi
                ;;

        down)
                if [ "$(pidof vpnc)" ]; then
                        vpnc-disconnect
                        killall vpnc
                fi
                ;;

        pre-up)
                ;;

        post-down)
                ;;

        *)
                echo $"Usage: $0 {up|down|pre-up|post-down}"
                exit 1
esac

Bei dieser Art, zu einem VPN-gesicherten WLAN zu verbinden, muss das Passwort im Klartext in der Datei /etc/vpnc/uni.conf gespeichert werden. Die Datei sollte daher root gehören und darf für andere nicht lesbar sein [2]:

sudo chown root:root /etc/vpnc/uni.conf
sudo chmod 700 /etc/vpnc/uni.conf 

Das Skript /etc/NetworkManager/dispatcher.d/02uni-vpnc muss außerdem noch ausführbar gemacht werden [2]. Nun wird beim Verbindungsaufbau überprüft, ob man sich zu einem WLAN mit dem Namen "VPN/WEB" verbindet und, falls dies der Fall ist, automatisch eine VPN-Verbindung mittels VPNC ausgeführt.

VPN netzwerkabhängig starten und automatischer Reconnect (mittels NetworkManager)

Möchte man, dass eine bestimmte VPN-Verbindung gestartet wird, sobald eine bestimmte WLAN-, LAN-, oder sonstige Verbindung hergestellt wurde, kann man dies mit der in Ubuntu 10.10 neu eingeführten API des NetworkManager leicht realisieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash

REQUIRED_CONNECTION_NAME="<LanConnection1>"
VPN_CONNECTION_NAME="<VpnConnection1>"


sleep "3s"

active_con=$(nmcli connection show --active | grep "${REQUIRED_CONNECTION_NAME}")
active_vpn=$(nmcli connection show --active | grep "${VPN_CONNECTION_NAME}")
if [ "${active_con}" -a ! "${active_vpn}" ];
then
    nmcli con up id "${VPN_CONNECTION_NAME}"
fi

In diesem Skript müssen noch die Namen der erforderlichen Verbindung <LanConnection1> und der Name der VPN-Verbindung <VpnConnection1> eingetragen werden. Das Skript wird unter beliebigen Namen (z.B. 02VPN1) in den Ordner des Dispacher /etc/NetworkManager/dispatcher.d/ kopiert und die Rechte gesetzt.

chown root:root /etc/NetworkManager/dispatcher.d/02VPN1
chmod 700 /etc/NetworkManager/dispatcher.d/02VPN1

Natürlich lassen sich mit gleichem Aufwand auch Skripte erstellen, die bei Fehlen einer LAN- und WLAN-Verbindung eine UMTS-Verbindung automatisch aufbauen und diese bei Aktivierung einer Verbindung auch wieder abschalten.

Ab Ubuntu 11.10

Seit Ubuntu 11.10 reicht das alleine allerdings nicht mehr aus, denn die Passwörter der VPN-Verbindung werden im GNOME Schlüsselbund des angemeldeten Benutzers gespeichert. Die Skripte in dispatcher.d werden allerdings von root ausgeführt, welcher aber keinen Zugriff auf diese Passwörter hat. Deswegen kommt es dann zur Fehlermeldung "Keine gültigen VPN-Geheimnisse".

Um das zu ändern, öffnet man die Konfigurationsdatei der VPN-Verbindung, praktisch also eine Datei nach dem Muster /etc/NetworkManager/system-connections/VPN-VERBINDUNGSNAME. Dort ändert man bei den beiden Schlüsseln "Xauth password-flags=" und "IPSec secret-flags=" den voreinstellten Wert "1" auf "0". Damit wird der NetworkManager angewiesen, die Passwörter direkt in die Konfigurationsdatei statt in den Schlüsselbund zu speichern. Diese Passwörter müssen nun noch auf diese neue Art gespeichert werden. Um das zu erreichen, schließt man die Datei wieder und öffnet die Konfiguration der VPN-Verbindung über den NetworkManager. Dort schreibt man einmal das Gruppen- und das Benutzerpasswort hinein und schließt mit "Speichern" ab.

Um zu überprüfen, ob es funktioniert hat, öffnet man noch einmal die Datei /etc/NetworkManager/system-connections/VPN-VERBINDUNGSNAME. Dort sollten nun gegen Ende der Datei zwei neue Zeilen mit den Passwörtern ähnlich wie hier hinzugefügt worden sein:

[vpn-secrets]
IPSec secret=GRUPPENKENNWORT
Xauth password=BENUTZERKENNWORT

Ob der Verbindungsaufbau nun über root funktioniert, lässt sich mit folgendem Befehl im Terminal testen:

nmcli con up id VPN-VERBINDUNGSNAME

Wifi deaktivieren wenn Ethernet (LAN) verfügbar ist, und umgekehrt

Am einfachsten legt man das Skript im Terminal an:

sudo nano /etc/NetworkManager/dispatcher.d/50wifioff 

Das eigentlich Skript mit Logger nach /var/log/syslog:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
logger "Running $0"
case "$1" in
    eth*)  # oder auch enx*), .. bitte mit <ifconfig -a> ermitteln
        if [ "$2" == up ]; then
		logger "$1 $2 wifi off"
		nmcli radio wifi off
        elif [ "$2" == down ]; then
		logger "$1 $2 wifi on"
		nmcli radio wifi on	
	fi
        ;;
esac

Achtung der Suchbegriff nach der aktivierten LAN-Schnittstelle heißt in neueren Ubuntuversionen oft anders und muss mit

ifconfig -a 

ermittelt werden.

Danach die Rechte richtig setzten:

sudo chmod 755 /etc/NetworkManager/dispatcher.d/50wifioff 

Wenn die ersten drei Buchstaben der Ethernet-Schnittstellen-Bezeichnung richtig ermittelt wurden, funktioniert das Skript sofort:

LAN-Kabel rein → WLAN wird deaktiviert

LAN-Kabel raus → WLAN wird aktiviert und verbindet sich neu

Diese Revision wurde am 18. Juli 2019 09:42 von frustschieber erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk, Internet, VPN