两个远程主机之间的 IPsec 隧道

两个远程主机之间的 IPsec 隧道

我正在使用 mininet,我在两台机器之间创建了一个 ESP 隧道,这样如果我从一台机器 ping 到另一台机器,我就会看到 ESP 数据包,一切正常。下面是使用的命令:

M1 ip xfrm policy add dir out src 2001:0:0:1c::2 dst 2001:0:0:1c::1 tmpl proto esp mode transport
M1 ip xfrm state add src 2001:0:0:1c::2 dst 2001:0:0:1c::1 proto esp spi 1 enc 'cbc(aes)' 0x3ed0af408cf5dcbf5d5d9a5fa806b224 mode transport

M2 ip xfrm policy add dir in src 2001:0:0:1c::2 dst 2001:0:0:1c::1 tmpl proto esp mode transport
M2 ip xfrm state add src 2001:0:0:1c::2 dst 2001:0:0:1c::1 proto esp spi 1 enc 'cbc(aes)' 0x3ed0af408cf5dcbf5d5d9a5fa806b224 mode transport

现在我想做的是:

我有两台机器,比如说远程的 M1 和 M3(或者 smt,例如 M1-->M2-->M3),我只是用 ipv6 地址更改了相应的 src 和 dst,但在这种情况下隧道不再起作用,我的意思是在 wireshark 上看到数据包时,ESP 标头不存在。即使我保留上述代码,M1 和 M2 之间的数据包仍然没有 ESP 标头。

我的目标是在 M1 和 M3 之间建立 IPsec 通信,因此如果我从 M1 向 M3 执行 Ping 操作,M1 和 M3 之间会有 ESP 数据包,MC2 和 MC3 之间也会有数据包。我该如何实现呢?任何帮助我都非常感谢,提前致谢。

答案1

首先声明:手动设置加密密钥非常适合演示目的,但IKE守护进程坚强的天鹅会做得更好,并且配置起来也不会更困难。

您在问题中使用的命令暗示:

  • 您只设置了一个方向的加密(M1 -> M2)。使用 WireShark 看到的 ESP 数据包是从 M1 发出并进入 M2 的数据包。对 ping 的回复是未加密的,
  • 你只使用加密而没有身份验证,因此你无法检测你的数据包是否在传输过程中被修改(例如截断),
  • 你用运输模式,因此您可以使用加密通道将数据包从 M1 发送到 M2,但不能再发送。
  • 你可能总是使用spi1。这是随每个 ESP 数据包发送的数字,允许内核区分加密通道。

所以如果你想建立一个双向加密通道,你需要生成一个spi以及两个方向的加密密钥:

host1="2001:0:0:1c::2"
host2="2001:0:0:1c::1"
key12=0x$(xxd -c 32 -l 32 -ps /dev/random)
key21=0x$(xxd -c 32 -l 32 -ps /dev/random)
spi12=0x$(xxd -c 4 -l 4 -ps /dev/random)
spi21=0x$(xxd -c 4 -l 4 -ps /dev/random)

然后您需要在两台主机上安装加密密钥:

ip xfrm state add src $host1 dst $host2 proto esp spi $spi12 enc 'cbc(aes)' $key12 mode transport
ip xfrm state add src $host2 dst $host1 proto esp spi $spi21 enc 'cbc(aes)' $key21 mode transport

安装密钥后,您可以添加策略,这样 Linux 就会开始加密数据。主机之间的说明有所不同(显然),因为说明出去有所不同。在 M1 上,您需要使用:

ip xfrm policy add dir out src $host1 dst $host2 tmpl proto esp mode transport
ip xfrm policy add dir in src $host2 dst $host1 tmpl proto esp mode transport

在 M2 上:

ip xfrm policy add dir in src $host1 dst $host2 tmpl proto esp mode transport
ip xfrm policy add dir out src $host2 dst $host1 tmpl proto esp mode transport

现在内核将开始加密传出数据包并丢弃未加密的传入数据包。

如果不起作用,请检查防火墙是否允许 ESP 通过。

附言:你可以找到更完整的解决方案waldner 的博客

相关内容