Mar*_*ste 8 command-line networking routing ipsec iproute
我正在尝试使用 iproute2 从控制台手动设置 IPsec 连接。我需要的是一个虚拟接口(充其量,一个虚拟 IP 地址也可能就足够了),IPsec 转换所有入口(ESP/TUNNEL 模式)并将其移交给 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
Run Code Online (Sandbox Code Playgroud)
对等体上的对手配置效果很好。
现在我尝试设置一个虚拟 IP 和一条到另一个系统的路由
ip address add 10.0.0.0 dev em1
ip route add to 10.0.0.2 via 10.0.0.1
Run Code Online (Sandbox Code Playgroud)
反之亦然。这再次运作良好。然后我将 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
Run Code Online (Sandbox Code Playgroud)
当我现在尝试对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
Run Code Online (Sandbox Code Playgroud)
而政策保持不变。现在触发了策略,我在嗅探端口上看到了一个转换后的数据包。另一台机器上的 iptables 也阻止了数据包,我禁用了它进行测试。
所以,一个方向现在似乎有效,但我仍然没有得到答案。我也不知道问题是否还莫名其妙地转换,路由或接口部分。我的首选解决方案仍然是包含虚拟接口的解决方案,但我不知道如何将其绑定到物理接口,更不用说转换是否可以那样工作了。
小智 1
通常您使用的是使用 . 创建的隧道ip tunnel add
。隧道设备为您提供了一个将 IP 数据包封装在其他 IP 数据包内的虚拟设备。然后可以使用 IPsec 对封装的数据包进行加密。
例如,您可以使用以下命令创建GRE隧道:
ip tunnel add mytunnel mode gre remote 198.51.100.2
ip addr add 10.0.0.1 peer 10.0.0.2/31 dev mytunnel
Run Code Online (Sandbox Code Playgroud)
然后,您可以配置 IPSec 以加密 GRE 数据包(一般情况下,或仅加密到该目的地)。