Една директива OpenVPN на ред и защо пренасянето на редове лъже
Мекото пренасяне на екрана не е нов ред във файла. Проверете истинските прекъсвания на редове, преди да замените повреден раздел с чужд шаблон.
Профил, който преди се стартираше, сега се проваля с грешка за опции, а редът, който парсерът цитира, изглежда напълно разумно на екрана. Това е капанът: конфигурационният файл е списък от физически редове, всеки с една ключова дума за опция и нейните аргументи, а дълъг ред, пренесен от редактор, изглежда идентичен с два реда, докато не погледнете байтовете. Нищо от мрежата, сертификата или тунела не участва в този клас откази. Два реда, които изглеждат еднакво на екрана, могат да се различават с един байт.
Изпълнете проверките по-долу по ред и спрете на първата, която се провали. Всяка е по-евтина от следващата и всяка изключва различно обяснение.
Един ред, една директива
Парсерът чете ред, взема първата дума като опция и третира остатъка като аргументи на тази опция. Затова ред като 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
Когато етапът на разбор мине, следващият отказ ще бъде за файл, сертификат или шифър, а не за лексика, и това е истински напредък. Запазете работното копие и бележка на един ред за това какво е било свързано; същото поставяне ще се случи отново на някой друг в същия екип.