使用“ip xfrm”重新生成 ipsec 密钥

使用“ip xfrm”重新生成 ipsec 密钥

我在两个 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}

相关内容