XFRM 状态和策略允许在没有虚拟接口的情况下配置 IPsec 加密。vti
但是,我认为和接口类型xfrm
可以通过虚拟接口路由流量,以启用基于路由策略的加密。我不确定如何配置这些接口以及 XFRM 状态和策略来支持此功能。
vti
和接口类型xfrm
列出了以下链接参数:
$ ip link help type vti
Usage: ... vti [ remote ADDR ]
[ local ADDR ]
[ [i|o]key KEY ]
[ dev PHYS_DEV ]
[ fwmark MARK ]
Where: ADDR := { IP_ADDRESS }
KEY := { DOTTED_QUAD | NUMBER }
MARK := { 0x0..0xffffffff }
$ ip link help type xfrm
Usage: ... xfrm dev [ PHYS_DEV ] [ if_id IF-ID ]
[ external ]
Where: IF-ID := { 0x1..0xffffffff }
这些参数的确切含义是什么(缺乏相关文档)以及它们与 XFRM 状态和策略定义有何关系?
XFRM 状态和策略具有以下参数列表(来自手册页):
ip xfrm state { add | update } ID [ ALGO-LIST ] [ mode MODE ] [ mark MARK [ mask
MASK ] ] [ reqid REQID ] [ seq SEQ ] [ replay-window SIZE ] [ replay-seq
SEQ ] [ replay-oseq SEQ ] [ replay-seq-hi SEQ ] [ replay-oseq-hi SEQ ] [
flag FLAG-LIST ] [ sel SELECTOR ] [ LIMIT-LIST ] [ encap ENCAP ] [ coa
ADDR[/PLEN] ] [ ctx CTX ] [ extra-flag EXTRA-FLAG-LIST ] [ output-mark OUT‐
PUT-MARK [ mask MASK ] ] [ if_id IF-ID ] [ tfcpad LENGTH ]
ip xfrm policy { add | update } SELECTOR dir DIR [ ctx CTX ] [ mark MARK [ mask
MASK ] ] [ index INDEX ] [ ptype PTYPE ] [ action ACTION ] [ priority PRI‐
ORITY ] [ flag FLAG-LIST ] [ if_id IF-ID ] [ LIMIT-LIST ] [ TMPL-LIST ]
这两个与 XFRM 状态和政策相关的示例用法也可以帮助澄清这个主题。
如果您有可用的 XFRM 接口,则不必担心 VTI。后者更加灵活,并且配置简单且符合逻辑(strongSwan 文档列出了 XFRM 接口的其他优点)。
基本上,在接口上配置相同的
if_id
(32 位数字)以及策略和 SA 以将它们关联起来。这允许在单个接口上使用多个不相关的策略/SA,而且还可以针对入站/出站流量甚至每个 SA 使用单独的接口。请注意,XFRM 接口甚至不必与策略和 SA 位于同一网络命名空间中。我认为目前设置物理接口没有效果,因此可以省略。并将external
接口设置为“收集元数据”模式,该模式允许每个名称空间的一个接口充当包罗万象的角色(例如,允许附加到其上的 eBPF 程序为if_id
数据包动态设置以选择不同的 SA)。为了完整起见,VTI 通过 IP 地址和标记与策略和 SA 关联。后者的配置有点奇怪,因为它是通过
[i|o]key
参数完成的(重用最初为 GRE 接口定义的参数)。remote
和地址local
必须与 SA 上的地址匹配(可以创建具有 的单个通配符 VTIremote 0.0.0.0
),并且 SA 和策略上的标记也必须匹配(入站 SA 除外,它不需要标记)。