IKE Keepalive (DPD) についての僕の誤解

VPNを張る際、IKE Keepaliveについて誤解していたのでメモ。
(半年くらい公開するの忘れてた)

探せばIKE Keepaliveについて日本語でまとめてあるページがいくつかありますが、ベンダー特有の動作が混じっていたとしても私にはまだその判別が出来ないので
RFC3706 を読むことにしました。
読み切れてはなくて、ほとんどただのメモです。

解釈が違っていた場合指摘して頂けると助かります!

前置き / 動機

折りたたみを開く

誤解 / 結論

私の場合、ずっとIKE Keepaliveの事を「繋がる状態を常に維持しておくもの」という考えでいました。
しかし、IKE Keepaliveの本質は

「片方のPeerが再起動やルーティング変更等を行い、もう片方のPeerにだけSA情報が残る「ブラックホール状態」にならないよう、接続障害および復旧を検知する」

という所にあるので
実際は「障害を検知し、復旧を検知すれば繋げる」という役割になります。


調べた事

DPDの目的
When two peers communicate with IKE [2] and IPSec [3],
the situation may arise in which connectivity between the two goes down unexpectedly.
....
...
Likewise, it is sometimes necessary to detect black holes to recover lost resources.

意訳ですが

二点間のIKEとIPsecでの通信で、疎通性が予期せず失われる事がある。
それは、ルーティングの問題や1つのホストの再起動などで発生する可能性があり
多くの場合、IKEとIPsecはピアへの疎通性が失われた事を特定する方法がない。
なので、ライフタイムが切れるまでSAが残り、パケットが損失する「ブラックホール状態」になる。
また、別のピアに切り替える為に「ブラックホール状態」を早く知りたい場合があり、
復旧する為にも「ブラックホール状態」を検出する必要がある。

という文章になるかなと思います。

つまりは ピアへ疎通性がない事を検知するのがDPDの目的 のようです。
略さなければ Dead Peer Detection なので、それはそうという感じですね。



ダウンの確認方法

検出するために、ISAKMP Notify messageを利用して定期的にHello/Ackメッセージを送信する。

指定間隔が経過してもHelloメッセージを受信できない場合、Helloメッセージを送信する。
指定タイムアウト時間内にそのHelloメッセージに対するACKメッセージが受信できない場合、Helloメッセージを再送する。
それでもACKを受信できなかった場合、エラーカウンターがあがり、別のHelloメッセージを送る。
逆にHelloメッセージを受信したり、ACKメッセージを受信すると、キープアライブタイマーがリセットされる。
エラーカウントがいくつか上がると、SAを削除し、フェイルオーバーを開始する可能性がある。


この通信、ISAKMPなんですよね、ICMPじゃないんです。
なので、トンネル内の通信にカウントされず更新リキーが働かない・・・と、いうことなんですかね。