Profils, kas agrāk startēja, tagad neizdodas ar opciju kļūdu, un rinda, ko citē parsētājs, ekrānā izskatās pilnīgi saprātīgi. Tas ir slazds: konfigurācijas fails ir fizisku rindu saraksts, katrā ir viens opcijas atslēgvārds un tā argumenti, un gara rinda, ko pārlauž redaktors, izskatās identiski divām rindām, līdz paskatās uz baitiem. Nekas no tīkla, sertifikāta vai tuneļa šajā kļūdu klasē nav iesaistīts. Divas rindas, kas ekrānā izskatās identiskas, var atšķirties par vienu baitu.

Veiciet zemāk esošās pārbaudes secīgi un apstājieties pie pirmās, kas neizdodas. Katra ir lētāka par nākamo, un katra izslēdz citu skaidrojumu.

Viena rinda, viena direktīva

Parsētājs nolasa rindu, pirmo vārdu ņem kā opciju un pārējo apstrādā kā šīs opcijas argumentus. Tāda rinda kā cert server.crt port 1194 tātad nav divas instrukcijas pēc kārtas. Tā ir viena opcija cert ar trim argumentiem, un trešais nav faila nosaukums, ko opcija pieņemtu. Lasīt kļūdu kā trūkstošu jaunas rindas simbolu ir pareizi; lasīt to kā trūkstošu direktīvu nav.

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

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

Tās divas izlabotās rindas ir fragments, nevis konfigurācija. Tās pastāv, lai parādītu, kur pieder robeža. Katra parastā profila direktīva ievēro to pašu noteikumu, un rinda, kas savieno divas no tām, rada vai nu argumenta kļūdu, vai vērtību, ko opcija negaidīja.

Pierādiet, ka rindas pārtraukums ir īsts

Redaktori pārlauž attēlošanai. Daži arī ievieto cietos pārtraukumus, kad ielīmējat, bet citi ne, tāpēc viens un tas pats vizuālais rezultāts var nākt no diviem ļoti atšķirīgiem failiem. Parādiet rindu beigas un saskaitiet rindas, pirms kaut ko maināt. Mērīšana maksā vienu komandu; minēšana maksā vakaru.

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

Pirmajā izvadē katrs īstais rindas pārtraukums parādās kā $ atzīme, tāpēc pārlauzta, bet nesadalīta rinda neparāda nekādu atzīmi tur, kur jūsu ekrāns pārlauž. Otrā komanda izdrukā numurētas rindas, kas ir ātrākais veids, kā salīdzināt to, ko parsētājs ziņo, ar to, ko fails satur.

Arī papildu atstarpes nerada direktīvu. Atkāpe ir kosmētiska, un rinda, kas sākas ar atstarpi, joprojām ir tā pati vienīgā opcija. Ja kļūdas ziņojums norāda rindas numuru, lasiet tieši to rindu, nevis rindkopu, kurai tā pieder.

Citējiet ceļu, nevis direktīvu sarakstu

Pēdiņas pastāv argumentiem, kas satur atstarpes, nevis opciju grupēšanai. Sertifikāta ceļam ar atstarpi vajag savas pēdiņas; divas direktīvas, kas dala vienu pēdiņu pāri, joprojām ir viena bojāta rinda.

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

Pārbaudiet opciju nosaukumus vienlaikus ar izkārtojumu, jo savienota rinda var radīt ticamu izskatu marķieri, kas nekad nav pastāvējis. Porta direktīva ir port; profils, kas tai pašai idejai izmanto ko citu, neizdosies arī pēc rindu robežu izlabošanas. Kad nosaukums izskatās nepazīstams, salīdziniet to ar opciju sarakstu jūsu palaistajai versijai, nevis ar foruma piemēru.

Saglabājiet iekļautos blokus kā blokus

Profili var saturēt sertifikātus un atslēgas iekļautus, un šie bloki ir dati, nevis konfigurācija. PEM rindas bloka iekšienē nav opcijas, kas jāsaplacina, no jauna jāatkāpina vai jāsavieno, un bloka atzīmēm jāpaliek savās rindās.

Uztveriet iekļauto bloku kā necaurspīdīgu apgabalu: izlabojiet opciju rindas ap to, atstājiet tā saturu baitu pa baitam mierā un nekad neielīmējiet to publiskā atbalsta pavedienā. Ja formatēšanas rīks bloku pārrakstīja, atjaunojiet to no savas PKI, nevis labojiet ar rokām.

Labojiet mazāko sadaļu, nevis veidni

Kārdinošais labojums ir aizstāt visu failu ar konfigurāciju no pamācības, kas „darbojas”. Tas apmaina vienu bojātu rindu pret politikas izmaiņu kopumu, ko neviens nav pārskatījis: citi DH parametri, saspiešanas iestatījumi, šifra izvēle, dublēti klausītāji. Sākotnējā problēma ir maza un lokāla, un aizvietojums nav ne viens, ne otrs.

Kopējiet profilu aizsargātā darba failā, izlabojiet rindu robežas tajā kopijā un ļaujiet parastajam pakalpojuma īpašniekam to ielādēt. Pēc tam palaidiet instanci un lasiet pirmo kļūdu, ja tāda ir, no sākuma.

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

Kad parsēšanas posms iztur, nākamā kļūda būs par failu, sertifikātu vai šifru, nevis par vārdu krājumu, un tas ir īsts progress. Saglabājiet darba kopiju un vienas rindas piezīmi par to, kas tika savienots; tā pati ielīmēšana atkal notiks kādam citam tajā pašā komandā.

Saistītie raksti