【IPSec】使用与运维:netns 实测与故障模式

💡 原文中文,约3900字,阅读约需10分钟。
📝

内容提要

本文通过双netns环境实测Linux xfrm的IPsec ESP功能,验证了ping成功且SA计数匹配;删除out policy后丢包,恢复后通信正常,证明policy与state需成对配置。提供了swanctl、ip xfrm等命令台账,分析了无法建立、单向通等故障模式,并指出WireGuard适用场景及实验边界。

🔎

延伸解读

三张表一致性是排障核心

文章强调IPsec故障多源于IKE连接视图、内核策略(policy)和状态(state)三张表不一致。实测中删除out policy后立即丢包,恢复后通信正常,说明policy与state必须成对配置。运维时若遇到“有SA但不通”,应优先检查policy方向是否缺失,而非盲目重启服务。

netns实测的价值与局限

通过双netns环境直接操作xfrm对象,绕开IKE守护进程,能快速验证数据面是否正常。但同机netns的RTT仅0.07ms,不能代表公网延迟或吞吐;且实验密钥写死在脚本中,仅限实验室使用。生产环境需结合strongSwan的swanctl视图综合判断。

WireGuard与IPsec的故障面差异

文章指出WireGuard故障常在AllowedIPs与路由表(FIB)脱节,而IPsec多一张IKE身份/证书表,三张表任一脱节都可能导致问题。选型时若追求极简审计面、固定算法、无证书流程,可优先评估WireGuard;需要L2扩展时IPsec alone并不适用。

Q&A

如何验证Linux xfrm的IPsec ESP功能是否正常工作?

可以通过创建两个netns,配置veth对,并手动安装ESP的state和policy,然后使用ping命令测试连通性。如果ping成功且`ip -s xfrm state`中的包计数与ping次数一致,则说明ESP功能正常。

删除out policy后为什么会导致IPsec通信中断?

删除out policy后,本端无法根据模板封装ESP报文,或者走明文会被对端策略拒绝,导致通信中断。恢复out policy后通信立即恢复,说明policy和state必须成对配置才能正常工作。

有哪些常用的IPsec排障命令?

常用命令包括:`swanctl --list-sas`、`--list-conns`、`--list-pols`查看IKE/Child视图;`ip xfrm state`、`ip xfrm policy`、`ip -s xfrm state`查看内核SAD/SPD;`tcpdump -n esp or udp port 500 or udp port 4500`抓包;`swanctl --initiate --child`触发协商;`ip xfrm state flush`和`policy flush`清空实验残留。

IPsec无法建立连接(ESTABLISHED失败)时应该检查哪些方面?

应检查proposal交集、PSK/证书、时钟同步、防火墙是否放行UDP 500和4500端口。

IPsec单向通信可能是什么原因导致的?

单向通信可能由单侧policy/state缺失、anti-replay窗口问题或非对称NAT导致。

IPsec与WireGuard在运维上有何不同?

WireGuard的故障多集中在AllowedIPs与FIB(路由表)的脱节;而IPsec多了一张IKE身份/证书表,需要同时关注IKE连接视图、策略和状态三张表的一致性。

哪些场景下不建议使用IPsec?

需要极简审计面、固定算法、无证书流程时,优先考虑WireGuard;需要L2扩展时,IPsec alone不是以太网桥,常需与其他封装组合,复杂度较高。

🏷️

标签

➡️

继续阅读