Openstack VPNaas

来源:互联网 发布:逆袭网络剧全集百度云 编辑:程序博客网 时间:2024/06/07 02:41

问题导读


1、什么是VPN?

2、虚拟机之间如何互相访问?

3、集群中如何为OpenStack安装VPN?


在Openstack的Havana版本中,neutron增加的一个功能就是VPNaas,将VPN功能引入到了neutron中,虽然在Havana版中只支持IPSec协议的VPN,功能还比较弱,但这个关键特性已经有了,后续会不断加强该特性,在这次的design summit会议上也有专门议题讨论了icehouce版本中VPNaas会做什么,具体可以参考这里,在介绍VPNaas之前,先简单说一下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层的标签在途径的每个路由器上都事先算好了,并且这种标签是自动配置的,所以添加一个新站点很方便

在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下:

  1. apt-get install neutron-plugin-vpn-agent
  2. apt-get install openswan
复制代码


2、修改配置文件


修改控制节点上neutron.conf文件


在service_plugins增加对VPN插件的支持,修改如下所示:


  1. service_plugins =neutron.services.vpn.plugin.VPNDriverPlugin
复制代码


修改控制节点上vpn_agent.ini文件


在DEFAULT中添加:
  1. interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
复制代码

因为VPN agent是继承l3 agent的,所以必须添加interface_driver选项,不然代码会报错。


在/etc/neutron/rootwrap.d目录下放入权限管理文件:vpnaas.filters,默认安装时该目录下没有该文件,所以必须手动将该文件放入,不然运行时会报


没有操作权限的错误。


VPN使用指导


创建router和external network

VPN服务是运行在三层网关上的,所以创建VPN之前要先创建一个router,并为这个router创建一个external network。 如果VPN关联的router没有

external network,创建VPN服务时不会报错,但运行时会报错。

创建ike policy


ike policy是用来作密钥管理的,操作命令如下:
  1. neutron vpn-ikepolicy-create ikepolicy1
复制代码


创建ipec policy


用来配置ipsec的加密算法、使用模式、密钥生存期、使用协议等
  1. neutron vpn-ipsecpolicy-create ipsecpolicy1
复制代码


创建vpn-service服务
  1. neutron vpn-service-create ROUTER SUBNET
复制代码


ROUTER:VPN关联的router


SUBNET:VPN要保护的内网


 


在没有创建下一步的ipsec-site-connection之前,status的状态会一直是pending状态,创建了ipsec-site-connection,并且创建成功后才会变为active


创建ipsec-site-connection服务
  1. 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数据包:

 



Openstack VPNAAS部署

对于Openstack vpnaas的文档网上流传着很多大部分都是G版本或者H版本,而且资料很少,基本都是抄来抄去,我今天在这里给大家说的是Juno版本如何搭建Openstack 高级功能VPNaas服务。

首先环境准备:

A区域

Controller Node:192.168.30.10

Network Node:192.168.30.11

Compute Node:192.168.30.12

B区域

Controller Node:192.168.40.10

Network Node:192.168.40.11

Compute Node:192.168.40.12

Openstack 部署我这里就不再叙述了详情看我的部署博文,这里着重讲下Openstack 高级功能VPNaas服务部署。

安装步骤:

On network node:

1. 安装VPNaas

apt-get install neutron-plugin-vpn-agent openswan

2.检查下vpnaas.filters里面有没有以下内容,没有则添加即可

root@neutron:~# vi /etc/neutron/rootwrap.d/vpnaas.filters

wKioL1VZdbuj7kSdAAD0-1l_hss355.jpg


3. 配置vpn_agent.ini文件

cat > /etc/neutron/vpn_agent.ini << EOF

[DEFAULT]

interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver

[vpnagent]

vpn_device_driver=neutron.services.vpn.device_drivers.ipsec.OpenSwanDriver

[ipsec]

ipsec_status_check_interval=60

EOF

4. 编辑sysctl.conf文件添加以下内容:

net.ipv4.ip_forward =1

net.ipv4.conf.default.accept_redirects = 0 #让NETKEY(即netlink)不要发假的ICMP转发

net.ipv4.conf.default.send_redirects = 0

5. 检查下系统是否满足要求:

ipsec verify

6.在controller node以及network node编辑neutron.conf添加以下内容

service_plugins = router,vpnaas

7.重启neutron服务以及VPN服务

service neutron-server restart

service neutron-vpn-agent restart

注意事项:

vpn服务日志可能会有以下情况

wKioL1VZddfBIAj8AAF5o9FKjdc460.jpg

这种情况忽略就行,不耽误创建vpn服务,这个是Juno版本的bug

下面开始创建VPN服务以及密钥key等

wKioL1VZdfTzg28EAAEGjwVXnUY540.jpg

wKiom1VZdHrQe7S_AAEE5rXPPn8957.jpg

创建VPN服务指定路由以及内网subnet,点击添加完成的时候会变成panding状态,,属于正常情况,下一步创建ipsec站点到站点

wKiom1VZdHqRyRd8AAEktk1g_Yc604.jpg

wKioL1VZdfXggMuGAAI89g5pSPQ345.jpg

wKioL1VZdfWSilPoAAD3FFcqY1Y130.jpg

至此VPNaas就算搭建完毕了在对端也做相应的配置即可。


目前juno只支持ipsecvpn  但是其实稍微修改代码pptpopenvpn也都是可以支持的,下面看看vpn服务的代码流程:
  默认我们创建好了ide策略、ipsec策略和vpn服务,因为这几个都是直接在数据库中添加记录,不实际做其他事情

 

下面看看创建一个连接的代码
路径: neutron/services/vpn/plugin.py
  类:VPNPluginDb
  方法:create_ipsec_site_connection
  这个方法会首先创建数据库的ipsec_site_connection记录



defcreate_ipsec_site_connection(self, context, ipsec_site_connection):

ipsec_site_connection= super(
VPNDriverPlugin,self).create_ipsec_site_connection(
context,ipsec_site_connection)# 1.创建数据库记录
driver =self._get_driver_for_ipsec_site_connection(

context,ipsec_site_connection) # 2.获取driver,在配置文件配置的,这里是ipsec
driver.create_ipsec_site_connection(context,ipsec_site_connection) #3.
调用vpn_service类中的方法开始底层的操作
returnipsec_site_connection


  1.
  路径:neutron/db/vpn/vpn_db.py
  类:VPNPluginDb

  方法:create_ipsec_site_connection
  这个方法里面会根据ipsec_site_connection来获取vpn服务的id,ike策略id,ipsec策略id
从而得到数据中对应的vpn服务,ide策略,ipsec策略的数据记录,最后创建ipsec_site_connection数据库记录
  3.
  路径: neutron/services/vpn/service_drivers/ipsec.py
  类:VPNPluginDb
  方法:create_ipsec_site_connection
  调用rpc方法vpnservice_updated



defcreate_ipsec_site_connection(self, context, ipsec_site_connection):

vpnservice= self.service_plugin._get_vpnservice(
context,ipsec_site_connection['vpnservice_id'])
self.agent_rpc.vpnservice_updated(context,vpnservice['router_id'])

  路径: neutron/services/vpn/device_drivers/ipsec.py
  类:IPsecDriver
  方法:vpnservice_updated,该方法调用sync方法


0 0
原创粉丝点击