strongswan
我在(v5.2.0) 实例(站点 A)和路由器(站点 B)之间建立了一个站点到站点 IPsec 隧道并正在运行。一切运行正常,为站点 A ( ) 和 B ( )RouterOS
设置的两个私有子网中的主机可以正常相互通信。10.10.0.0/16
10.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.11
从10.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/16
,10.50.0.0/16
但我不明白为什么。
谢谢您的解释!
答案1
这转发政策不是由内核自动生成,但是由密钥守护进程(在本例中为 strongSwan)安装。
它们需要允许流量以隧道模式转发到 VPN 网关后面的主机和从 VPN 网关后面的主机转发。
对于发往网关本身未安装的 IP 的入站数据包,转发解密后搜索策略。对于本地流量,匹配的在查找策略。如果没有找到,则丢弃数据包。
对于不是在 VPN 网关本身生成的出站流量,转发搜索策略。如果数据包未加密,则没有匹配的转发找到策略。如果流量在两个隧道之间转发,则入站转发安装有该策略的策略将充当出站策略转发政策,反之亦然。之后,出去查找策略来决定是否要对数据包进行隧道传输。这就是为什么转发通常不需要出站方向的策略。
然而,如果出现掉线/拦截转发具有与所有内容匹配的低优先级策略(例如,在没有建立隧道的情况下,避免明文流量通过网关)转发明确要求在出站方向实施政策,因为堵塞否则,策略将丢弃所有未加密的流量。这就是 strongSwan 开始安装的原因转发双向政策5.5.0。
这个答案的先前版本指出,单个(入站)转发政策是对称的(即源码和夏令时无论如何)。事实并非如此,但如上所述,在很多情况下这并不重要。
答案2
安全策略 | 句法 | 意义 |
---|---|---|
本刊中包含“输出政策”的 | 目录输出 | SP 充当传出数据包的选择器,以选择哪些数据包需要加密+封装,哪些不需要 |
本刊中包含“输入政策”的 | 目录 | SP 充当已解密+解封装且在系统上具有本地目标 IP 的传入数据包的选择器 |
“前瞻性政策” | 前进方向 | SP 充当传入数据包的选择器,这些数据包已经解密+解封装,并且目标 IP 不是本地的,因此需要转发(路由)这些数据包 |
所以:
out
用于传出我们想要用 IPsec 加密+封装的流量(本地和转发)。in
和fwd
用于传入 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 in
A 上的策略处理。
从 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 上添加策略。