vpn - 如何使用 xfrm 设置站点到站点 VPN 隧道
问题描述
我尝试了几天在 2 个站点之间创建 VPN 隧道,但没有成功。
设想
我有以下情况:
- 站点 A 的 IP 地址为 192.168.1.0/24,网关 GWA 的地址为 192.168.1.254 和 abcd(面向 Internet)。
- 站点 B 的 IP 地址为 192.168.2.0/24,网关 GWB 的地址为 192.168.2.254 和 efgh(面向互联网)。
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 命令是否正确?
解决方案
我发现了问题。我的方法是正确的,但是由于内核错误(在许多 5.2.x 版本和一些 4.x 版本中),ip xfrm 工具无法正常工作。
一种解决方法是使用 strongswan/swanctl 和他们自己的 IPSec 实现。有关更多信息,请参阅:kernel-libsec 插件。您将需要自己构建和编译它。
推荐阅读
- ruby-on-rails - 注册新的 jquery API 函数时出错(在 Ruby on Rails 应用程序中)
- c# - 默认代理 ASP.NET Core Web API
- php - 从 ACF 字段中检索数据并显示在 Wordpress 的前端表中
- python - 对 LPTHW ex41 感到困惑:关于 PHRASE_FIRST 代码
- java - 如何在 JdbcTemplate 中使用带有可选查询参数的 sql?
- php - storeAs 函数在 /tmp/ Laravel 中存储具有随机名称的文件
- c++ - QML:修改在不同 QML 文件(不是 main.qml)中定义的子对象的属性
- python - 如何在 cloudera 集群上本地运行 Python/IPYNB(使用 pyspark/sklearn 模块)
- android - 使用下载管理器下载文件
- allen-sdk - 可在 RMA 查询中使用的所有有效参数和标准的列表