ビルドホストに SSH で入り、そこで VPN クライアントを起動すると、セッションが応答しなくなります。何もクラッシュしておらず、明白な意味で設定が誤っているようにも見えません。クライアントはデフォルトルートを入れたため、ワークステーションへの応答はトンネルから出ていくようになり、そこではワークステーションのアドレスは到達可能ではありません。興味深いのは、この結果が予測可能だったことで、修正はクライアント起動前に書く一本のルートです。サーバーは一枚の NIC、ゲートウェイは 192.0.2.254、管理者は 203.0.113.9 から接続しているとします。

始める前に経路を記録する

ip route show default は現在のゲートウェイとインターフェースを表示し、ip route get 203.0.113.9 はカーネルがこのセッションにどのインターフェースと送信元アドレスを使うかを示します。両方の出力を保存してください。トンネルが上がった後も、この二つのコマンドは物理的な経路を説明しているはずで、もし代わりにトンネルを説明しているなら、そのセッションはすでに借り物の時間の上にあります。

重要なのはすでに確立した接続なので、新しいログインだけで検証しないでください。新しいセッションは、古いセッションがもう持たない状態によって一時的に成功することがあります。

アドレスはクライアント自身の設定で固定する

手で追加したルートは再起動で消え、クライアント自身のテーブル更新と競合するため、例外はテーブルが管理される場所に置きます。OpenVPN では net_gateway キーワードがトンネル前のゲートウェイに解決されるので、route 203.0.113.9 255.255.255.255 net_gateway はちょうど一つのアドレスを外側に保ちます。WireGuard は wg-quick 自身がルートを管理するため別の方法が必要で、Table = off を設定し、PostUp で例外を追加し、それを削除する対応する PostDown を用意します。どちらの形式も同じ意図を表し、どちらも例外を一つのアドレスに限定し、すべてに対してトンネルを弱めることはしません。

IPv6 でも同じ考え方で単一ホストのプレフィックスを使い、カプセル化された転送のケースも覚えておくべきで、トンネル自身の外側の接続が固定アドレスにあるなら、そのアドレスは運搬するトンネルの外側に留める必要があり、そうでなければクライアントは自分の転送を自分自身へルーティングしてしまいます。

あるいはメインテーブルを論点から外す

ホスト上の複数のサービスが通常の経路を保つ必要があるなら、メインテーブルの編集をやめてクライアントに専用のテーブルを与えます。veth ペアを持つネットワーク名前空間ならこれをきれいに行え、クライアントのデフォルトルートは別のスタックに住み、その中で起動したプロセスだけがトンネルを使います。ポリシールーティングなら一つの宛先について同様の場所に到達でき、一致するトラフィックを専用テーブルへ送り、そのデフォルトが依然として物理ゲートウェイを指すようにします。どちらの方法でもホストのメインテーブルに新しいデフォルトルートは残らず、その性質が SSH の応答を保ちます。

どちらも一本のホストルートより仕掛けが大きく、マシン上の一つ以上のものがトンネルを生き延びる必要があるなら、どちらも価値があります。

固定が失敗しうると想定する

現在のパブリックアドレスに紐づけたルートは、プロバイダーがそのアドレスを再割り当てした瞬間に壊れます。そのとき遠隔のサーバーには、そのアドレスに依存しない経路 — コンソール、二つ目の管理インターフェース、またはトンネルの外側に留まる踏み台ホスト — が必要です。

二つの安全策は十分で済みます。確認ログインが数分以内に現れなければクライアントを止めるウォッチドッグは締め出しを遅延に変え、変更中に開いたままにした二つ目の SSH セッションは、トンネルが上がっている間に例外が効いていることを証明します。キープアライブだけでは、経路がアイドルではなく消えているためここでは役に立たず、死を気づきやすくするだけです。

重要な順に検証する

トンネルを接続し、自分のアドレスへのルートが今も物理ゲートウェイから出ていることを確認してから、新しいセッションを開きます。新しいセッションが動いても古いセッションが死ぬなら、原因はルーティングではなくコネクショントラッキングかステートフルファイアウォールで、それは別の修正です。

固定したアドレスとそれを証明したコマンドを変更記録に書きます。そのホストで次にクライアントを起動する人には両方が必要で、そのころにはアドレスが変わっているかもしれません。

関連記事