Una direttiva OpenVPN per riga, e perché l’andare a capo inganna
Uno schermo con ritorno a capo morbido non è un’interruzione di riga nel file. Controllate le interruzioni di riga reali prima di sostituire una sezione malformata con il modello di uno sconosciuto.
Un profilo che prima si avviava ora fallisce con un errore di opzioni, e la riga citata dal parser sembra del tutto ragionevole sullo schermo. È la trappola: un file di configurazione è un elenco di righe fisiche, ognuna con una parola chiave di opzione e i suoi argomenti, e una riga lunga mandata a capo da un editor è identica a due righe finché non si guardano i byte. Nulla della rete, del certificato o del tunnel entra in questa classe di errore. Due righe identiche sullo schermo possono differire di un solo byte.
Eseguite i controlli seguenti in ordine e fermatevi al primo che fallisce. Ognuno costa meno del successivo, e ognuno elimina una spiegazione diversa.
Una riga, una direttiva
Il parser legge una riga, prende la prima parola come opzione e tratta il resto come argomenti di quell’opzione. Una riga come cert server.crt port 1194 non è quindi due istruzioni in sequenza. È una singola opzione cert con tre argomenti, e il terzo non è un nome di file che l’opzione accetta. Leggere l’errore come un’interruzione di riga mancante è corretto; leggerlo come una direttiva mancante non lo è.
# malformed: one option, three arguments
cert server.crt port 1194
# intended: two options, one argument each
cert server.crt
port 1194
Quelle due righe corrette sono un frammento, non una configurazione. Servono a mostrare dove deve stare il confine. Ogni direttiva ordinaria di un profilo segue la stessa regola, e una riga che ne unisce due produce un errore di argomento oppure un valore che l’opzione non si aspettava.
Dimostrate che l’interruzione di riga è reale
Gli editori vanno a capo per la visualizzazione. Alcuni inseriscono anche interruzioni rigide quando incollate, altri no, quindi lo stesso risultato visivo può venire da due file molto diversi. Mostrate i fine riga e contate le righe prima di cambiare qualsiasi cosa. Misurare costa un comando; indovinare costa una serata.
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
Nel primo output ogni vera interruzione di riga appare come un marcatore $, quindi una riga mandata a capo ma non spezzata non mostra alcun marcatore dove lo schermo va a capo. Il secondo comando stampa righe numerate, il modo più rapido per confrontare ciò che il parser segnala con ciò che il file contiene.
Anche gli spazi in più non creano una direttiva. L’indentazione è cosmetica, e una riga che inizia con uno spazio resta la stessa singola opzione. Se il messaggio di errore indica un numero di riga, leggete esattamente quella riga invece del paragrafo a cui appartiene.
Citare un percorso, non un elenco di direttive
Le virgolette esistono per gli argomenti che contengono spazi, non per raggruppare opzioni. Un percorso di certificato con uno spazio ha bisogno delle proprie virgolette; due direttive che condividono una coppia di virgolette restano una sola riga malformata.
cert "/etc/openvpn/pki/lab certs/server.crt"
key "/etc/openvpn/pki/lab certs/server.key"
Controllate i nomi delle opzioni insieme alla disposizione, perché una riga unita può produrre un token dall’aspetto plausibile che non è mai esistito. La direttiva di porta è port; un profilo che usa qualcos’altro per la stessa idea fallirà anche dopo aver corretto i confini di riga. Quando un nome sembra sconosciuto, confrontatelo con l’elenco delle opzioni della versione che usate invece che con un esempio di forum.
Tenete i blocchi in linea come blocchi
I profili possono incorporare certificati e chiavi, e quei blocchi sono dati, non configurazione. Le righe PEM dentro un blocco non sono opzioni da appiattire, reindentare o unire, e i marcatori del blocco devono restare su righe proprie.
Trattate un blocco in linea come una regione opaca: correggete le righe di opzioni attorno, lasciate intatto il contenuto byte per byte e non incollatelo mai in un thread di supporto pubblico. Se uno strumento di formattazione ha riscritto il blocco, ripristinatelo dalla vostra PKI invece di ripararlo a mano.
Riparate la sezione più piccola, non il modello
La riparazione tentante è sostituire l’intero file con una configurazione presa da un tutorial che «funziona». Questo scambia una riga malformata con una serie di modifiche alle politiche che nessuno ha esaminato: parametri DH diversi, impostazioni di compressione, scelte di cifratura, listener duplicati. Il problema originale è piccolo e locale, e la sostituzione non è né l’uno né l’altro.
Copiate il profilo in un file di lavoro protetto, correggete i confini di riga in quella copia e lasciate che il normale proprietario del servizio la carichi. Poi avviate l’istanza e leggete il primo errore, se c’è, dall’inizio.
openvpn --config /etc/openvpn/server/lab.conf --verb 3 --log /tmp/parse.log
grep -n 'Options error' /tmp/parse.log
Quando la fase di analisi passa, il guasto successivo riguarderà un file, un certificato o una cifratura invece del vocabolario, e questo è vero progresso. Conservate la copia di lavoro e una nota di una riga su ciò che è stato unito; lo stesso incollaggio accadrà di nuovo a qualcun altro dello stesso team.