Eine OpenVPN-Direktive pro Zeile – und warum Zeilenumbruch täuscht
Ein weich umbrochener Bildschirm ist kein Zeilenumbruch in der Datei. Prüfen Sie die echten Zeilenumbrüche, bevor Sie einen fehlerhaften Abschnitt durch die Vorlage eines Fremden ersetzen.
Ein Profil, das früher startete, schlägt jetzt mit einem Optionsfehler fehl, und die Zeile, die der Parser zitiert, sieht auf dem Bildschirm völlig vernünftig aus. Das ist die Falle: Eine Konfigurationsdatei ist eine Liste physischer Zeilen, von denen jede ein Optionsschlüsselwort und seine Argumente enthält, und eine lange, vom Editor umbrochene Zeile sieht genauso aus wie zwei Zeilen, bis man die Bytes betrachtet. Nichts am Netzwerk, am Zertifikat oder am Tunnel ist an dieser Fehlerklasse beteiligt. Zwei Zeilen, die auf dem Bildschirm gleich aussehen, können sich um ein einziges Byte unterscheiden.
Arbeiten Sie die folgenden Prüfungen der Reihe nach ab, und halten Sie bei der ersten an, die fehlschlägt. Jede ist billiger als die nächste, und jede schließt eine andere Erklärung aus.
Eine Zeile, eine Direktive
Der Parser liest eine Zeile, nimmt das erste Wort als Option und behandelt den Rest als Argumente dieser Option. Eine Zeile wie cert server.crt port 1194 sind also nicht zwei Anweisungen hintereinander. Es ist eine cert-Option mit drei Argumenten, und das dritte ist kein Dateiname, den die Option akzeptiert. Den Fehler als fehlenden Zeilenumbruch zu lesen ist richtig; ihn als fehlende Direktive zu lesen ist es nicht.
# malformed: one option, three arguments
cert server.crt port 1194
# intended: two options, one argument each
cert server.crt
port 1194
Diese beiden korrigierten Zeilen sind ein Fragment, keine Konfiguration. Sie stehen dafür, zu zeigen, wohin die Grenze gehört. Jede gewöhnliche Direktive in einem Profil folgt derselben Regel, und eine Zeile, die zwei davon verbindet, erzeugt entweder einen Argumentfehler oder einen Wert, den die Option nicht erwartet hat.
Beweisen Sie, dass der Zeilenumbruch echt ist
Editoren brechen nur zur Anzeige um. Manche fügen beim Einfügen auch harte Umbrüche ein, manche nicht, sodass dasselbe visuelle Ergebnis aus zwei sehr unterschiedlichen Dateien stammen kann. Zeigen Sie die Zeilenenden an und zählen Sie die Zeilen, bevor Sie etwas ändern. Messen kostet einen Befehl; Raten kostet einen Abend.
cat -A /etc/openvpn/server/lab.conf | sed -n '10,20p'
awk 'NR>=10 && NR<=20 {printf "%d:%s\n", NR, $0}' /etc/openvpn/server/lab.conf
In der ersten Ausgabe erscheint jeder echte Zeilenumbruch als ein $-Marker, sodass eine umbrochene, aber ununterbrochene Zeile dort keinen Marker zeigt, wo Ihr Bildschirm umbricht. Der zweite Befehl gibt nummerierte Zeilen aus, was der schnellste Weg ist, zu vergleichen, was der Parser meldet, mit dem, was die Datei enthält.
Auch zusätzliche Leerzeichen erzeugen keine Direktive. Einrückung ist kosmetisch, und eine Zeile, die mit Leerraum beginnt, ist immer noch dieselbe einzelne Option. Wenn die Fehlermeldung auf eine Zeilennummer zeigt, lesen Sie genau diese Zeile statt des Absatzes, zu dem sie gehört.
Zitieren Sie einen Pfad, keine Direktivenliste
Anführungszeichen gibt es für Argumente mit Leerzeichen, nicht zum Gruppieren von Optionen. Ein Zertifikatspfad mit einem Leerzeichen braucht seine eigenen Anführungszeichen; zwei Direktiven, die sich ein Anführungszeichenpaar teilen, sind immer noch eine fehlerhafte Zeile.
cert "/etc/openvpn/pki/lab certs/server.crt"
key "/etc/openvpn/pki/lab certs/server.key"
Prüfen Sie die Optionsnamen zugleich mit dem Layout, denn eine zusammengefügte Zeile kann ein plausibel aussehendes Zeichen erzeugen, das nie existiert hat. Die Port-Direktive ist port; ein Profil, das für dieselbe Idee etwas anderes verwendet, schlägt auch nach der Korrektur der Zeilengrenzen fehl. Wenn ein Name unbekannt aussieht, vergleichen Sie ihn mit der Optionsliste für die von Ihnen verwendete Version statt mit einem Forumsbeispiel.
Inline-Blöcke bleiben Blöcke
Profile können Zertifikate und Schlüssel inline enthalten, und diese Blöcke sind Daten, keine Konfiguration. Die PEM-Zeilen in einem Block sind keine Optionen, die man flachklopfen, neu einrücken oder zusammenfügen darf, und die Blockmarker müssen in eigenen Zeilen bleiben.
Behandeln Sie einen Inline-Block als undurchsichtigen Bereich: Korrigieren Sie die Optionszeilen darum herum, lassen Sie seinen Inhalt Byte für Byte unangetastet, und fügen Sie ihn niemals in einen öffentlichen Support-Thread ein. Wenn ein Formatierungswerkzeug den Block umgeschrieben hat, stellen Sie ihn aus Ihrer PKI wieder her, statt ihn von Hand zu reparieren.
Reparieren Sie den kleinsten Abschnitt, nicht die Vorlage
Die verlockende Reparatur besteht darin, die ganze Datei durch eine Konfiguration aus einer Anleitung zu ersetzen, die „funktioniert“. Das tauscht eine fehlerhafte Zeile gegen eine Reihe von Richtlinienänderungen, die niemand geprüft hat: andere DH-Parameter, Komprimierungseinstellungen, Cipher-Wahl, doppelte Listener. Das ursprüngliche Problem ist klein und lokal, und der Ersatz ist beides nicht.
Kopieren Sie das Profil in eine geschützte Arbeitsdatei, korrigieren Sie die Zeilengrenzen in dieser Kopie, und lassen Sie den normalen Eigentümer des Dienstes sie laden. Starten Sie dann die Instanz und lesen Sie den ersten Fehler, falls es einen gibt, von Anfang an.
openvpn --config /etc/openvpn/server/lab.conf --verb 3 --log /tmp/parse.log
grep -n 'Options error' /tmp/parse.log
Wenn die Parsing-Phase durchläuft, betrifft der nächste Fehler eine Datei, ein Zertifikat oder eine Cipher statt des Vokabulars, und das ist echter Fortschritt. Bewahren Sie die Arbeitskopie und eine einzeilige Notiz darüber auf, was zusammengefügt wurde; dasselbe Einfügen wird jemand anderem im selben Team erneut passieren.