依存サービスを tun0.device につなぐのは、トンネルを購読しているように見えて、そうではありません。デバイスユニットが反映するのはインターフェースの存在であり、それは接続が失敗し、その後に再接続しても真のままです。そのためサービスは誤った瞬間に動くか、まったく動かないかになります。インターフェースがその間に消えたかどうかで変わります。本当に気にしているイベントを表すフックは、OpenVPN が呼ぶフックであり、systemd が推測するものではありません。

トリガーを選ぶ前に、サービスがどの条件を必要とするかを決めてください。三つの候補は互換ではありません。

デバイスユニットが実際に追うもの

systemd はカーネルのネットワークインターフェースの見方からデバイスユニットを作るため、インターフェースが現れると tun0.device はアクティブになり、削除されると非アクティブになります。persist-tun では、ソフト再起動がインターフェースをそのまま残すので、ユニットは決してフラップせず、それにバインドされた何も起動しません。永続化がなくても、ユニットはルート、DNS、あるいは遠端が応答するかについて何も語りません。

そのため「VPN の準備ができた」の代理としては不適切です。ローカルアドレスだけを必要とするリスナーはインターフェースの存在で満足できるかもしれませんが、遠隔ネットワーク上のアプリケーションを呼ぶサービスにはルートと到達性が必要で、デバイスユニットはそれを表現できません。

up、route-up、up-restart はそれぞれ意味が違う

up は TUN/TAP デバイスが開かれ、インターフェースが設定された後に実行されます。これは割り当てられたアドレスをバインドするリスナーにとって正しいタイミングです。route-up はルートがインストールされた後に実行され、設定されたルート遅延の影響を受け、ルート段階の完了を必要とする作業に適しています。どちらも遠隔アプリケーションが応答することを証明しません。両者の選択は、サービスが何を必要とするかという問いであり、どちらのフックがより完成して聞こえるかではありません。

persist-tun では再起動がデバイスを再利用するため、up-restart が設定されていない限り up は再実行されません。このオプションは文書化された再起動ライフサイクル用に up スクリプトを有効にし、その環境は 初回起動と比べて縮小されています。完全な環境を前提とするスクリプトは、最初の接続では動き、次の接続で失敗します。

アクションを待たずに投げる

systemctl restart を同期的に呼ぶフックは、順序がトンネルを待つユニットとデッドロックする可能性があります。systemctl --no-block try-restart vpn-dependent.service はジョブをキューに入れて戻るため、フックが反応していた接続をブロックしません。try-restart は実行中のユニットにだけ作用し、restart は非アクティブなユニットも起動します。習慣ではなく意図して選んでください。

キューに入れることは検証ではありません。ジョブが受け入れられた時点でフックは成功を返すため、確認は対象ユニットのジャーナルか、実際のリスナー状態で行う必要があります。

再起動ポリシーはユニットにあり、フックにはない

RemainAfterExit=yes を備えた oneshot ユニットはコマンド終了後もアクティブのままで、二度目の起動要求は何もしません。systemd はすでに起動済みとみなすからです。これは設計で扱うべき性質であり、起動呼び出しの繰り返しで回避する欠陥ではありません。アクションを接続ごとに実行する必要があるなら、ユニットはそれを許す形である必要があります。

After= はユニットを順序付けし、BindsTo= は寿命を結び付けますが、どちらも「VPN が再接続するたびにこれを再起動せよ」という意味ではありません。トンネルにバインドされたユニットはトンネルが止まれば止まります。トンネルが戻っても、何かが再び起動しない限り、自ら再起動はしません。

一度ではなく三度の再接続を試す

コールドブート、クライアントの完全な再起動、ソフト再接続はそれぞれ別の経路を試します。ソフト再接続こそが、欠けた up-restart、縮小された環境、あるいは非アクティブにならなかったデバイスユニットを明らかにします。三つすべてを実行し、両方向を確認してください。トンネルが上がるとサービスは動き、Wi-Fi ローミングのような無関係なリンク変更では再起動しません。

依存サービスがあなた自身の管理アクセスを運ぶときは、独立した復旧経路を保ってください。接続に使っているものを再起動するフックは、あなたを締め出す変更になり得ます。

関連記事