「ip xfrm」を使用して IPsec キーを再生成します。

「ip xfrm」を使用して IPsec キーを再生成します。

2つのLinuxシステム間で簡単なIPsecを構築しました。

SHAKEY=0xd3413c31c7d19c93d04db1c6ae8d73d9a64910c2e76297129acde44aaa9de5c5
AESKEY=0xcd191fac520878852e15647dce3456ba9857e2dfd6ed56421eb50cb58d7a1e5a
SPI=0x01

if [ "$(hostname -s)" = "host1" ] ;then
  SRC=10.0.0.1
  DST=10.0.0.3
fi
if [ "$(hostname -s)" = "host3" ] ;then
  SRC=10.0.0.3
  DST=10.0.0.1
fi
SDIR="src $SRC dst $DST"
DDIR="src $DST dst $SRC"

ip xfrm state add ${SDIR} proto esp spi ${SPI} reqid ${SPI} \
  mode transport auth sha256 ${SHAKEY} enc aes ${AESKEY}
ip xfrm state add ${DDIR} proto esp spi ${SPI} reqid ${SPI} \
  mode transport auth sha256 ${SHAKEY} enc aes ${AESKEY}
ip xfrm policy add ${SDIR} dir out priority 0 \
  tmpl ${SDIR} proto esp reqid ${SPI} mode transport
ip xfrm policy add ${DDIR} dir in priority 0 \
  tmpl ${DDIR} proto esp reqid ${SPI} mode transport

これは素晴らしい作品です。それでは、パケットフローを中断せずに新しいキーセットに変更したいと思います。私が期待する仕組みは、受信パスに追加のキーセットを追加し、転送パスを新しいキーセットに切り替えて、古いキーセットを削除することです。

これは正しいアプローチですか?実際にどうすればいいですか?私が試したことは次のとおりです。

AESKEY2=0x2bdfbfbee5aab7be4f4ccfe202e6f1d5e363503140441fe8aba77c3b784e65bd
SHAKEY2=0xed2ac9c739894c73bae1a9fe477631add20398b0bbc906c5ec486f27ddbb84ac
SPI2=0x02

ip xfrm state add ${SDIR} proto esp spi ${SPI2} reqid ${SPI2} \
  mode transport auth sha256 ${SHAKEY2} enc aes ${AESKEY2}
ip xfrm state add ${DDIR} proto esp spi ${SPI2} reqid ${SPI2} \
  mode transport auth sha256 ${SHAKEY2} enc aes ${AESKEY2}

これは、パケットがSPI 1から流れ続けるために機能するようです。

ip xfrm policy add ${DDIR} dir in \
  tmpl ${DDIR} proto esp reqid ${SPI2} mode transport

失敗:RTNETLINK回答:ファイルが存在します。

ip xfrm policy add ${SDIR} dir out priority 5\
  tmpl ${SDIR} proto esp reqid ${SPI2} mode transport
ip xfrm policy add ${DDIR} dir in priority 5 \
  tmpl ${DDIR} proto esp reqid ${SPI2} mode transport

新しいポリシーを追加することは許可されていますが、優先順位が0の項目を明示的に削除する方法はないようです。ip xfrm policy del ${SDIR} dir out priority 2「エラー: '優先順位'パラメーターにエラーがあります:不明」のため失敗します。ip xfrm policy del ${SDIR} dir out優先順位0のエントリを削除し(2番目の呼び出しは優先順位5のエントリを削除します)、SPI 2はトラフィック転送を開始しますが、エントリのポリシーディレクトリが変更されていなくても、SPI 1の反対側のエンドトラフィックは受け入れを停止します。

私は何を見逃していますか?トラフィックを中断せずにキーを更新するにはどうすればよいですか?

答え1

それを見つけました:

ip xfrm state add ${DDIR} proto esp spi ${SPI2} reqid ${SPI} \
  mode transport auth sha256 ${SHAKEY2} enc aes ${AESKEY2}

両方のノードで新しいSPIを受け取り、古い必須IDに関連付けることができます。 reqidはこのSAを関連する「ポリシー」と引き続きリンクします。

次に、転送用の新しいSPIとキーを追加します。ノードはすぐに新しいキーの使用を開始します。

ip xfrm state add ${SDIR} proto esp spi ${SPI2} reqid ${SPI} \
  mode transport auth sha256 ${SHAKEY2} enc aes ${AESKEY2}

最後に、両側がすべて新しいキーを使用すると、古いキーの使用を停止します。

ip xfrm state del ${SDIR} proto esp spi ${SPI}
ip xfrm state del ${DDIR} proto esp spi ${SPI}

関連情報