VPNトンネルがファイアウォールを通過できるかは、クライアントが接続するポートと、ペイロードを運ぶプロトコルという二つの別々のルールで決まります。前者だけを開けるとトンネルは認証まで進み、その後にデータが流れません。最小構成は、PPTPならTCPポート一つとGRE、L2TP/IPsecとIKEv2ならUDPポート二つとESP、SSTP・OpenVPN・WireGuardならそれぞれ一つのポートです。残りは方向、状態追跡、NATで決まります。

クライアントが接続するポートから始める

どの方式にもクライアントが最初に接続する入口があり、許可ルールはその入口を指定しなければなりません。PPTPクライアントはTCP 1723に接続します。L2TP/IPsecはUDP 500でIKEを開始し、NATトラバーサルを使うとUDP 4500へ移り、L2TPフレーム自体はトンネル内のUDP 1701に載ります。SSTPはセッションをTCP 443のTLSで包み、IKEv2はUDP 500と4500で交渉し、OpenVPNは既定でUDP 1194を使いますがTCP 443へ移されることが多く、WireGuardはUDP 51820で待ち受けます。

FamilyRule to add on the gatewayTypical mistake
WireGuardUDP port from ListenPort, for the peer addressAssuming 51820 when the config says otherwise
OpenVPNThe configured UDP or TCP port, often 443Opening 1194 after the server moved
SSTPTCP 443 limited to the gateway IPAllowing 443 to any destination
IKEv2UDP 500 and UDP 4500, plus ESPAllowing only 500 and losing NAT-T
L2TP/IPsecUDP 500, 4500, ESP, and 1701 inside the tunnelExposing 1701 to the internet
PPTPTCP 1723 and IP protocol 47Writing a rule for TCP 47

これらの番号は固定の性質ではなく既定値として扱い、WireGuardインターフェースは設定が宣言した待ち受けポートを使い、OpenVPNサーバーは管理者が選んだ任意のポートに置けることを覚えておいてください。ルールを書く前にサーバー設定を読みましょう。1194向けに開けたファイアウォールは、443へ移したサーバーには何の役にも立ちません。

三列目こそ、変更チケットの多くがつまずく場所です。ルールは存在しますが、宛先、方向、またはトランスポートが間違っています。

GREとESPはプロトコル番号であり、ポートではない

GREとESPにはポートがまったくないため、ポート番号しか受け付けないファイアウォールの入力欄では表現できません。GREはIPプロトコル47、ESPはIPプロトコル50で、どちらもIPヘッダーのプロトコルフィールドで照合します。TCPポート47として書いたルールは何にも一致せず、こうしてPPTPのポリシーは正しく見えながら、ハンドシェイク後のパケットをすべて落とします。

家庭用ルーターはこれをパススルーのチェックボックスで隠し、プロトコルのルールと、GREではフローを対応付けるためのNATヘルパーを入れます。本物のファイアウォールでは、PPTPサーバーへIPプロトコル47を、IPsecゲートウェイへIPプロトコル50を自分で許可します。プラットフォームにプロトコル欄がない場合の逃げ道がカプセル化であり、IKEv2がUDP 4500へ戻れるのも、OpenVPNとWireGuardがこの問題に当たらないのもそのためです。

クライアントを責める前に、ルールが実際に何に一致しているかを確認します。ゲートウェイでゼロのままのパケットカウンターは、ルールが一度も発動していないことを示し、クライアント側で何度入れ直しても変わりません。

方向、状態、NATが答えを変える

外向きに接続するクライアントと内向きに待ち受けるゲートウェイは別の要件であり、同じポート一覧が一方では正しく、他方では間違っていることがあります。状態を持つファイアウォールは500と4500のUDPフローを追跡し、二つ目のルールなしで応答を戻します。ESPとGREはポートを持たないため、NAT装置には手がかりがなく、セッションを追うにはヘルパーかカプセル化が必要です。

NATトラバーサルが見落とされる部分です。IKEv2はUDP 500で始まり、NAT装置を検出してUDP 4500で続けるため、500だけを許可するポリシーでは確立後に沈黙するトンネルになります。L2TP/IPsecも同じ動きをします。キャプチャに最初のやり取りだけが写り、継続的な通信がない場合は、500で止まるルールを探してください。

各ルールに方向を記録します。「UDP 4500を許可」はどこからどこへかを言うまで意味を持たず、移動するクライアントに正しいルールは通常サイト間ピアには間違っています。

各経路をキャプチャで確認する

キャプチャはクライアントではなくゲートウェイで取ります。クライアントは届いたものしか記録しないので、次のフィルターは上記の方式を網羅し、欠けている段階を示します:

sudo tcpdump -ni any tcp port 1723
sudo tcpdump -ni any udp port 500 or udp port 4500
sudo tcpdump -ni any proto gre
sudo tcpdump -ni any proto 50

出力は順序として読みます。交渉は現れるのにペイロードのプロトコルが現れないなら、ドロップはクライアントとゲートウェイの間のどこかで起きています。両方が現れてなおページが失敗するなら、ファイアウォールはもう容疑者ではありませんから、ルーティング、DNS、クライアントに渡されたアドレスプールを見てください。

tcpdumpのない環境では、同じ証拠がインターフェースとルールのカウンターから得られます。トンネルインターフェースで受信はあるのに送信がない場合は、最初の許可ルールではなく戻り経路を指しています。

説明できるルールセットを残す

TCP 443のSSTPは、ポートベースのフィルターには通常のHTTPSと区別できず、ネットワークがWeb通信だけを許可する場合の狙いがまさにそこにあります。443のルールで宛先をインターネット全体ではなくゲートウェイにするべき理由もそこにあります。トンネルが動いたら一時的な全許可ルールはすぐ削除します。どのルールが一致したか、プロトコル番号がある場合はその番号、そして方向を書き残し、次の人が証拠から始められるようにします。

クラウドのポイント対サイトゲートウェイは選択を可視化し、ダウンロードしたプロファイルは443のSSTPか500と4500のIKEv2のどちらかを使うので、実際に選ばれた方だけを開けるべきです。現代のネットワークでPPTPのためにGREの例外を作る価値はなく、携帯事業者はファイアウォールに関係なくプロトコル47を落とすことが多いからです。チケットを閉じる前に、ルールがサーバー設定のポートと一致しているか、プロトコル欄が必要な場所で設定されているか、宛先が任意のアドレスではなくゲートウェイかを確認してください。

関連記事