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介绍
什么是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。
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下:
2、修改配置文件
修改控制节点上neutron.conf文件
在service_plugins增加对VPN插件的支持,修改如下所示:
修改控制节点上vpn_agent.ini文件
因为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
创建ipec policy
创建vpn-service服务
ROUTER:VPN关联的router
SUBNET:VPN要保护的内网
在没有创建下一步的ipsec-site-connection之前,status的状态会一直是pending状态,创建了ipsec-site-connection,并且创建成功后才会变为active
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.100Openstack2:
管理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
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服务日志可能会有以下情况
这种情况忽略就行,不耽误创建vpn服务,这个是Juno版本的bug
下面开始创建VPN服务以及密钥key等
创建VPN服务指定路由以及内网subnet,点击添加完成的时候会变成panding状态,,属于正常情况,下一步创建ipsec站点到站点
至此VPNaas就算搭建完毕了在对端也做相应的配置即可。
目前juno只支持ipsec的vpn 但是其实稍微修改代码pptp和openvpn也都是可以支持的,下面看看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方法
- Openstack VPNaas
- OpenStack IPSec VPNaaS ( by quqi99 )
- VPNaaS in Neutron
- Neutron印象7:VPNaas
- neutron-vpnaas之ipsec-vpn学习总结
- neutron-vpnaas添加证书认证总结
- OpenStack
- OpenStack
- OpenStack
- OpenStack
- OpenStack
- openstack
- OpenStack
- openstack
- OpenStack
- Openstack
- openstack
- openstack
- 趣味编程:打印日历
- iOS 删除已经配置的类库和移除CocoaPods
- 如何写出好的Java代码
- sencha touch中的日期控件
- js父子页面跨域访问
- Openstack VPNaas
- 个人笔记 css 02 css超链接取消下划线,点击之后不变色
- js判断请求的url是否可访问,支持跨域判断
- 【android】音乐播放器之UI设计的点点滴滴
- 单例模式(Singleton Pattern)
- 关于<%# Eval("createTime"%>的时间格式转换
- 如何提高SQL查询效率
- 最大连续子数组和。
- 仿Ios顶部TAB