Een profiel dat eerder startte, mislukt nu met een optiefout, en de regel die de parser citeert ziet er op het scherm volkomen redelijk uit. Dat is de val: een configuratiebestand is een lijst fysieke regels, elk met één optietrefwoord en zijn argumenten, en een lange regel die door een editor wordt afgebroken ziet er identiek uit aan twee regels totdat je naar de bytes kijkt. Niets aan het netwerk, het certificaat of de tunnel is bij deze klasse van fouten betrokken. Twee regels die er op het scherm identiek uitzien, kunnen één byte verschillen.

Werk de controles hieronder in volgorde af en stop bij de eerste die mislukt. Elk is goedkoper dan de volgende, en elk sluit een andere verklaring uit.

Eén regel, één richtlijn

De parser leest een regel, neemt het eerste woord als de optie en behandelt de rest als de argumenten van die optie. Een regel als cert server.crt port 1194 is dus niet twee instructies achter elkaar. Het is één cert-optie met drie argumenten, en het derde is geen bestandsnaam die de optie accepteert. De fout lezen als een ontbrekende nieuwe regel is juist; hem lezen als een ontbrekende richtlijn is dat niet.

# malformed: one option, three arguments
cert server.crt port 1194

# intended: two options, one argument each
cert server.crt
port 1194

Die twee gecorrigeerde regels zijn een fragment, geen configuratie. Ze bestaan om te laten zien waar de grens hoort. Elke gewone richtlijn in een profiel volgt dezelfde regel, en een regel die er twee samenvoegt levert ofwel een argumentfout op, ofwel een waarde die de optie niet verwachtte.

Bewijs dat het regeleinde echt is

Editors breken af voor de weergave. Sommige voegen bij het plakken ook harde regeleinden in, andere niet, dus hetzelfde visuele resultaat kan uit twee heel verschillende bestanden komen. Toon de regeleinden en tel de regels voordat je iets verandert. Meten kost één opdracht; gokken kost een avond.

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 de eerste uitvoer verschijnt elk echt regeleinde als een $-markering, zodat een afgebroken maar niet-gesplitste regel geen markering toont waar je scherm afbreekt. De tweede opdracht drukt genummerde regels af, wat de snelste manier is om te vergelijken wat de parser meldt met wat het bestand bevat.

Extra spaties maken ook geen richtlijn. Inspringing is cosmetisch, en een regel die met witruimte begint is nog steeds dezelfde enkele optie. Als de foutmelding naar een regelnummer wijst, lees dan precies die regel in plaats van de alinea waartoe die behoort.

Citeer een pad, geen lijst met richtlijnen

Aanhalingstekens bestaan voor argumenten met spaties, niet voor het groeperen van opties. Een certificaatpad met een spatie heeft zijn eigen aanhalingstekens nodig; twee richtlijnen die één paar aanhalingstekens delen, zijn nog steeds één misvormde regel.

cert "/etc/openvpn/pki/lab certs/server.crt"
key "/etc/openvpn/pki/lab certs/server.key"

Controleer de optienamen tegelijk met de indeling, want een samengevoegde regel kan een plausibel uitziende token opleveren die nooit heeft bestaan. De poort-richtlijn is port; een profiel dat iets anders gebruikt voor hetzelfde idee, mislukt ook nadat de regelscheidingen zijn gecorrigeerd. Als een naam onbekend lijkt, vergelijk hem dan met de optielijst voor de versie die je draait in plaats van met een forumbvoorbeeld.

Houd inline-blokken als blokken

Profielen kunnen certificaten en sleutels inline bevatten, en die blokken zijn data, geen configuratie. De PEM-regels in een blok zijn geen opties die moeten worden platgeslagen, opnieuw ingesprongen of samengevoegd, en de blokmarkeringen moeten op hun eigen regels blijven.

Behandel een inline-blok als een ondoorzichtig gebied: corrigeer de optieregels eromheen, laat de inhoud byte voor byte met rust, en plak het nooit in een openbare supportthread. Als een opmaakhulpmiddel het blok heeft herschreven, herstel het dan uit je PKI in plaats van het met de hand te repareren.

Repareer de kleinste sectie, niet het sjabloon

De verleidelijke reparatie is het hele bestand vervangen door een configuratie uit een handleiding die „werkt”. Dat ruilt één misvormde regel voor een reeks beleidswijzigingen die niemand heeft nagekeken: andere DH-parameters, compressie-instellingen, cijferkeuzes, dubbele listeners. Het oorspronkelijke probleem is klein en lokaal, en de vervanging is dat geen van beide.

Kopieer het profiel naar een beschermd werkbestand, corrigeer de regelscheidingen in die kopie, en laat de normale eigenaar van de dienst het laden. Start dan de instantie en lees de eerste fout, als die er is, vanaf het begin.

openvpn --config /etc/openvpn/server/lab.conf --verb 3 --log /tmp/parse.log
grep -n 'Options error' /tmp/parse.log

Als de parsefase slaagt, gaat de volgende fout over een bestand, een certificaat of een cijfer in plaats van over woordenschat, en dat is echte vooruitgang. Bewaar de werkkopie en een notitie van één regel over wat er is samengevoegd; hetzelfde plakwerk zal opnieuw gebeuren bij iemand anders in hetzelfde team.

Gerelateerde artikelen