拠点間接続VPNのまとめ4

両拠点動的IP環境下でのIPsec利用。
IKEv1のお話。

例えば、拠点Aが固定IP、拠点Bが動的IPの環境では、拠点Aをレスポンダとし、拠点Bをイニシエータとする。拠点BのIPアドレスが変わったら、IKEアグレッシブモードを使ってISAKMP SAを確立し直す。
両拠点が動的IP環境では、ダイナミックDNSサービスにお世話になる。先程の拠点AにFQDNを利用するだけ。
どちらのIPが変わっても、IKEアグレッシブモードを使ってISAKMP SAを確立し直せる。 だが、再接続は必ず拠点Bからしか行えない。
拠点Bは自分のIPと拠点AのIPの両方の変動を監視しなくてはならない。
この環境では、拠点AはIPアドレスが変動した場合や、何らかの原因でIPsec SAが切断されてしまった場合、拠点Bからの接続を待たなくてはならない。
再接続される前に拠点Aゲートウェイに、拠点Bへのパケットが届いても、送信することができない。
できれば、どちらもイニシエータ/レスポンダになれるようにしたい。

そこで、IPアドレスが変動したら、SSHリモートコマンドで相手拠点のIPsecバイス設定ファイルを直接書換え、両デバイスを再起動する。こうすれば、事前に設定ファイルを共有してあるので、どちらからでもISAKMP SAを確立することができる。

f:id:Aqutam:20190922100843p:plain

図のような仕組みになる。
拠点BのIPアドレスが変動したとする。

  1. 次回拠点AのIPアドレスが変動し、拠点Aが拠点BにSSH接続しに来るために、DDNSに新しく割り当てられたIPアドレスを登録しておく。
  2. 拠点AにSSH接続するため、拠点Aのホスト名を参照する。
  3. 拠点AにSSHリモートコマンドを実行し、IPsec設定ファイルの書換えとIPsecバイスの再起動をする。
  4. 拠点Bの設定ファイルを書換えIPsecバイスを再起動する。

この仕組みなら、ダイナミックDNSを利用しないで、拠点Bは直接拠点AのIPアドレスSSH接続することもできる。
だが、まぁ可能性は低いだろうが同時にIPアドレスが変動してしまった場合、ダイナミックDNSがなければ二度と相手を特定できなくなってしまう。

Linux上で実際に実現するには、2つのシェルスクリプトを用意しておく。
1つは、自身のIPアドレスを監視。変動したら相手拠点にSSHリモートコマンドで、もう1つのシェルスクリプトを自身のIPを引数に添えて実行。その後自身のIPsec設定ファイルを書換え、IPsecバイスを再起動する。
もう1つのシェルスクリプトは、リモートコマンドで実行されるもので、IPsec設定ファイルの宛先ゲートウェイを引数に受け取ったIPアドレスに書き換える。その後IPsecバイスを再起動する。

自身のIPを監視するスクリプトはcrontabで1分毎に走らせる。IPアドレスが変動しても1分以内にで再接続が可能になる。
まれに同時に両拠点のIPアドレスが変わってしまった場合は、数分時間を要するが自身のIPを監視するスクリプトは書換えを成功させるまで実行され続けるので、そのうち再接続される。

この仕組みでは、事前にIPsec設定ファイルを共有しておくので、お互いはIPアドレスを知ることができる。なので、IKEメインモードを利用することができ、IKEアグレッシブモードよりセキュリティレベルを上げることができる。

このアイデアは大学の先輩からアドバイス頂きました。
ありがとうございます。