Jedna dyrektywa OpenVPN na wiersz i dlaczego zawijanie kłamie
Miękko zawinięty ekran to nie nowy wiersz w pliku. Sprawdź rzeczywiste podziały wierszy, zanim zastąpisz uszkodzoną sekcję cudzym szablonem.
Profil, który wcześniej startował, teraz zawodzi z błędem opcji, a wiersz cytowany przez parser wygląda na ekranie zupełnie rozsądnie. To jest pułapka: plik konfiguracyjny to lista fizycznych wierszy, każdy zawiera jedno słowo kluczowe opcji i jej argumenty, a długi wiersz zawijany przez edytor wygląda identycznie jak dwa wiersze, dopóki nie spojrzysz na bajty. Nic w sieci, certyfikacie ani tunelu nie bierze udziału w tej klasie błędu. Dwa wiersze, które na ekranie wyglądają identycznie, mogą różnić się jednym bajtem.
Przejdź kontrole poniżej po kolei i zatrzymaj się na pierwszej, która zawiedzie. Każda jest tańsza od następnej i każda wyklucza inne wyjaśnienie.
Jeden wiersz, jedna dyrektywa
Parser czyta wiersz, bierze pierwsze słowo jako opcję i traktuje resztę jako argumenty tej opcji. Wiersz taki jak cert server.crt port 1194 nie jest więc dwiema instrukcjami po sobie. To jedna opcja cert z trzema argumentami, a trzeci nie jest nazwą pliku, którą opcja akceptuje. Czytanie błędu jako brakującego nowego wiersza jest słuszne; czytanie go jako brakującej dyrektywy już nie.
# malformed: one option, three arguments
cert server.crt port 1194
# intended: two options, one argument each
cert server.crt
port 1194
Te dwa poprawione wiersze to fragment, nie konfiguracja. Istnieją, aby pokazać, gdzie należy granica. Każda zwykła dyrektywa w profilu podlega tej samej regule, a wiersz łączący dwie z nich daje albo błąd argumentu, albo wartość, której opcja się nie spodziewała.
Udowodnij, że podział wiersza jest rzeczywisty
Edytory zawijają na potrzeby wyświetlania. Niektóre wstawiają też twarde podziały przy wklejaniu, a inne nie, więc ten sam efekt wizualny może pochodzić z dwóch bardzo różnych plików. Pokaż końce wierszy i policz wiersze, zanim cokolwiek zmienisz. Mierzenie kosztuje jedno polecenie; zgadywanie kosztuje wieczór.
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
W pierwszym wyniku każdy prawdziwy koniec wiersza pojawia się jako znacznik $, więc zawinięty, ale niepodzielony wiersz nie pokazuje żadnego znacznika tam, gdzie zawija się ekran. Drugie polecenie wypisuje ponumerowane wiersze, co jest najszybszym sposobem porównania tego, co zgłasza parser, z tym, co zawiera plik.
Dodatkowe spacje też nie tworzą dyrektywy. Wcięcie jest kosmetyczne, a wiersz zaczynający się od białego znaku to nadal ta sama pojedyncza opcja. Jeśli komunikat o błędzie wskazuje numer wiersza, czytaj dokładnie ten wiersz, a nie akapit, do którego należy.
Cytuj ścieżkę, nie listę dyrektyw
Cudzysłowy istnieją dla argumentów zawierających spacje, nie do grupowania opcji. Ścieżka certyfikatu ze spacją potrzebuje własnych cudzysłowów; dwie dyrektywy dzielące jedną parę cudzysłowów to nadal jeden uszkodzony wiersz.
cert "/etc/openvpn/pki/lab certs/server.crt"
key "/etc/openvpn/pki/lab certs/server.key"
Sprawdź nazwy opcji jednocześnie z układem, ponieważ połączony wiersz może utworzyć wiarygodnie wyglądający token, który nigdy nie istniał. Dyrektywa portu to port; profil, który używa czegoś innego dla tej samej idei, zawiedzie nawet po poprawieniu granic wierszy. Gdy nazwa wygląda nieznajomo, porównaj ją z listą opcji dla uruchamianej wersji, a nie z przykładem z forum.
Bloki wbudowane zostaw jako bloki
Profile mogą zawierać certyfikaty i klucze wbudowane, a te bloki są danymi, nie konfiguracją. Wiersze PEM wewnątrz bloku nie są opcjami do spłaszczania, ponownego wcinania ani łączenia, a znaczniki bloku muszą pozostać we własnych wierszach.
Traktuj blok wbudowany jako nieprzezroczysty obszar: popraw wiersze opcji wokół niego, pozostaw jego zawartość bajt po bajcie w spokoju i nigdy nie wklejaj go do publicznego wątku pomocy. Jeśli blok przepisało narzędzie do formatowania, przywróć go z twojej PKI, zamiast naprawiać go ręcznie.
Napraw najmniejszą sekcję, nie szablon
Kusząca naprawa to zastąpienie całego pliku konfiguracją z poradnika, który „działa”. To wymienia jeden uszkodzony wiersz na zestaw zmian polityki, których nikt nie przejrzał: inne parametry DH, ustawienia kompresji, wybór szyfru, zduplikowani słuchacze. Pierwotny problem jest mały i lokalny, a zamiana nie jest ani jednym, ani drugim.
Skopiuj profil do chronionego pliku roboczego, popraw granice wierszy w tej kopii i pozwól zwykłemu właścicielowi usługi ją załadować. Następnie uruchom instancję i przeczytaj pierwszy błąd, jeśli jakiś jest, od początku.
openvpn --config /etc/openvpn/server/lab.conf --verb 3 --log /tmp/parse.log
grep -n 'Options error' /tmp/parse.log
Gdy etap parsowania przejdzie, następny błąd będzie dotyczył pliku, certyfikatu lub szyfru, a nie słownictwa, i to jest prawdziwy postęp. Zachowaj kopię roboczą i jednozdaniową notatkę o tym, co zostało połączone; to samo wklejenie zdarzy się ponownie komuś innemu w tym samym zespole.