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 联动来感知对端故障。