FW設定とL2TP/IPsec 接続エラー
概要
- conohaのVPS(CentOS)にてL2TP/IPsecを構築してAndroid/iOS/windowsから接続していたが、FW(openstackのnetwork apiによるFW)の設定を変更したらwindowsからのみ接続できなくなった。
- FWの設定変更(任意のプロトコル接続の許可設定追加)により事象は解決した。
背景
CentOSにL2TP/IPsecを構築し、Android/iOS/windowsからVPN接続出来るようにしていた。どの環境においても標準機能で接続できるため、結構便利。
CentOSではfirewalldの設定をしていたが、特定のポート宛に頻繁にアクセスが来ていたため、dropログの容量が1日1G近くなっており、運用上の懸案であった。とはいうものの、ログを取らないようにするのは気持ちが悪い。
このため、openstack側のFWを設定し、これらを遮断することにした。運用が面倒になるだでスマートな感じはしないのだけれど、firewalldのdropログが増えなくなるのは何となく安心感がある。
もろもろサービスが動くのを確認してFWの設定(稼働サービス用のポートのホワイトリスト登録)を完了したのだが、ある日windowsのVPNが切れて、再接続出来なくなった。
(FW設定時にwindowsのVPNはつなぎっぱなしだったため、すぐには問題が発生せず、FWの設定から数日経ってから発覚した)
原因
windows端末はVPSを使用していたため、グローバルIPを持っており、ESP(プロトコル番号50)にて通信を行っていたが、これがFWにて弾かれていた。windowsのVPNエラー番号としては800や809などが発生(windowsのVPN設定により若干変動)
エラー809は「リモートサーバが応答しないため、使用するコンピューターとVPNサーバー側のネットワーク接続を確立できませんでした。」等の表示。
こちらのエラー番号で検索すると、大体がNAT超えのための設定にたどり着くのだが、今回はNATをそもそも使用していないので非該当。
なお、AndroidやiOSはnatを使用していたため、ESPを使用せずUDPにカプセル化して通信するので事象が発生しなかった。これにより、当初はwindows側の設定を疑ったので、パケットキャプチャで双方のパケットを確認しESPパケットがCentOS側に届いていないのを発見するまで原因にたどり着けなかった。
対策
FWの設定にて任意のプロトコルを許可するよう設定することで解消。なお、conohaではプロトコル指定が出来るのはTCP、UDP、ICMPのみであるため、それ以外のプロトコルを許可するためにはすべて許可の設定になる。
感想
windows側がグローバルIPで、conoha(openstack)のFW使用なので珍しいケースにハマった感があるが、IPsecのプロトコルを理解してなかったことを痛感した。もうちょっとちゃんと勉強したい。
追記
任意のプロトコルを許可すると、拒否したい通信も通ってしまう(ホワイトリストだから当然の動作!!)
よって、今回はグローバルIPを用いているwindows側でもNAT使用時と同様にUDPカプセル化を用いるように設定する。
設定項目は
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgentにAssumeUDPEncapsulationContextOnSendRuleを作成し、値を2にする
forceencapsとかnat_traversalとかの項目を指定している記事も見つかるがlibreswanでは廃止されている模様。
(/var/log/messagesにobsolete keyword 'forceencaps' ignoredが記録される)