client-config-dir се игнорира, след като OpenVPN стана услуга
Относителен client-config-dir се разрешава спрямо работната директория на демона. Прочетете unit файла, проверете правата по пътя, после потвърдете търсенето в журнала.
Тунелът се вдига и клиентът се свързва, но фиксираният адрес и изпратените маршрути, които сте задали за този конкретен потребител, липсват. В журнала не пише “file not found” и точно това кара хората да преиздават сертификати. В повечето такива случаи демонът работи от друга директория, различна от обвивката, в която сте тествали, и client-config-dir никога не е бил разрешен по начина, който сте предполагали. Поправката е корекция на пътя, а не нулиране на идентификационни данни.
Прочетете unit файла, преди да пипате конфигурацията
Започнете с процеса, който реално работи, а не с файла, който сте редактирали. Попитайте systemd за командния ред, работната директория и акаунта, към който преминава. Тези три отговора обясняват повечето откази в този клас:
systemctl show openvpn-server@server -p ExecStart -p WorkingDirectory -p User -p RootDirectoryПразна WorkingDirectory означава, че unit файлът стартира в /, затова относителен client-config-dir ccd се търси в /ccd. Тази директория почти никога не съществува и демонът не смята липсата ѝ за фатална.
Сравнете това с интерактивното стартиране, което сте използвали при тестването, където текущата директория на обвивката ви вероятно е била конфигурационната. Същият файл, същите ключови думи, два различни резултата.
Спрямо какво се разрешава относителен път
Ключовата дума се разрешава спрямо работната директория на процеса към момента на използване на опцията. Тя не значи “до конфигурационния файл, който подадох с --config”. OpenVPN с готовност ще прочете конфигурация от абсолютен път и пак ще разреши относителните стойности другаде, а точно това е капанът тук. Ръководството на OpenVPN 2.6 посочва правилото при --client-config-dir и отново при --cd.
cd променя този контекст преди другите файлове да бъдат прочетени, така че unit файл, който задава cd /etc/openvpn/server и след това client-config-dir ccd, се разрешава до /etc/openvpn/server/ccd. Ако добавите cd, проверете реда на директивите и помнете, че той засяга всяка друга относителна референция в същия файл.
Проверете пътя като акаунта на демона
Пътят може да е правилен и въпреки това нечетим. След отпадането на привилегиите демонът вече не е root, затова всяка родителска директория се нуждае от право за търсене за този акаунт, а самият клиентски файл — от право за четене. Един липсващ бит за изпълнение на родителска директория е достатъчен, за да скрие файла, и грешката се проявява само като клиент, който тихо получава пула по подразбиране.
namei извежда правата на всеки компонент по ред, което е по-бързо от проверка на директориите една по една:
namei -l /etc/openvpn/server/ccd/client1След това тествайте четенето като акаунта на услугата, а не като себе си:
runuser -u openvpn -- test -r /etc/openvpn/server/ccd/client1 && echo readableАко unit файлът използва chroot, директорията трябва да съществува вътре в затвора, а пътят в конфигурацията се интерпретира след прилагане на chroot. Файл, който е налице на хоста извън затвора, е невидим отвътре.
Потвърдете търсенето вместо да гадаете
Вдигнете нивото на журнала за едно рестартиране и прочетете какво казва сървърът за опциите за конкретен клиент. При verb 4 демонът отчита импортираната конфигурация за всеки клиент, така че липсващият ред е пряко доказателство, че за тази връзка не е прочетен никакъв файл.
openvpn --config /etc/openvpn/server.conf --verb 4 --client-config-dir /etc/openvpn/server/ccdСтартирайте това на преден план на друг порт и свържете един клиент. Така systemd изчезва напълно от картината: ако отменящите настройки се появят тук, но не и под услугата, разликата е в контекста на unit файла, не във файла.
Решете какво трябва да става, когато няма съвпадащ файл. Без ccd-exclusive клиентът се допуска само с глобалните настройки на пула и това е тихият отказ, описан по-горе. С нея липсващият файл става отказана връзка, а такъв отказ е по-лесен за забелязване, но по-труден за отстраняване под натоварване.
Поправете, рестартирайте, проверете
Направете директорията абсолютна в конфигурацията и я оставете така. Относителните пътища са безопасни само когато unit файлът фиксира работната директория, а фиксирането е допълнителна движеща се част, която някой по-късно ще премахне.
client-config-dir /etc/openvpn/server/ccd
ccd-exclusiveРестартирайте инстанцията, свържете отново един известен клиент и прочетете адреса, който е получил, заедно с изпратените към него маршрути. Ако адресът съвпада с реда ifconfig-push във файла на този клиент, търсенето е проработило. Ако клиентът все още попада в общия пул, върнете се към броя редове в журнала: нула импортирания означава, че пътят или идентичността са грешни, едно импортиране с грешно съдържание означава, че редактирате друг файл, различен от този, който демонът чете.
Върнете се назад, като възстановите предишния unit файл и конфигурацията заедно, после рестартирайте. Сертификатите не е нужно да се преиздават за нищо от това, а третирането на проблем с директория като проблем с идентификационни данни е начинът, по който петминутна поправка се превръща в прозорец за поддръжка.