Профил, който преди се стартираше, сега се проваля с грешка за опции, а редът, който парсерът цитира, изглежда напълно разумно на екрана. Това е капанът: конфигурационният файл е списък от физически редове, всеки с една ключова дума за опция и нейните аргументи, а дълъг ред, пренесен от редактор, изглежда идентичен с два реда, докато не погледнете байтовете. Нищо от мрежата, сертификата или тунела не участва в този клас откази. Два реда, които изглеждат еднакво на екрана, могат да се различават с един байт.

Изпълнете проверките по-долу по ред и спрете на първата, която се провали. Всяка е по-евтина от следващата и всяка изключва различно обяснение.

Един ред, една директива

Парсерът чете ред, взема първата дума като опция и третира остатъка като аргументи на тази опция. Затова ред като cert server.crt port 1194 не са две инструкции последователно. Това е една опция cert с три аргумента, а третият не е име на файл, което опцията приема. Да четете грешката като липсващо прекъсване на ред е правилно; да я четете като липсваща директива не е.

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

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

Тези два коригирани реда са фрагмент, не конфигурация. Те съществуват, за да покажат къде принадлежи границата. Всяка обикновена директива в профил следва същото правило и ред, който свързва две от тях, дава или грешка за аргумент, или стойност, която опцията не е очаквала.

Докажете, че прекъсването на реда е истинско

Редакторите пренасят за показване. Някои също вмъкват твърди прекъсвания при поставяне, а други не, така че един и същ визуален резултат може да идва от два много различни файла. Покажете краищата на редовете и пребройте редовете, преди да промените нещо. Измерването струва една команда; гадането струва една вечер.

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

В първия изход всяко истинско прекъсване на ред се показва като маркер $, така че пренесен, но неразделен ред не показва маркер там, където вашият екран пренася. Втората команда отпечатва номерирани редове, което е най-бързият начин да сравните това, което парсерът съобщава, с това, което файлът съдържа.

Допълнителните интервали също не създават директива. Отстъпът е козметичен и ред, който започва с интервал, остава същата единствена опция. Ако съобщението за грешка посочва номер на ред, прочетете точно този ред, а не абзаца, към който принадлежи.

Цитирайте път, не списък от директиви

Кавичките съществуват за аргументи с интервали, не за групиране на опции. Път до сертификат с интервал се нуждае от собствени кавички; две директиви, споделящи една двойка кавички, все още са един повреден ред.

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

Проверете имената на опциите едновременно с оформлението, защото свързан ред може да произведе правдоподобно изглеждащ токен, който никога не е съществувал. Директивата за порт е port; профил, който използва нещо друго за същата идея, ще се провали дори след коригиране на границите на редовете. Когато дадено име изглежда непознато, сравнете го със списъка с опции за версията, която изпълнявате, а не с пример от форум.

Пазете вградените блокове като блокове

Профилите могат да носят сертификати и ключове вградени, а тези блокове са данни, не конфигурация. Редовете PEM вътре в блок не са опции, които да се изравняват, преотстъпват или свързват, и маркерите на блока трябва да останат на собствените си редове.

Отнасяйте се към вградения блок като към непрозрачна област: коригирайте редовете с опции около него, оставете съдържанието му непокътнато байт по байт и никога не го поставяйте в публична тема за поддръжка. Ако инструмент за форматиране е преписал блока, възстановете го от вашата PKI, вместо да го поправяте на ръка.

Поправете най-малкия раздел, не шаблона

Изкушаващата поправка е да замените целия файл с конфигурация от урок, който „работи“. Това заменя един повреден ред с набор от промени в политиката, които никой не е прегледал: други DH параметри, настройки за компресия, избор на шифър, дублирани слушатели. Първоначалният проблем е малък и локален, а замяната не е нито едното, нито другото.

Копирайте профила в защитен работен файл, коригирайте границите на редовете в това копие и оставете обичайния собственик на услугата да го зареди. След това стартирайте екземпляра и прочетете първата грешка, ако има такава, от началото.

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

Когато етапът на разбор мине, следващият отказ ще бъде за файл, сертификат или шифър, а не за лексика, и това е истински напредък. Запазете работното копие и бележка на един ред за това какво е било свързано; същото поставяне ще се случи отново на някой друг в същия екип.

Подобни статии