为什么 IPsec 隧道只需要 3 个 ip xfrm 策略?

为什么 IPsec 隧道只需要 3 个 ip xfrm 策略?

strongswan我在(v5.2.0) 实例(站点 A)和路由器(站点 B)之间建立了一个站点到站点 IPsec 隧道并正在运行。一切运行正常,为站点 A ( ) 和 B ( )RouterOS设置的两个私有子网中的主机可以正常相互通信。10.10.0.0/1610.50.0.0/16

但我不明白的是ip xfrm policy站点 A 路由器上的以下输出(公共 IP 已混淆)。这些策略是由创建的strongswan,我没有手动安装或修改它们:

ip xfrm policy 
src 10.50.0.0/16 dst 10.10.0.0/16 
    dir fwd priority 2947 ptype main 
    tmpl src <PUBLIC_IP_B> dst <PUBLIC_IP_A>
        proto esp reqid 1 mode tunnel
src 10.50.0.0/16 dst 10.10.0.0/16 
    dir in priority 2947 ptype main 
    tmpl src <PUBLIC_IP_B> dst <PUBLIC_IP_A>
        proto esp reqid 1 mode tunnel
src 10.10.0.0/16 dst 10.50.0.0/16 
    dir out priority 2947 ptype main 
    tmpl src <PUBLIC_IP_A> dst <PUBLIC_IP_B>
        proto esp reqid 1 mode tunnel

输入和输出各有一个策略,但转发(从站点 B 到站点 A)只有一个策略。但我仍然可以成功 ping 通,例如,10.50.4.1110.10.0.89

ping -R 10.50.4.11
PING 10.50.4.11 (10.50.4.11): 56 data bytes
64 bytes from 10.50.4.11: icmp_seq=0 ttl=62 time=10.872 ms
RR:     10.10.0.89
    10.50.0.1
    10.50.4.11
    10.50.4.11
    10.50.4.11
    10.10.0.2
    10.10.0.89

此路由跟踪的有趣部分是站点 A 的路由器 ( 10.10.0.2) 仅显示在从 ping 目标返回的路由上,而站点 B 的路由器 ( 10.50.0.1) 仅列出在传出路由中。

这似乎证实了实际上不需要前瞻性政策在站点 A 的路由器上通过 IPsec 隧道转发10.10.0.0/1610.50.0.0/16但我不明白为什么。

谢谢您的解释!

答案1

转发政策不是由内核自动生成,但是由密钥守护进程(在本例中为 strongSwan)安装。

它们需要允许流量以隧道模式转发到 VPN 网关后面的主机和从 VPN 网关后面的主机转发。

对于发往网关本身未安装的 IP 的入站数据包,转发解密后搜索策略。对于本地流量,匹配的查找策略。如果没有找到,则丢弃数据包。

对于不是在 VPN 网关本身生成的出站流量,转发搜索策略。如果数据包未加密,则没有匹配的转发找到策略。如果流量在两个隧道之间转发,则入站转发安装有该策略的策略将充当出站策略转发政策,反之亦然。之后,出去查找策略来决定是否要对数据包进行隧道传输。这就是为什么转发通常不需要出站方向的策略。

然而,如果出现掉线/拦截转发具有与所有内容匹配的低优先级策略(例如,在没有建立隧道的情况下,避免明文流量通过网关)转发明确要求在出站方向实施政策,因为堵塞否则,策略将丢弃所有未加密的流量。这就是 strongSwan 开始安装的原因转发双向政策5.5.0


这个答案的先前版本指出,单个(入站)转发政策是对称的(即源码夏令时无论如何)。事实并非如此,但如上所述,在很多情况下这并不重要。

答案2

本文由 Andrej Stender 撰写

安全策略 句法 意义
本刊中包含“输出政策”的 目录输出 SP 充当传出数据包的选择器,以选择哪些数据包需要加密+封装,哪些不需要
本刊中包含“输入政策”的 目录 SP 充当已解密+解封装且在系统上具有本地目标 IP 的传入数据包的选择器
“前瞻性政策” 前进方向 SP 充当传入数据包的选择器,这些数据包已经解密+解封装,并且目标 IP 不是本地的,因此需要转发(路由)这些数据包

所以:

  • out用于传出我们想要用 IPsec 加密+封装的流量(本地和转发)。
  • infwd用于传入 IPsec流量并应用于封装在 IPsec 中的数据包:
    • in应用于目标 IP 为该计算机的内部数据包
    • fwd适用于需要进一步转发的内部数据包

编辑:我在 Linux 5.9.1 上进行了自己的本地实验ip xfrm,结果与 Andrej 的表格相符。

答案3

这似乎证实了站点 A 的路由器上实际上不需要转发策略来通过 IPsec 隧道将 10.10.0.0/16 转发到 10.50.0.0/16,但我不明白为什么。

这是因为 A 只想接收来自 B 的 IPsec 流量。

从 A 到 B 的 IPsec 流量以 A 的 IP 地址作为目标 IP 地址 - 因此它由dir inA 上的策略处理。
从 IPsec 中提取封装的 IP 数据包后,它们被移交给内核以获得对传入 IP 数据包的标准 Linux 处理 -xfrm policy dir fwd这里不需要。

src 10.10.0.0/16 dst 10.50.0.0/16 dir fwd ...如果您还需要接收来自 B 的非 IPsec 流量,则可以在 A 上添加策略。

相关内容