strongswan进程启动后只运行在一个net namespace中,后面ike协商出来的所有sa都只存在于一个namespace,对于一个多用户的系统,不同用户的网络可能有重叠,使用namespace做用户隔离是常用手段,对于ipsec,如果使用strongswan做ike协商就有如果使其支持namespace的问题。
开始通过修改strongswan的源码使其支持namespace,原理也比较简单,主要使strongswan于内核通讯(下policy,state表项)的netlink支持namespace即可,根据不同的conn名称,netlink在不同的namespace中创建,修改量不是很大,也运行过一段时间,但是可能是对源码的理解深度不够,除了几个bug,有些bug很难定位。
最近突发发现,使用linux的vti虚拟接口可以使ipsec支持namespace,配置简单,不需要修改源码,当然linux自己的东西肯定比改吧改吧源码稳定。
这里记录一下使用方法,ipsec的一侧(用户侧)基于policy触发协商,另一侧(网关侧)使用vti做用户隔离。
网关侧:
#创建vti接口
ip tunnel add vti-to111 mode vti local 172.16.0.196 remote 172.16.1.111 key 12
#创建namespace
ip netns add test
#设置vti接口的namespace
ip link set netns test dev vti-to111
#配置vti接口的ip地址,和相关路由
ip netns exec test bash
ip addr add 111.1.1.2/24 de