strongswan进程启动后只运行在一个namespace(网路ns)中,后面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 dev vti-to111
ip link set up dev vti-to111
ip addr add 12.1.1.1/24 dev lo
ip link set up dev lo
ip route add 11.1.1.0/24 via 111.1.1.1
#设置相关系统参数
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.ip_vti0.disable_policy=1
sysctl -w net.ipv4.conf.vti-to111.disable_policy=1
#退出namespace,配置strongswan
exit
#cat /etc/strongswan/ipsec.conf
conn site1-site2
leftid=172.16.0.196
left=172.16.0.196
#leftsubnet=0.0.0.0/0
leftsubnet=12.1.1.0/24
rightid=172.16.1.111
right=172.16.1.111
#rightsubnet=0.0.0.0/0
rightsubnet=11.1.1.0/24
authby=secret
mark=12
auto=route
keyexchange=ikev2
ike=aes-sha1-modp1024
ikelifetime=86400s
esp=aes-sha1-modp1024
lifetime=86400s
type=tunnel
#cat /etc/strongswan/ipsec.secrets
%any %any : PSK test
#设置charon.conf配置文件下的两个参数
#vim /etc/strongswan/strongswan.d/charon.conf
install_routes = no
install_virtual_ip = no
#这两个参数配置之后就没有这条策略路由了,策略模式下才有
#ip rule
220: from all lookup 220
# 重启strongswan
strongswan restart
用户侧:
#配置strongswan
#cat /etc/strongswan/ipsec.conf
conn site1-site2
leftid=172.16.1.111
left=172.16.1.111
#leftsubnet=0.0.0.0/0
leftsubnet=11.1.1.0/24
rightid=172.16.0.196
right=172.16.0.196
#rightsubnet=0.0.0.0/0
rightsubnet=12.1.1.0/24
authby=secret
#mark=12
auto=route
keyexchange=ikev2
ike=aes-sha1-modp1024
ikelifetime=86400s
esp=aes-sha1-modp1024
lifetime=86400s
type=tunnel
#cat /etc/strongswan/ipsec.secrets
%any %any : PSK test
#配置ip地址
ip addr add 11.1.1.1/24 dev lo
#不需要配置路由,ipsec已经配置好了
[root@sheng-111 /root]
#ip rule
0: from all lookup local
220: from all lookup 220
32766: from all lookup main
32767: from all lookup default
[root@sheng-111 /root]
#ip route ls table 220
12.1.1.0/24 via 172.16.1.199 dev eth1 proto static src 11.1.1.1
#重启strongswan
strongswan restart
验证:
#两端sa建立成功:
#strongswan status
Routed Connections:
site1-site2{1}: ROUTED, TUNNEL, reqid 1
site1-site2{1}: 11.1.1.0/24 === 12.1.1.0/24
Security Associations (1 up, 0 connecting):
site1-site2[1]: ESTABLISHED 38 minutes ago, 172.16.1.111[172.16.1.111]...172.16.0.196[172.16.0.196]
site1-site2{2}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: c22598ea_i cf6ed9df_o
site1-site2{2}: 11.1.1.0/24 === 12.1.1.0/24
#从客户端ping测试
#ping 12.1.1.1 -I 11.1.1.1
PING 12.1.1.1 (12.1.1.1) from 11.1.1.1 : 56(84) bytes of data.
64 bytes from 12.1.1.1: icmp_seq=1 ttl=64 time=0.674 ms
64 bytes from 12.1.1.1: icmp_seq=2 ttl=64 time=0.692 ms
#从网关侧抓包,可以发现用户数据报文(icmp)报文只会暴露在namespace中,原始namespace只能抓到esp包。
最后,当然要撸一遍vti的代码,在 net/ipv4/ip_vti.c中实现了大部分的逻辑。
网友评论