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}