Настройки OpenVPN на роутере откатываются после перезагрузки: почините генератор
Прошивка, которая заново собирает конфигурацию OpenVPN при каждой загрузке, отбрасывает ваши правки. Исправьте хук генератора, затем сравните созданный файл после одной перезагрузки.
Прошивка потребительского роутера или NAS часто заново собирает конфигурацию OpenVPN при каждом запуске, поэтому добавленная вами директива живёт ровно до следующей загрузки. То же касается ключей, введённых в веб-форму, где сохранённое значение может вернуться искажённым после сохранения. Ни один из этих симптомов не означает, что изменение отклонено. Это означает, что правка попала в файл, который прошивка считает выходным, а постоянное место находится на шаг раньше в последовательности загрузки.
Почему изменённый файл создаётся заново
Стартовый скрипт собирает конфигурацию сервера из шаблона и затем запускает демон, из-за чего отрисованный файл становится артефактом сборки, а не источником. Всё, что добавлено после запуска, невидимо для следующего запуска этого скрипта. Второй образец тоньше: ввод ключа и сертификата в веб-интерфейсе хранится в экранированном виде, и сохранение формы может протолкнуть этот экранированный текст в файл, который читает демон. В любом случае отрисованная конфигурация — неподходящее место для постоянного изменения.
Посмотрите, что записывает последовательность загрузки и когда. Ответ почти всегда — скрипт в каталоге init или автозапуска прошивки.
Вставьте директиву там, где скрипт собирает файл
Устройства QTS заново генерируют конфигурацию сервера OpenVPN внутри init-скрипта, который запускает демон, поэтому правку нужно делать там. Добавьте дописывание непосредственно перед командой запуска, а не редактируйте созданный файл.
sed -i '/daemon_mgr/i echo client-config-dir clientconfig >>/etc/openvpn/server.conf' /etc/init.d/vpn_openvpn.sh
grep -c client-config-dir /etc/openvpn/server.confПривяжите вставку к команде, которая не сдвинется, потому что номера строк меняются между сборками. Поскольку сам init-скрипт заменяется при загрузке, изменение нужно повторно выдавать из хука автозапуска прошивки при каждом старте системы. После одной перезагрузки посчитайте вхождения в созданном файле: одна строка означает, что заплатка сработала, а две — что хук выполняется больше одного раза. Двойной запуск исследуйте отдельно, потому что это не та же неисправность, что исчезнувшее изменение.
Почините форму, сохранившую экранированные ключи
На страницах в стиле Asus поля сертификата и ключа показывают экранированный текст, и сохранение после несвязанной правки может записать эти сущности обратно на диск. Работайте с декодированной копией и сохраняйте только один раз, когда все правки готовы.
openssl dhparam -out dh2048.pem 2048
grep -n "BEGIN DH PARAMETERS" dh2048.pemПри замене нового набора параметров вставляйте только полезную нагрузку base64, если метка просит тело ключа, а строки брони сохраняйте только когда поле ожидает полный блок PEM. Восстановление страницы, уже сохранённой в экранированном виде, обычно означает очистку затронутых полей и применение, что позволяет прошивке собрать их заново. Генерируйте всё выше 2048 бит на рабочей станции, потому что запас энтропии роутера делает операцию медленной и иногда ненадёжной. Храните файл параметров там, куда сможете добраться после сброса к заводским настройкам.
Перепроверьте после обновлений
Обновления прошивки заменяют init-скрипты и могут стереть каталог автозапуска, поэтому заплатку нужно переустановить и проверить заново. Сравните заново созданный файл с сохранённой копией и подтвердите, что директива присутствует ровно один раз. Значение, видимое в веб-интерфейсе, не доказывает, что демон его получил, потому что страница читает сохранённые поля. Запишите команду заплатки и версию прошивки в заметки об обслуживании, чтобы следующее обновление перенесло их дальше.
Затем подключите клиента и прочитайте в журнале сервера переданную опцию. Настройка, которая когда-либо существовала только в форме, — это настройка, которую никто не проверял.