OpenVPN-instellingen op de router vallen terug na herstart: repareer de generator
Firmware die zijn OpenVPN-configuratie bij elke start opnieuw opbouwt, gooit je wijzigingen weg. Patch de generator-haak en vergelijk daarna het gegenereerde bestand na één herstart.
Firmware op een consumentenrouter of NAS bouwt zijn OpenVPN-configuratie vaak bij elke start opnieuw op, dus een richtlijn die je toevoegt overleeft precies tot de volgende start. Hetzelfde geldt voor sleutels die in een webformulier worden getypt, waar de opgeslagen waarde na het opslaan verminkt terug kan komen. Geen van deze symptomen betekent dat de wijziging is geweigerd. Het betekent dat de wijziging in een bestand terechtkwam dat de firmware als uitvoer behandelt, en dat de blijvende plek één stap eerder in de opstartreeks ligt.
Waarom het bewerkte bestand opnieuw wordt gegenereerd
Een startscript stelt de serverconfiguratie samen uit een sjabloon en start daarna de daemon, waardoor het gerenderde bestand een build-artefact wordt in plaats van een bron. Alles wat na de start wordt toegevoegd, is onzichtbaar voor de volgende run van dat script. Het tweede patroon is subtieler: sleutel- en certificaatinvoer in de webinterface wordt in een geëscapete vorm opgeslagen, en het opslaan van het formulier kan die geëscapete tekst in het bestand duwen dat de daemon leest. Hoe dan ook, de gerenderde configuratie is de verkeerde plek voor een blijvende wijziging.
Kijk wat de opstartreeks schrijft en wanneer. Het antwoord is bijna altijd een script in de init- of autorun-map van de firmware.
Voeg de richtlijn in waar het script het bestand bouwt
QTS-apparaten regenereren de OpenVPN-serverconfiguratie in het init-script dat de daemon start, dus de wijziging moet daar gebeuren. Voeg de toevoeging direct vóór het startcommando toe in plaats van het gegenereerde bestand te bewerken.
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.confVeranker de invoeging op een commando dat niet verschuift, omdat regelnummers tussen builds veranderen. Omdat het init-script zelf tijdens de start wordt vervangen, moet de wijziging bij elke systeemstart opnieuw worden uitgegeven vanuit de autorun-haak van de firmware. Tel na één herstart de voorkomens in het gegenereerde bestand: één regel betekent dat de patch werkte, terwijl twee betekenen dat de haak meer dan één keer draait. Onderzoek de dubbele run apart, want dat is niet dezelfde storing als een wijziging die verdween.
Repareer een formulier dat geëscapete sleutels opsloeg
Op pagina's in Asus-stijl tonen de certificaat- en sleutelvelden geëscapete tekst, en opslaan na een ongerelateerde aanpassing kan die entiteiten terug naar de schijf schrijven. Werk vanuit een gedecodeerde kopie en sla slechts één keer op, wanneer alle wijzigingen klaar zijn.
openssl dhparam -out dh2048.pem 2048
grep -n "BEGIN DH PARAMETERS" dh2048.pemBij het vervangen van een nieuwe parameterset plak je alleen de base64-payload als het label om het sleutellichaam vraagt, en behoud je de armor-regels alleen wanneer het veld een volledig PEM-blok verwacht. Een pagina herstellen die al in geëscapete vorm is opgeslagen betekent meestal de betrokken invoervelden leegmaken en toepassen, waardoor de firmware ze opnieuw kan opbouwen. Genereer alles boven 2048 bits op een werkstation, omdat de entropievoorziening van de router de bewerking traag en soms onbetrouwbaar maakt. Bewaar het parameterbestand op een plek die je na een fabrieksreset kunt bereiken.
Controleer opnieuw na upgrades
Firmware-updates vervangen init-scripts en kunnen de autorun-map wissen, dus de patch moet opnieuw worden geïnstalleerd en getest. Vergelijk het opnieuw gegenereerde bestand met de kopie die je bewaarde en bevestig dat de richtlijn precies één keer aanwezig is. Een waarde die zichtbaar is in de webinterface is geen bewijs dat de daemon die heeft ontvangen, omdat de pagina opgeslagen velden leest. Schrijf het patchcommando en de firmwareversie in de onderhoudsnotities, zodat de volgende update ze meeneemt.
Verbind daarna een client en lees de serverlog voor de gepushte optie. Een instelling die ooit alleen in een formulier bestond, is een instelling die niemand heeft getest.