OpenVPN が接続済みと言うのに、通信が一切動かない。この一文は少なくとも五つの無関係な障害を覆っている。どの層が失敗しているかを知る前にファイアウォールのルールを編集すると、未知が増え、次の技術者に混乱を残す。代わりにプロセスの外側へ向かって作業しよう。以下の各手順は、どれも一つの段階を片付けるか、パケットが死ぬ場所を狭めるかのどちらかだからだ。ここでは順序が大事で、どのアドレスがバインドされているかを知る前に取ったキャプチャは何かを証明するが、必要なものは証明しない。

ソケットはバインドされているか、されていないか

アクティブだと報告するサービスでも、意図していないアドレスやトランスポートにバインドされていることがある。ソケット自体に問い合わせよう。ss -lunp は UDP のリスナーを、ss -ltnp は TCP のリスナーを一覧し、読む価値があるのはローカルアドレスの列で、状態ではない。

空の応答は通常、起動後にプロセスが終了したか、別の設定ファイルを読み込んだか、ダイヤルされているアドレスとは別のアドレスで待ち受けているかの、三つのうちのどれかを意味する。

ss -lunp | grep 1194
ss -ltnp | grep 1194

local ディレクティブはリスナーを単一のアドレスに固定する。そのため同じホストの別の場所を狙ったクライアントは拒否されるが、外から見るとサービスは健全なままに見える。インスタンス名が 決して編集していないファイルを指すこともあり、これは二つのプロファイルを並行して動かすホストで起きる。

外側のパケットを取得し、トンネルではない

物理インターフェースと実際のポートで絞り込み、自分のインターフェースに置き換える。tcpdump -ni eth0 udp port 1194。何も戻ってこない外向きのパケットは、上流にあるものを指す。プロバイダー側のフィルタリング、NAT 装置、あるいは思っているのとは違うリモートアドレスだ。両方向とも沈黙しているなら、クライアントのルーティングかローカルのファイアウォールを指す。トンネルが進まないのに応答が届くなら、コントロールチャネル、つまり鍵や暗号の不一致を指し、フィルタリングではない。

両方向を取得し、ファイルは短く保つ。長いキャプチャは興味深い三秒を埋もれさせ、答えはほとんど常に最初のやり取りにある。

まずカウンター、トレースは嘘をつくときだけ

カウンターから始めよう、何のコストもかからないからだ。nft list ruleset か iptables -L -n -v が、ここで重要な唯一の問い、ルールは一致したかに答える。順序が結果を決める。最初の一致が勝つため、後にある ACCEPT より前に広い DROP を置くとその ACCEPT は死に、ルールを追加してもほとんど何も直らない。

所有権も人をつまずかせる。カーネルはローカルで生成されたパケットをソケットを開いたプロセスに帰属させ、OpenVPN は通常 root で動く。そのため通常のユーザー ID に紐づいたルールはトンネル自身の通信を決して見ない。ルールが間違っていると判断する前に、所有する UID を確認しよう。

カウンターが曖昧なままだときだけ、ログは騒がしさに見合い、しかも狭い範囲に限る。レート制限をかけ、ログ行に接頭辞を付ける iptables ルールか、nft monitor trace を動かしたまま meta nftrace set 1 を持つ nftables ルールだ。トレースは、パケットを受け入れたか落としたチェーンとルールを名指しする。後で両方とも外し、ペイロードのログは取らない。

トランスポートも確認しよう。TCP に限定されたファイアウォールサービスは、その番号の UDP リスナーについて何も語らない。そのため正しく読めるルールでも、すべてのパケットを落とすことがある。

ルーティングと戻り道

受け入れられたパケットがそれでも消えるなら、宛先への経路を調べる必要がある。ip route get は一つのアドレスに選ばれたルートを報告し、逆経路フィルタリングはメインテーブルが決して選ばないインターフェースから届く応答を落とすことがある。症状はファイアウォールによる破棄とまったく同じに見える。だからこの確認は、別の NAT ルールより先に来る。

ゲートウェイでは input チェーンではなく、転送と forward チェーンを調べる。そのうえで、遠い側が送信元アドレスへ到達する方法を知っていることを確認する。戻ってこない外向きの経路は、どちらの場合も沈黙だからだ。

記録が語るべきこと

変更ごとに、試した段階、読んだ証拠、そしてその両側のカウンター値を記す。その記録があるからこそ、「今は動く」が次のレビューでも生き残る。

二つの近道が記録を正直に保つ。ホストを一度も出ていないパケットは、どこか別のルールで落とされたはずがない。遠い側の設定がどれほど説得力に見えてもだ。出て戻ってきたパケットは、問いをネットワーク層より上へ移し、そこではファイアウォールのカウンターはもう何も語れない。

関連記事