首页 > 解决方案 > 如何使用 xfrm 设置站点到站点 VPN 隧道

问题描述

我尝试了几天在 2 个站点之间创建 VPN 隧道,但没有成功。

设想

我有以下情况:

XFRM 政策和状态

我设法正确地为每个网关添加了状态和策略(我认为)。

对于 GWA,我使用了以下命令:

# policies in, out, fwd
ip xfrm policy add src 192.168.1.0/24 dst 192.168.2.0/24 dir out tmpl src a.b.c.d dst e.f.g.h proto esp reqid 0x99 mode tunnel
ip xfrm policy add src 192.168.2.0/24 dst 192.168.1.0/24 dir in tmpl src e.f.g.h dst a.b.c.d proto esp reqid 0x99 mode tunnel 
ip xfrm policy add src 192.168.2.0/24 dst 192.168.1.0/24 dir fwd tmpl src e.f.g.h dst a.b.c.d proto esp reqid 0x99 mode tunnel<br> 
# states
ip xfrm state add src a.b.c.d dst e.f.g.h proto esp spi 0x81 reqid 0x99 mode tunnel auth "hmac(sha256)" 0x01 enc "rfc3686(ctr(aes))" 0x02
ip xfrm state add src e.f.g.h dst a.b.c.d proto esp spi 0x82 reqid 0x99 mode tunnel auth "hmac(sha256)" 0x03 enc "rfc3686(ctr(aes))" 0x04

对于 GWB,我使用了以下命令:

# policies in, out, fwd
ip xfrm policy add src 192.168.2.0/24 dst 192.168.1.0/24 dir out tmpl src e.f.g.h dst a.b.c.d proto esp reqid 0x99 mode tunnel
ip xfrm policy add src 192.168.1.0/24 dst 192.168.2.0/24 dir in tmpl src a.b.c.d dst e.f.g.h proto esp reqid 0x99 mode tunnel 
ip xfrm policy add src 192.168.1.0/24 dst 192.168.2.0/24 dir fwd tmpl src a.b.c.d dst e.f.g.h proto esp reqid 0x99 mode tunnel<br>
# states
ip xfrm state add src a.b.c.d dst e.f.g.h proto esp spi 0x81 reqid 0x99 mode tunnel auth "hmac(sha256)" 0x01 enc "rfc3686(ctr(aes))" 0x02
ip xfrm state add src e.f.g.h dst a.b.c.d proto esp spi 0x82 reqid 0x99 mode tunnel auth "hmac(sha256)" 0x03 enc "rfc3686(ctr(aes))" 0x04

路线

来自站点 A 的每个主机都知道通过 GWA 路由发往站点 B 的数据包。

来自站点 B 的每个主机都知道通过 GWB 路由发往站点 A 的数据包。

结果

从站点 A 中的主机发送到站点 B 中的主机的数据包到达 GWA 并被加密(作为 ESP 数据包)。ESP 数据包到达 GWB 并成功解密,但被丢弃。

我错过了什么?

我需要虚拟/隧道接口吗?(vti, tun, tap)
我需要在 iptables 中添加条目吗?我的 xfrm 命令是否正确?

标签: vpn

解决方案


我发现了问题。我的方法是正确的,但是由于内核错误(在许多 5.2.x 版本和一些 4.x 版本中),ip xfrm 工具无法正常工作。

一种解决方法是使用 strongswan/swanctl 和他们自己的 IPSec 实现。有关更多信息,请参阅:kernel-libsec 插件。您将需要自己构建和编译它。


推荐阅读