动机
IPsec 转发流量有两种方式,一种是基于策略,另外一种是基于路由。本文将尝试阐述基于路由的 IPsec 核心概念和实现原理并引出一些花式玩法。
IPsec 带给计算机世界的困惑
在计算机世界里面,核心的一个概念就是路由,其定义了某个指定的数据包要从哪个接口出去的规则。很多软件和命令都是基于这个事实来设计的。譬如 iproute 包,各类路由软件,iptables 等等。
但是在 IPsec 的世界里面,默认是根据内核里面的规则直接就进行了封装和转发,这导致用户理解困难,软件无法正常运作。举例而言,你没有办法通过增加一条路由来告诉计算机某个地址要通过 IPsec 隧道来走。
要解决这个问题,就只能用计算机世界里面最常用的手段:增加一层封装,虚拟出来一个设备,使其符合原来的世界规则。
这样从设计上来说就变成了:
IPsec 只管建立通道和进行封装转发
虚拟设备只管数据包怎么处理和路由
打通虚拟设备和 IPsec 的任督二脉
要从实际上解决这个问题,有两种方法。
第一种方法:VTI (Virtual Tunnel Interface) 的原理
最初往 Linux 增加 VTI 功能的作者提到:Virtual tunnel interface is a way to represent policy based IPsec tunnels as virtual interfaces in linux. This is similar to Cisco's VTI (virtual tunnel interface) and Juniper's representaion of secure tunnel (st.xx).