以前は起動していたプロファイルが、いまはオプションエラーで失敗し、パーサーが引用する行は画面上では完全に妥当に見えます。これが罠です。設定ファイルは物理行のリストであり、各行は一つのオプションキーワードとその引数を持ち、エディタが折り返した長い行は、バイトを見るまで二行と見分けがつきません。ネットワーク、証明書、トンネルはこの種の失敗には関与しません。画面上で同じに見える二行が一バイトだけ異なることがあります。

以下のチェックを順番に行い、最初に失敗したところで止めてください。どれも次より安く、それぞれが別の説明を排除します。

一行に一つのディレクティブ

パーサーは一行を読み、最初の単語をオプションとして取り、残りをそのオプションの引数として扱います。したがって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

パース段階を通過すれば、次の失敗は語彙ではなくファイル、証明書、暗号に関するものになり、それは本当の前進です。作業コピーと、何を連結したかの一行メモを残してください。同じ貼り付けは同じチームの別の人にも再び起こります。

関連記事