首页/网络/BGP 与广域网速查/FRR + IPsec:VTI 隧道上跑 BGP
IPsec VPN60 条

FRR + IPsec:VTI 隧道上跑 BGP

Linux 用 XFRM/VTI 接口承载 IPsec,FRR 在隧道接口上建立 BGP 邻居,内网路由随 BGP 走隧道;VTI 的 key 需与 IPsec 策略 mark 对应。

BGP 与广域网速查网络更新于 2026-10-13

VTI 上跑 BGP 的思路

Linux 上做 IPsec 有两种组织方式:一种是策略驱动的传统方式,靠 xfrm 策略匹配流量;另一种是路由驱动的 VTI(虚拟隧道接口)方式,把 IPsec 隧道表现为一个可配置地址的网卡接口,路由指向该接口就自动触发加密。VTI 的好处是能与路由协议自然配合:FRR 在这个接口上建立 BGP 邻居,内网路由随 BGP 一起走隧道,不需要为每个网段维护一条 xfrm 策略。配置的关键点在于接口的 key 参数必须与 IPsec 策略或 SA 的 mark 值对应,两者不一致时会出现「接口起来了但流量不加密」或「加密流量进不了接口」的情况。

基本信息

接口创建ip tunnel add vti0 mode vti local <本端> remote <对端> key <值>
关键参数key 需与 IPsec 策略 mark 对应
地址配置给 VTI 接口分配隧道互联地址
策略处理可设置 disable_policy 由路由驱动加密
路由协议FRR 在 VTI 接口上建立 BGP 邻居
核对ip -s xfrm state 与 FRR 邻居状态

典型使用场景

  • 云主机与对端网关建立动态路由的加密隧道
  • 多网段场景:用 BGP 通告网段,避免为每段配置 xfrm 策略
  • 与网络设备对接:设备侧使用 VTI 或隧道接口时结构一致
  • 自动化部署:VTI 与 FRR 配置均可脚本化管理
  • 排障:分别核对 xfrm 状态与 BGP 邻居状态定位问题层次

Linux 与 FRR 配置要点

Linux 与 FRR 配置要点
# 创建 VTI 接口并配置地址
ip tunnel add vti0 mode vti local 198.51.100.1 remote 203.0.113.2 key 42
ip addr add 169.254.100.1/30 dev vti0
ip link set vti0 up
sysctl -w net.ipv4.conf.vti0.disable_policy=1
# FRR 在 VTI 上建立 BGP 邻居
vtysh -c 'conf t' -c 'router bgp 65001' \
  -c 'neighbor 169.254.100.2 remote-as 65002' -c 'end'
# 核对加密状态与邻居状态
ip -s xfrm state
vtysh -c 'show ip bgp summary'

排障分层

检查项命令异常含义
接口状态ip link show vti0接口未起则路由无法生效
xfrm 状态ip -s xfrm state无 SA 说明策略或 key 不匹配
加解密计数ip -s xfrm state 的计数计数不增长说明流量未匹配
BGP 邻居show ip bgp summary邻居不通需先确认隧道可达
策略处理确认 disable_policy 设置设置不一致会导致双份处理
VTI 与策略驱动方式不要在同一对端上混用:同一份流量被两套机制同时处理,现象会非常难判断。
隧道接口本身没有检测能力,建议引入 BFD 或依赖 BGP 的 Hold 与 BFD 联动来感知对端故障。

易错点

  • key 值与策略 mark 不匹配:接口能起但流量不被加密或加密流量进不来
  • 隧道接口未配置地址:BGP 邻居源地址无法确定,邻居建不起来
  • 与策略驱动方式混用:同一流量被两套机制处理,行为难以预测
  • 忽略 MTU 与 MSS:隧道封装增加开销,大包不通表现为业务偶发异常
  • 只验证 ping 通就认为完成:加密是否真的生效要看 xfrm 计数与 SA 状态

数据来源与参考

  • Linux ip-tunnel 手册
  • FRR 文档:BGP 邻居配置
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌