我在两个 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 条目(第二次调用将删除优先级 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 并与旧的 reqid 关联。 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}