我正在尝试使用iproute2从控制台手动设置IPsec连接。我需要的是一个虚拟接口(充其量,一个虚拟IP地址也足够),该接口可以进行IPsec转换(ESP /隧道模式),并将其移交给eth0(在我的系统上称为em1)。在另一组上,对等方从其自己的eth获取数据包,将其解密,然后将其移交给另一侧的虚拟接口。所以我想建立一个“正常”的IPsec隧道。
我对策略和SA没问题,使用传输模式下系统的常规以太网地址进行配置很容易,即
ip xfrm policy add src 198.51.100.1 dst 198.51.100.2 dir out tmpl proto esp
ip xfrm state add src 198.51.100.1 dst 198.51.100.2 spi 24501 proto esp enc des 0xAABBCCDDEEFF0011
ip xfrm state add src 198.51.100.2 dst 198.51.100.1 spi 24501 proto esp enc des 0xAABBCCDDEEFF0022
对手上的对手配置效果很好。
现在,我尝试使用以下命令设置虚拟IP和到其他系统的路由
ip address add 10.0.0.0 dev em1
ip route add to 10.0.0.2 via 10.0.0.1
反之亦然。这再次运作良好。然后,我将IPsec策略和SA更改为
ip xfrm policy add src 10.0.0.1 dst 10.0.0.2 dir out tmpl src 198.51.100.1 dst 198.51.100.2 proto esp mode tunnel
ip xfrm state add src 10.0.0.1 dst 10.0.0.2 spi 24501 proto esp enc des 0xAABBCCDDEEFF0011
ip xfrm state add src 10.0.0.2 dst 10.0.0.1 spi 24501 proto esp enc des 0xAABBCCDDEEFF0022
现在,当我尝试与tcping
对等方联系时,我没有任何答案,并setkey -PD
告诉我,从未触发过安全策略。现在,我正在尝试构造一个工作的虚拟接口来处理IPsec隧道,但是我不知道如何将其绑定到物理接口以及如何获取内核以应用安全策略。
对于我而言,至关重要的是我可以使用iproute2解决此问题,因为我最终想从C ++程序中完成此任务,并且我已经拥有了适当的类,可以将Netlink命令删除为与该ip
命令相同的样式(我可以使用ip
,也可以在我的代码内完成)。实际上,第一部分已经在我的程序中运行了,其余部分我想使用相同的Netlink API函数。
更新 我发现需要使用隧道地址来设置状态,以便正常工作的SA
ip xfrm state add src 10.0.0.1 dst 10.0.0.2 spi 24501 proto esp enc des 0xAABBCCDDEEFF0011
ip xfrm state add src 10.0.0.2 dst 10.0.0.1 spi 24501 proto esp enc des 0xAABBCCDDEEFF0022
而政策保持不变。现在该策略已触发,我在嗅探端口上看到一个转换后的数据包。另外,另一台计算机上的iptables阻止了该数据包,我将其禁用以进行测试。
因此,一个方向现在似乎可行,但我仍然没有答案。我也不知道问题是否仍然是转换,路由或接口部分。我更喜欢的解决方案仍然是包括虚拟接口的解决方案,但是我不知道如何将其绑定到物理接口,更不用说转换是否可以那样工作了。