VPNaaS in OpenStack

2013-11-21 Lingxian Kong 更多博文 » 博客 » GitHub »

openstack, neutron, vpnaas

原文链接 https://lingxiankong.github.io/2013-11-21-VPNaaS.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


Author:华为云计算工程师 史汉璋

在Openstack的Havana版本中,neutron增加的一个功能就是VPNaas,将VPN功能引入到了neutron中,虽然在Havana版中只支持IPSec协议的VPN,功能还比较弱,但这个关键特性已经有了,后续会不断加强该特性,在这次的design summit会议上也有专门议题讨论了icehouce版本中VPNaas会做什么,具体可以参考这里,在介绍VPNaas之前,先简单说一下VPN的一些基本概念, 参考资料

VPN介绍

什么是VPN

VPN可以通过在L2或L3层建立一条逻辑链路让广域网上多个内网能够相互访问。VPN的实现方式很多,有基于租用专用物理线路实现的(如帧中继和ATM,因为是专用线路,贵啊,但QoS好,对语音等对延迟敏感的数据流至关重要,可运行上层的IP,IPX, AppleTalk,IP多播多种协议),也有基于以太网的虚连接的实现方式(不是专用线路,灵活,数据通道不安全要结合如IPSec来保证)分类如下:

  • ATM和帧中继都是L2层VPN
  • GRE,L2TP,MPLS和IPSec属于L3层VPN技术

GRE VPN:建VPN很方便,但没有安全机制,需结合IPSec来支持身份验证、完整性、访问控制和机密性。
SSL VPN:这种VPN的最大好处在于,仅需要一个单独的TCP或UDP端口便可以轻易穿越大多数防火墙进行数据传送
MPLS VPN:当使用GRE这些遂道技术来实现VPN时,因为是点至点的,当新添一个站点,需修改每个站点的VPN配置。MPLS是在传数据之前就先用L3层的路由机制将L2层的标签在途径的每个路由器上都事先算好了,并且这种标签是自动配置的,所以添加一个新站点很方便

IPSec VPN

在Havana版本中仅实现了IPSec VPN,为了方便在neutron中操作VPNaas,先介绍IPSec的一些基本概念。
IPSec的使用模式:

  • IPSec传输模式:传输过程中IPSec源端点不会修改IP报中的目标IP地址。
  • IPSec遂道模式:传输过程中IPSec源端点会修改IP报中的目标IP地址。
    在neutron中使用的就是IPSec的遂道模式。

IPSec中的两个重要协议:

  • AH:它使用消息摘要算法生成一个散列值,包括不变的报头字段(如源IP,目标IP),不同于ESP,不提供机密性,即不加密数据本身,所以不是很有用。计算报头摘要时要排除一些可变字段(如服务类型ToS,标记,分段偏移、存活时间TTL和报头校验和)。关于IPSec与NAT,NAT要发挥作用,它可能要修改IP源地址、目标地址、源端口、目标端口、IP和TCP报头的校验和、TCP序列号和确认号以及有效负载中的IP地址。因为,使用AH时,NAT不可行。
  • ESP:提供机密性、数据完整性、数据来源验证和反重放功能。对于IPSec传输模式,使用ESP时NAT依然不可行。但在遂道模式下,只要NAT执行1:1的地址转换,不将多个内网地址转换一个外部地址并使用端口来区分它们,NAT和ESP便可以共存。一个最简单的办法就是在IPSec之间执行NAT,但这并非总是可能的,所以有了NAT跨越技术(NAT Traversal, NAT-T),它由三部分组成,首先判断远程peer是否支持NAT跨越,其次是检测peer之间的路径上是否有NAT;最后是决定如何使用UDP封闭来处理NAT。

IPsec IKE密钥交换协议

Internet 密钥交换(IPsec IKE)是 IPsec 体系结构中的一种主要协议。它是一种混合协议,使用部分 Oakley 和部分 SKEME,并协同 ISAKMP 提供密钥生成材料和其它安全连系,比如用于 IPsec DOI 的 AH 和 ESP 。

VPN安装部署

Neutron中VPN代码架构

下面介绍一下VPNaas在neutron中的实现,VPNaas的模块架构如下图所示

逻辑架构即在Network node的router上安装openswan来为内部的子网提供vpn服务

安装指导

1、安装所需软件
VPNass是运行在Network node节点上的,所以要在Network node节点上安装以下两个包:
(a) neutron-plugin-vpn-agent:vpn agent代码
(b) openswan:ipsec 软件
Ubuntu下:
apt-get install neutron-plugin-vpn-agent
apt-get install openswan

2、修改配置文件
修改控制节点上neutron.conf文件
在service_plugins增加对VPN插件的支持,修改如下所示:
service_plugins =neutron.services.vpn.plugin.VPNDriverPlugin

修改控制节点上vpn_agent.ini文件
在DEFAULT中添加:
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
因为VPN agent是继承l3 agent的,所以必须添加interface_driver选项,不然代码会报错。
在/etc/neutron/rootwrap.d目录下放入权限管理文件:vpnaas.filters,默认安装时该目录下没有该文件,所以必须手动将该文件放入,不然运行时会报没有操作权限的错误。

VPN使用指导

  1. 创建router和external network
    VPN服务是运行在三层网关上的,所以创建VPN之前要先创建一个router,并为这个router创建一个external network。 如果VPN关联的router没有external network,创建VPN服务时不会报错,但运行时会报错。
  2. 创建ike policy
    ike policy是用来作密钥管理的,操作命令如下:
    neutron vpn-ikepolicy-create ikepolicy1
  3. 创建ipec policy
    用来配置ipsec的加密算法、使用模式、密钥生存期、使用协议等
    neutron vpn-ipsecpolicy-create ipsecpolicy1
  4. 创建vpn-service服务
    neutron vpn-service-create ROUTER SUBNET
    ROUTER:VPN关联的router
    SUBNET:VPN要保护的内网

    在没有创建下一步的ipsec-site-connection之前,status的状态会一直是pending状态,创建了ipsec-site-connection,并且创建成功后才会变为active
  5. 创建ipsec-site-connection服务
    neutron ipsec-site-connection-create --name vpnconnection1 --vpnservice-id 1906af89-2059-4388-a91f-a6186086c558 --ikepolicy-id ikepolicy1 --ipsecpolicy-id ipsecpolicy1 --peer-address 200.200.128.151 --peer-id 200.200.128.151 --peer-cidr 20.20.20.0/24 --psk secret
    vpnservice-id:第四部创建的vpn-service的id
    peer-address:对端VPN的IP地址
    peer-cidr:对端VPN要保护的内网IP psk:IKE要使用的共享密钥

    如果对端VPN不存在,status状态会一直为down

VPN功能验证

VPN服务可以为不同数据中内网互访提供服务,为了模拟这个场景,我创建了两套单独的openstack环境,环境信息如下,感兴趣的可以自己操作一下。

Openstack1:
管理IP:172.25.100.242
使用VPN通信的subnet:10.10.10.0/24
External network的网关:200.200.128.100

Openstack2:
管理IP :172.25.100.243
使用VPN通信的subnet:20.20.20.0/24
External network的网关:200.200.128.151

在Openstack1创建的vpn-service如下:

创建的ipsec-site-connection如下:

在Openstack2创建的vpn-service如下:

创建的ipsec-site-connection如下:

在没有建立VPN连接之前,两套openstack中的虚拟机是没办法正常通信的,建立VPN连接后,虚拟机之间就可以互相访问了。

Openstack1中的虚拟机:

Openstack2中的虚拟机:

在Openstack1中的虚拟机直接ping Openstack2中的虚拟机:

在Openstack2中的br-ex管理的网口上抓包,可以看到封装后的IPSec数据包: