OpenVPN UDP 向け Nginx の stream リレー:何が変わるか
UDP は HTTP の location には収まらない。stream レイヤーへ移し、VPN に合わせてセッションのタイムアウトを決め、送信元がプロキシになることを見込んでおく。
クライアントは UDP に設定され、Nginx サーバーには VPN のポートを指す location ブロックがあり、それでも何も届かない。これは想定どおりだ:HTTP の location は UDP データグラムを運べない、しかしフロントエンドの名称が何であれ同じだ。Nginx にはこの用途の stream リスナーが必要で、設定をそちらへ移したら、次は別の詳細群がセッションが生き残るかどうかを決める。
アドレスより先にプロキシ層がある
Nginx の stream モジュールは HTTP を解析せずに TCP と UDP をプロキシする。HTTP モジュールはリクエスト行、ヘッダー、レスポンスを期待するが、それらはどれもネイティブな OpenVPN データグラムには含まれない。したがって層の選択が最初の判断であり、リスナーが IPv4 か IPv6 かとは独立している。
TCP の OpenVPN で動くように見える設定は、UDP の場合について何も語らない。ここではトランスポートがプロトコルの一部であり、配備の細部ではない。
リスナーとバックエンド
nginx -V 2>&1 | tr ' ' '\n' | grep stream
stream {
server {
listen [::]:1194 udp reuseport;
proxy_pass [2001:db8::20]:1194;
}
}
何かを編集する前に、ビルドに stream モジュールが含まれていることを確認する:配布パッケージでは別モジュールに分割されていることがあり、モジュールがなければトンネルではなく設定エラーになる。ブロックはメインの設定コンテキストに置き、http の内側には置かず、ドキュメント用アドレスは実際のバックエンドに置き換える。
両方の経路と両方のファイアウォールがデータグラムを許可する必要がある:リスナーまでの経路と、プロキシからバックエンドまでの経路だ。IPv6 のリスナーは IPv4 の経路を作らないので、一部のクライアントがまだ IPv4 を使うなら、そのリスナーは独立した項目として独自のテストを持つ。バックエンド自身のファイアウォールは、手元のノート PC ではなくプロキシのアドレスから確認する。
セッションのタイムアウトはリクエストのタイムアウトではない
stream プロキシは UDP セッションの状態を保持し、自身のタイムアウトと応答設定に従って破棄する。DNS リレーからコピーした短いタイムアウトは、何時間もデータグラムを交換する前提の VPN には合わず、障害は起動を拒む接続ではなく静かに死ぬ接続として現れる。
配備で有効な proxy_timeout と応答数の設定を読み、VPN が実際に使う keepalive の挙動と比べる。別々の人が別々のファイルに書いた二つの数値は、動作しているシステムの正常な状態だ。一度も比較されなかった二つの数値は、断続的に不調になるシステムの正常な状態だ。比較が一度きり、昼光の下で済むように、両方をサービス記録に書く。
リレーが変えるもの、変えないもの
stream プロキシは OpenVPN の TLS 制御チャネルを終端せず、HTTPS に変換もしない。バックエンドは VPN サービスのままであり、証明書の関係はクライアントとそのサービスの間に残る。意図したバックエンドの同一性を保つのは、依然としてクライアントとサーバーの仕事だ。
通常のプロキシは、バックエンドが見る送信元アドレスも変える。ログにはプロキシが現れ、VPN サーバーの IP ベースのアクセス規則はクライアントのアドレスではなくそのアドレスを評価する。送信元を透過的に保つのは別個のルーティングと権限の設計であり、リスナーに udp を加えることから自動的に得られるものではない。クライアントのアドレスに依存するポリシーを書く前に、それを計画しておく。
ポートではなくクライアントから検証する
UDP ポートが開いているというローカルな確認は、リスナーが存在することを示すだけだ。クライアントがそこを通じて認証できることや、通信を続けられることは示さない。承認済みのクライアントから実際の接続を完了し、セッションが意味を持つだけの時間維持されることを確認する。
Nginx が UDP を扱えないという報告の根拠が、代わりに単純なリレーツールが動いたことだとしても、その二つの事実は無関係だ。そのツールはバックエンドが応答することを示しただけで、フロントエンドが何を支えるかについては何も語っていない。両方が真であり得るが、この配備のための設定はそのうち一つだけだ。