之前写的一个:[dev][ipsec] 基于路由的VPrivateN
一
我们默认用strongswan的时候基于策略的. 也就是policy. 基于策略的ipsec中, policy承担了两部分功能
一是访问权限的控制功能, 另一个是路由的功能. linux kernel做完路由之后会在查询policy,从而确定要将包转发给哪一个SA.
二
基于一中的描述, 我们现在要做基于路由的ipsec, 也就是说将路由功能从policy中去除出来, 在路由表中使用路由条目来做.
于是在这里需要解决的就是路由指向下一条的问题, 而这个下一条就是Ipsec SA.
三
现在引入一个概念叫做VTI(Vitual Tunnel Interface), VTI是内核中的一种设备. 使用如下命令添加:
ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
我们看见, 创建vti时指定了一个key, 这个key便是与SA之间的关联. 见下面的例子如何完成这样一个关联:
# ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR # ip link set vti1 up # ip addr add LOCAL_VIRTUAL_ADDR/24 dev vti1 # ip xfrm state add src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR spi SPI PROTO ALGR mode tunnel # ip xfrm state add src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR spi SPI PROTO ALGR mode tunnel # ip xfrm policy add dir in tmpl src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR PROTO mode tunnel mark VTI_KEY # ip xfrm policy add dir out tmpl src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR PROTO mode tunnel mark VTI_KEY
这样呢. 这个新增的VTI就等价于SA, 我们只有正常的配置路由, 将流量路由到这个VTI上, 便等于完成了基于路由的IPsec.
四
三里边我们使用iproute工具做的配置, strongsan里同样如此. 在配置的时候, 比如有一个mark的配置项,用来关联SA
mark_in = mark_out = 42
五
基于一中的分析. 我们在基于路由的场景下将police的功能进行了分离. 所以policy的原有的策略控制功能和定义并没有发生变化.
双端还是可以自由的协商出需要的安全策略.
六
VTI是有很多局限性的, 最新的kernel里新增了类型名叫做xfrm的interface, 作为VTI的下一代. 见:
https://lwn.net/Articles/757391/
七
基于二, 我们解决这个问题的方法有很多, 只要能达成路由到SA的包转发.
处理VTI, XFRM, 还可以用GRE.
见:https://wiki.strongswan.org/projects/strongswan/wiki/RouteBasedVPN
八
所有问题的关键,都在于将作为工具的interface将SA进行关联.
VTI用了 key/mark (mark_in = mark_out = 42)
XFRM用了 interface Id (if_id_in|out in swanctl.conf)
GRE在strongswan中使用这样一个配置: (local|remote_ts=dynamic[gre] in swanctl.conf)
另外, 如果你使用strongswan的话, 需要改一下这个, 因为基于策略时他会在路由表里加东西: charon.install_routes=0