Eine Adresse aus einem client-connect-Skript zurückzugeben, sieht so aus, als sollte es die IP des Clients setzen. Tut es aber nicht: Der einzige Kanal des Hooks zum Server ist eine temporäre Datei, deren Pfad als letztes Argument des Skripts ankommt, und die Adresse muss dort in der Syntax von ifconfig-push geschrieben werden. Ein Skript, das die Adresse ausgibt oder mit Null endet, ohne etwas zu schreiben, erzeugt einen verbundenen Client mit einer Adresse aus dem Pool, und das Serverprotokoll sieht vollkommen gesund aus.

Die Verwirrung ist verständlich, weil mehrere andere Hooks tatsächlich über Exit-Codes oder Umgebungsvariablen antworten. Dieser hat seinen eigenen Vertrag, und der Vertrag beginnt mit einem Dateinamen.

Der Hook schreibt eine Datei, keinen Rückgabewert

Die Deklaration besteht aus zwei Zeilen: script-security 2, um den Aufruf zu erlauben, dann client-connect /etc/openvpn/server/assign-address.sh. Wenn sich ein Client authentifiziert, führt der Server dieses Skript aus, wobei der erzeugte Dateipfad als letztes Argument angehängt wird; dieser ist nur dann $1, wenn die Deklaration keine eigenen zusätzlichen Argumente übergibt. Alles, was auf diesen Client angewendet wird, geht als gewöhnliche Direktiven in diese Datei, eine pro Zeile, genau so, wie sie in einer Konfiguration erscheinen würden. Ein Wrapper, der eigene Parameter hinzufügt, verschiebt die Position, und das klassische Symptom ist ein Skript, das in einen Pfad schreibt, der wie --verbose aussieht.

Der Exit-Status ist die andere Hälfte des Vertrags. Null bedeutet akzeptieren und die Datei lesen; alles andere lehnt die Verbindung ab, und so wird eine nicht zugeordnete Identität abgelehnt, statt still in den Pool zurückzufallen. Schreiben Sie die vollständige Direktive, bevor Sie Erfolg zurückgeben, damit eine halb geschriebene Datei niemals zur Konfiguration eines Clients wird.

Zwei Direktiven verdienen Aufmerksamkeit, weil sie mit allem anderen zusammenspielen. ifconfig-push legt die Adresse fest, während eine gepushte route dem Client sagt, was durch den Tunnel erreichbar ist; geben Sie die erste zurück und vergessen die zweite, erhalten Sie einen Client mit Adresse und ohne Ziel. Die Reihenfolge in der Datei spielt keine Rolle, die Vollständigkeit schon. Ein Hook, der eine Route für ein Präfix pusht, das kein Peer erreichen kann, ist derselbe Fehler von der anderen Seite gesehen.

Eingaben kommen über Umgebungsvariablen: common_name, trusted_ip, ifconfig_pool_remote_ip und der Rest. Behandeln Sie sie alle als Zeichenketten von außerhalb des Servers, niemals als Shell-Fragmente.

Adresszuordnung ist eine Richtlinie, keine Arithmetik

Eine verlockende Abkürzung ist, den Zertifikatsnamen zu parsen und seine Ziffern als letztes Oktett zu verwenden. Das ist kein Allokator, und es scheitert auf gewöhnliche Weise: Zwei Namen mit demselben Suffix kollidieren, ein Name, der auf 300 endet, ist keine Adresse, und ein von einem Administrator umbenanntes Zertifikat verschiebt still ein Gerät. Validieren Sie bei jedem Aufruf Subnetzzugehörigkeit, den nutzbaren Hostbereich, reservierte Adressen und Eindeutigkeit, und führen Sie die Zuordnung in einer Tabelle, die ein Mensch lesen kann.

Wer den Namen kontrolliert, kontrolliert die Adresse, also entscheiden Sie, was common_name in dieser Bereitstellung tatsächlich repräsentiert. Mit aktiviertem username-as-common-name ist die Identität der Login und nicht der Zertifikatsbetreff. Geben Sie diesen Wert niemals in die Shell-Auswertung weiter, und lassen Sie niemals zu, dass der Client einen Dateipfad beeinflusst.

Ein registergestützter Allokator muss Nebenläufigkeit überstehen. Reservieren Sie die Adresse atomar, behandeln Sie einen fehlgeschlagenen Schreibvorgang, ohne einen halb konfigurierten Client zuzulassen, und markieren Sie jede Zuweisung mit der Verbindung, der sie gehört, damit eine späte Trennung einer älteren Sitzung keine Adresse freigeben kann, die eine neuere bereits hält. Mehrere Serverinstanzen, die einen Pool teilen, machen diese Anforderung schärfer statt optional.

Die Topologie entscheidet, was ifconfig-push bedeutet

Mit topology subnet auf 10.77.0.0/24 ist ifconfig-push 10.77.0.20 255.255.255.0 eine Adresse plus ihre Netzmaske. Unter topology net30 ist das zweite Argument überhaupt keine Netzmaske, sondern die Peer-Adresse; wer die Subnetzform auf einen net30-Server kopiert, bekommt einen Client, der sich verbindet und keinen Verkehr durchlässt. Ändern Sie die Topologie bewusst, niemals, damit ein Beispiel konsistent aussieht. Ein Server, der bereits net30 ausführt, hat laufende Clients auf der alten Adressierung, daher ist der Wechsel eine Migration mit Wartungsfenster, keine Einzeilenänderung.

Statische Adressen müssen außerhalb des dynamischen Pools und außerhalb jeder anderen statischen Zuweisung liegen, einschließlich derer, die gewöhnliche client-config-dir-Dateien vergeben. Wenn zwei Mechanismen dieselbe Adresse für verschiedene Clients erzeugen können, wird einer von ihnen es irgendwann tun.

Testen Sie vier Fälle, bevor Sie ihm trauen

Führen Sie dieselben Prüfungen gegen eine zugeordnete Identität, eine nicht zugeordnete, eine Wiederverbindung und einen simulierten Registerfehler aus. openvpn --config client.ovpn --verb 4 zeigt die zugewiesene Adresse in der Push-Antwort, und auf dem Server bestätigt grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log, was tatsächlich gesendet wurde. Für die nicht zugeordnete Identität ist das erwartete Ergebnis eine abgelehnte Verbindung, keine Adresse aus dem Pool.

Untersuchen Sie dann das Verzeichnis, in das der Daemon diese temporären Dateien schreibt. Das Skript läuft im herabgestuften Dienstkontext, daher verwandelt ein Pfad, den root beschreiben kann, der Daemon aber nicht, jede Verbindung in eine Ablehnung mit einem Berechtigungsfehler, der mehrere Zeilen tiefer im Protokoll begraben liegt.

Zuordnung ist keine Autorisierung: Eine feste Adresse gewährt noch immer keinen Zugriff auf jedes Ziel hinter dem Server. Halten Sie Routing- und Firewall-Richtlinie in ihrer eigenen Schicht und prüfen Sie sie gegen die Adresse, die Sie gerade festgelegt haben.

Ähnliche Artikel