Windows L2TP で一部のサイトだけ読み込めない:pfSense で DF ビットを消す
イントラネットは開けるのに一部の公開サイトで止まる L2TP クライアントは MTU の問題を抱えています。DF ビットを消すか MSS を制限し、キャプチャで確認してください。
ノート PC は接続し、イントラネットは開き、一部の公開サイトだけが止まります。認証とルーティングは明らかに機能しているので、残る説明はパケットサイズです。L2TP/IPsec トンネルでは利用可能な MTU がアダプターの公称値より小さく、クライアントは「分割禁止」ビットを立てたまま全サイズのパケットを送り続けます。pfSense ゲートウェイにそのビットを消させることはでき、きちんと直す前に診断を確かめる最短の方法です。
失敗するページから始める
設定に触れる前に、どの宛先が失敗し、どれが成功するかを書き留めます。トンネルの上限に収まるハンドシェイクは正常に完了し、全サイズのセグメントを要する転送は途中で止まります。この分かれ方はフィルターではなくサイズの問題の特徴で、遮断された宛先はページの途中ではなく接続確立の時点で失敗します。どちらの観察も費用はかからず、探索範囲をすぐに絞れます。
ビットを立て、ペイロード長を制御する ping で試します。通る最大のペイロードが実際の経路 MTU を教え、アダプターの公称値との差が両者の隔たりを示します。
両方の数値を書き留めます。修正はどちらが誤っているかで変わり、その組を後でキャプチャが確認します。
送出時に DF ビットが何をするか
数値が違うのはカプセル化のためです。IPsec が ESP を加え、L2TP がさらにヘッダーを加えるので、トンネルは物理リンクより少ないペイロードしか運びません。Windows はアダプターで依然 1500 バイトと報告し、送るものに「分割禁止」を立てます。そうしたパケットが収まらないとき、ゲートウェイの正しい応答は送信側に縮小を求める ICMP メッセージです。だから小さな ping が通るトンネルでもファイルのダウンロードは失敗し得ます。
そのメッセージは届かないこともしばしばです。途中のホップが ICMP をフィルターすることも、何も生成しないこともあり、送信側は転送が諦めるまで同じサイズを繰り返します。
ここでは沈黙が普通の現れ方で、だから症状は選択的な遮断として読まれます。クライアントのログに欠けた ICMP メッセージは記録されません。
pfSense のオプションと、それがしないこと
オプションは「システム、詳細設定、ファイアウォールと NAT」のページにあり、「パケットを破棄する代わりに無効な DF ビットを消去する」と表示されています。フラグを持つ大きすぎるパケットを捨てる代わりに、フィルターはフラグを外し、パケットを下流で分割させます。パケットが送出インターフェイスを一度に通り抜けられないとき、無効と数えられます。
このオプションはクライアントに触れずに接続を回復するので人気があります。回避策でもあり、分割は CPU を食い、失われた断片ごとに費用が増えます。
適用されるのは転送される通信だけで、ファイアウォール自身が発する通信には及びません。同じページには「ファイアウォール スクラブを無効化」があり、これは正規化を完全に切るので、この問題に必要な範囲をはるかに超えた変更です。
TCP を分割せずに保つ、より狭い修正
止まっているフローのほとんどは TCP で、TCP は分割に頼らずにより小さいセグメントを交渉できます。トンネル インターフェイスで MSS を制限すると、ハンドシェイク中に公称値が書き換えられ、双方が実際に収まる量を送ります。経路はそのあと予測どおりに振る舞い、どのパケットも分割する必要がありません。
これで UDP は探索か DF オプションに委ねられます。失敗するサイトが普通の Web ページなら、制限のほうを選ぶべき変更です。
クライアントは netsh interface ipv4 show subinterfaces で自分のアダプター MTU を報告できます。両者はいつも同じとは限らないので、その数値をサーバーが交渉済みと考える値と比べてください。交渉が何を報告したにせよ、OS が実際に使うのはその値です。
キャプチャで確認し、そのあと状態をリセットする
決める前に、トンネルが通る側と WAN インターフェイスが通る側の両方でキャプチャします。全サイズで出て ICMP が戻らないパケットは、制限が正しい層だと示します。届いてから戻り道で消える応答は、代わりにトンネルの MTU を示します。
既存のフローは古いセグメント サイズを保つので、再試行の前に状態テーブルを消してください。そのあと失敗したページを読み込み、片側のカウンターではなく双方向の通信について状態ビューを読みます。それでも止まるなら、別のチェックボックスを試すのではなく、もう一度キャプチャします。