Профіль, які раней запускаўся, цяпер завяршаецца памылкай опцый, а радок, які цытуе парсер, выглядае на экране цалкам разумна. Вось пастка: файл канфігурацыі — гэта спіс фізічных радкоў, у кожным адзін ключ опцыі і яго аргументы, і доўгі радок, перанесены рэдактарам, выглядае неадрозным ад двух радкоў, пакуль не паглядзіш на байты. Ні сетка, ні сертыфікат, ні тунэль у гэтым класе збояў не задзейнічаны. Два радкі, якія на экране выглядаюць аднолькава, могуць адрознівацца адным байтам.

Выконвайце праверкі ніжэй па парадку і спыніцеся на першай няўдалай. Кожная таннейшая за наступную, і кожная выключае іншае тлумачэнне.

Адзін радок — адна дырэктыва

Парсер чытае радок, бярэ першае слова як опцыю і лічыць рэшту аргументамі гэтай опцыі. Таму радок накшталт 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

Калі этап разбору пройдзены, наступная памылка будзе пра файл, сертыфікат або шыфр, а не пра лексіку, і гэта сапраўдны прагрэс. Захавайце рабочую копію і нататку ў адзін радок пра тое, што было злучана; тое самае ўстаўленне паўторыцца ў кагосьці іншага ў той самай камандзе.

Падобныя артыкулы