Linux の VPN トンネルが本当に稼働しているか確認する方法
インターフェースのフラグ、ルート検索、テーブル 220、ハンドシェイクのタイムスタンプは、それぞれ別の問いに答えます。スクリプトの各手順は、その前提を証明する検査に結び付けてください。
Cron はまったく健康な VPN を十分おきに再起動し、同じジョブは死んだ VPN を一週間動かしたままにします。どちらの失敗も、「稼働中」を一つの事実として扱うことから来ますが、実際には少なくとも四つあります。デバイスは管理上は有効で、経路も正しく、暗号化も完全なのに、有用なものを何も運ばないことがあります。まず観測を分ければ、検査はほとんど自動的に書けます。
リンクのフラグが語るのはデバイスであり、経路ではありません
誰もがコピーする検査は、すべてゼロのハードウェアアドレスを探します。この小細工は一部のドライバーでは本物のインターフェースをプレースホルダーから分けますが、そもそも tun デバイスには報告できる MAC がないため、それ以外では何も証明しません。 ip -brief link show tun0 代わりにフラグを示します: UP は管理者がデバイスを有効にしたことを意味し、LOWER_UP はドライバーがリンクを使用可能と見なしていることを意味します。両方を合わせて読むと、デバイスが存在し、管理上停止していないことが分かります。どちらも、パケットに行き先があることは告げません。
OpenVPN ルートがインストールされる前に自身の tun デバイスを作るため、何も経路設定されていないのにフラグは完璧に見えることがあります。これらは前提条件として扱い、決して答えとして扱わないでください。
パケットがどこへ行くかを尋ねる
ルート検索は、フラグには答えられない問いに答えます。 ip route get 10.8.0.1 from 10.8.0.2 はインターフェース、送信元アドレス、カーネルが使うテーブルを示し、これは分割トンネルを照合すべきまさにその相手です。送信元アドレスがなければ別の問いになり、ポリシールーティングでは送信元ごとに答えが変わります。あなたの通信が使うのと同じ規則に問い合わせるため、これが最も安価で誠実な試験です。
WireGuard の場合はハンドシェイクも加えます。 wg show はピアごとに最終ハンドシェイクのタイムスタンプを表示し、進まなくなったタイムスタンプは、インターフェースのフラグが何を言おうとピアが消えたことを意味します。最近のハンドシェイクがない設定済みインターフェースは、自作監視で最も多い誤検知の一つです。
テーブル 220 が語る IPsec の物語
strongSwan はルートのインストールが有効なとき、交渉されたセレクターの経路をテーブル 220 に入れます。 ip route list table 220 したがって、交渉済みと経路設定済みを切り分けます:読み込まれた接続の隣に空のテーブルがあれば、IKE と CHILD の SA は上がったものの、そこへ通信が向かっていないことを意味します。確認するのは ip xfrm state も同時にです(インストール済みのセキュリティアソシエーションと、その端点が一覧されるからです)。
トラップポリシーは気をつけるべき事例です。通信を経路設定する代わりに興味深い通信を待つので、何かがトンネルを起動するまでテーブルは空のままです。
マネージャーの状態とデーモンの状態は別の一覧です
NetworkManager は自分が所有する接続だけを一覧します。 nmcli -t -f NAME,TYPE connection show --active は、wg-quick や OpenVPN デーモンが直接起動したトンネルについては何も返しません。
この区別は、スクリプトが二つのマネージャーのどちらに問うべきかを決めるときに効きます。このホストで実際にトンネルを所有しているほうを選び、もう一方の沈黙は無視してください。両方あるなら、どちらが権威かを決めて二つ目を無効にします(一つのインターフェースで経路を書き換える二つのマネージャーは、誰も再現できない障害を生むからです)。欠けたエントリーはマネージャーについての情報であり、トンネルについてではありません。
次の手順を、それが必要とする検査に結び付ける
UDP にはハンドシェイクがないため、nc -u がパケットの出た瞬間に成功しても、UDP ポートを探ったところで準備状態については何も証明できません。次の手順が実際に消費するものを検査してください:転送ポートへの TCP 接続、トンネル内のホストへの要求、そこでしか解決しない名前。待ち時間はタイムアウトと試行回数で区切り、尽きたら大きな声で失敗させます。
クライアントがフックを提供するなら、ポーリングよりフックが勝ります。OpenVPN の --up と --down のスクリプトはインターフェースの状態変化後に走るので、競合は完全に消えますが、デーモンが保持した権限で走ります。OpenVPN が user と group によって非特権アカウントに降格していれば、フックはそのアカウントとして動きます。システムサービスを再起動するには、まさにそのコマンドを許可する sudo が必要になります。再試行は cron ループではなくサービス管理者に任せてください:起動回数の上限を伴う範囲付きの再起動ポリシーは壊れたトンネルを浮かび上がらせますが、無制限のループはそれをいつまでも隠します。