FW設定とL2TP/IPsec 接続エラー

概要

  • 原因はFWによりIPsecが弾かれていることだった。windowsのみグローバルIPを持っていたため問題が発生したが、Android/iOSはnatを使用していたため接続が出来ていた。
  • FWの設定変更(任意のプロトコル接続の許可設定追加)により事象は解決した。

背景

CentOSL2TP/IPsecを構築し、Android/iOS/windowsからVPN接続出来るようにしていた。どの環境においても標準機能で接続できるため、結構便利。

CentOSではfirewalldの設定をしていたが、特定のポート宛に頻繁にアクセスが来ていたため、dropログの容量が1日1G近くなっており、運用上の懸案であった。とはいうものの、ログを取らないようにするのは気持ちが悪い。

このため、openstack側のFWを設定し、これらを遮断することにした。運用が面倒になるだでスマートな感じはしないのだけれど、firewalldのdropログが増えなくなるのは何となく安心感がある。

もろもろサービスが動くのを確認してFWの設定(稼働サービス用のポートのホワイトリスト登録)を完了したのだが、ある日windowsVPNが切れて、再接続出来なくなった。
(FW設定時にwindowsVPNはつなぎっぱなしだったため、すぐには問題が発生せず、FWの設定から数日経ってから発覚した)

原因

windows端末はVPSを使用していたため、グローバルIPを持っており、ESP(プロトコル番号50)にて通信を行っていたが、これがFWにて弾かれていた。windowsVPNエラー番号としては800や809などが発生(windowsVPN設定により若干変動)
エラー809は「リモートサーバが応答しないため、使用するコンピューターとVPNサーバー側のネットワーク接続を確立できませんでした。」等の表示。
こちらのエラー番号で検索すると、大体がNAT超えのための設定にたどり着くのだが、今回はNATをそもそも使用していないので非該当。

なお、AndroidiOSはnatを使用していたため、ESPを使用せずUDPカプセル化して通信するので事象が発生しなかった。これにより、当初はwindows側の設定を疑ったので、パケットキャプチャで双方のパケットを確認しESPパケットがCentOS側に届いていないのを発見するまで原因にたどり着けなかった。

対策

FWの設定にて任意のプロトコルを許可するよう設定することで解消。なお、conohaではプロトコル指定が出来るのはTCPUDP、ICMPのみであるため、それ以外のプロトコルを許可するためにはすべて許可の設定になる。

感想

windows側がグローバルIPで、conoha(openstack)のFW使用なので珍しいケースにハマった感があるが、IPsecプロトコルを理解してなかったことを痛感した。もうちょっとちゃんと勉強したい。

追記

任意のプロトコルを許可すると、拒否したい通信も通ってしまう(ホワイトリストだから当然の動作!!)

よって、今回はグローバルIPを用いているwindows側でもNAT使用時と同様にUDPカプセル化を用いるように設定する。
設定項目は

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgentにAssumeUDPEncapsulationContextOnSendRuleを作成し、値を2にする

  • IPsecサーバ側のIPsecの設定でencapsulation=yesを追記 ※libreswanの場合

forceencapsとかnat_traversalとかの項目を指定している記事も見つかるがlibreswanでは廃止されている模様。
(/var/log/messagesにobsolete keyword 'forceencaps' ignoredが記録される)