OpenStack-Neutron-VPNaaS-代码

默认我们创建好了ide策略、ipsec策略和vpn服务,因为这几个都是直接在数据库中添加记录,不实际做其他事情

下面看看创建一个连接的代码
路径: neutron/services/vpn/plugin.py

类:VPNPluginDb

方法:create_ipsec_site_connection

这个方法会首先创建数据库的ipsec_site_connection记录

def create_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类中的方法开始底层的操作
    return ipsec_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

def create_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方法

def sync(self, context, routers):
    vpnservices = self.agent_rpc.get_vpn_services_on_host(
        context, self.host)#获取数据库中有关vpn的记录列表
    router_ids = [vpnservice[‘router_id‘] for vpnservice in vpnservices]
    # Ensure the ipsec process is enabled
    for vpnservice in vpnservices:
        process = self.ensure_process(vpnservice[‘router_id‘],
                                      vpnservice=vpnservice) #创建openswan进程,初始化文件和目录,数据库字段过滤等等
        self._update_nat(vpnservice, self.agent.add_nat_rule) #在路由空间中创建nat规则
        process.update() #启动openswan进程

    # Delete any IPSec processes that are
    # associated with routers, but are not running the VPN service.
    for router in routers:
        #We are using router id as process_id
        process_id = router[‘id‘]
        if process_id not in router_ids:
            process = self.ensure_process(process_id)
            self.destroy_router(process_id)

    # Delete any IPSec processes running
    # VPN that do not have an associated router.
    process_ids = [process_id
                   for process_id in self.processes
                   if process_id not in router_ids]
    for process_id in process_ids:
        self.destroy_router(process_id)
    self.report_status(context)

  

启动openswan进程
def update(self):
    """Update Status based on vpnservice configuration."""
    if self.vpnservice and not self.vpnservice[‘admin_state_up‘]:
        self.disable()
    else:
        self.enable()

    if plugin_utils.in_pending_status(self.vpnservice[‘status‘]):
        self.updated_pending_status = True

    self.vpnservice[‘status‘] = self.status
    for ipsec_site_conn in self.vpnservice[‘ipsec_site_connections‘]:
        if plugin_utils.in_pending_status(ipsec_site_conn[‘status‘]):
            conn_id = ipsec_site_conn[‘id‘]
            conn_status = self.connection_status.get(conn_id)
            if not conn_status:
                continue
            conn_status[‘updated_pending_status‘] = True
            ipsec_site_conn[‘status‘] = conn_status[‘status‘]

enable中调用start方法

def start(self):
    """Start the process.

    Note: if there is not namespace yet,
    just do nothing, and wait next event.
    """
    if not self.namespace:
        return
    virtual_private = self._virtual_privates()
    self.clear_pid() #这里需要清空对应目录中的pid文件,不然会报错

    #start pluto IKE keying daemon  #启动IKE守护进程
    self._execute([self.binary,
                   ‘pluto‘,
                   ‘--ctlbase‘, self.pid_path,
                   ‘--ipsecdir‘, self.ipsecd_dir,
                   #‘--use-netkey‘,
                   ‘--uniqueids‘,
                   ‘--nat_traversal‘,
                   ‘--secretsfile‘, self.secrets_file,
                   ‘--virtual_private‘, virtual_private
                   ])
    #add connections
    for ipsec_site_conn in self.vpnservice[‘ipsec_site_connections‘]:
        nexthop = self._get_nexthop(ipsec_site_conn[‘peer_address‘])
        self._execute([self.binary,
                       ‘addconn‘,
                       ‘--ctlbase‘, ‘%s.ctl‘ % self.pid_path,
                      # ‘--defaultroutenexthop‘, nexthop,
                       ‘--config‘, self.config_file,
                       ipsec_site_conn[‘id‘]
                       ])
    #TODO(nati) fix this when openswan is fixed
    #Due to openswan bug, this command always exit with 3
    #start whack ipsec keying daemon
    self._execute([self.binary,
                   ‘whack‘,
                   ‘--ctlbase‘, self.pid_path,
                   ‘--listen‘,
                   ], check_exit_code=False)

    for ipsec_site_conn in self.vpnservice[‘ipsec_site_connections‘]:
        if not ipsec_site_conn[‘initiator‘] == ‘start‘:
            continue

        #initiate ipsec connection
        self._execute([self.binary,
                       ‘whack‘,
                       ‘--ctlbase‘, self.pid_path,
                       ‘--name‘, ipsec_site_conn[‘id‘],
                       ‘--asynchronous‘,
                       ‘--initiate‘
                       ])

  

时间: 2024-10-10 18:02:59

OpenStack-Neutron-VPNaaS-代码的相关文章

[转] OpenStack IPSec VPNaaS

OpenStack IPSec VPNaaS ( by quqi99 ) 作者:张华  发表于:2013-08-03版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 http://blog.csdn.net/quqi99 ) 今天想review一下社区IPSec VNPaaS Driver的代码,所以系统看了一下这背后的知识.笔记如下: 什么是VPN VPN可以通过在L2或L3层建立一条逻辑链路让广域网上多个内网能够相互访问(我的理解,VPN除了让广域网的内

openstack neutron L3 HA

作者:Liping Mao  发表于:2014-08-20 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 最近Assaf Muller写了一篇关于Neutron L3 HA的文章很不错. 建议看原文,地址如下: http://assafmuller.wordpress.com/category/ml2/ 大致翻译如下: L3 Agent Low Availability(L3 agent的低可用性) 目前,在Openstack中,你只能用多个网络节点达到

深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(二)

在VPC功能实现第一篇中,简单介绍了一下VPC网络对租户间隔离能力的提升以及基于路由提供的一系列网络功能.在这一篇中,将继续介绍VPC网络中十分重要的一个内容:网络带宽的控制,共享以及分离. 首先是对第一篇中,端口转发功能的样例代码,all-in-one http service 风格的实现. 核心功能: find_router_ip = "ip netns exec qrouter-{router_id} ifconfig |grep -A1 qg- | grep inet | awk '{{

怎样写 OpenStack Neutron 的 Plugin (一)

鉴于不知道Neutron的人也不会看这篇文章,而知道的人也不用我再啰嗦Neutron是什么东西,我决定跳过Neutron简介,直接爆料. 首先要介绍一下我的开发环境.我没有使用DevStack,而是直接在电脑上安装了三个Virtual Box,然后根据OpenStack的Ubuntu 安装指南部署了一个环境:一个控制节点,一个网络节点和一个计算节点.接下来我会直接在控制节点上修改 <your path>/neutron/ 下面的文件,然后通过重启neutron 的各个service来更新我的修

怎样写 OpenStack Neutron 的 Extension (二)

接着之前一篇文章,再来谈谈 Extension 的具体实现问题.我使用的是本地数据库加远程API调用的方法,所以先要定义一下数据库中 myextension 如何存储.首先,我们可以在自己的 plugin 根目录下新建一个 db 文件夹,以及三个文件: - neutron/ - plugins/ - myplugin/ - __init__.py - plugin.py - extensions/ - db/ - __init__.py - db.py - models.py db.py 用来存

openstack Neutron分析(3)—— neutron-dhcp-agent源码分析

1.neutron dhcp3个主要部件分别为什么?2.dhcp模块包含哪些内容?3.Dnsmasq配置文件是如何创建和更新的?4.DHCP agent的信息存放在neutron数据库的哪个表中? 扩展: neutron-dhcp-agent在neutron的作用是什么? 一.概述 neutron dhcp为租户网络提供DHCP服务,即IP地址动态分配,另外还会提供metadata请求服务. 3个主要的部件:DHCP agent scheduler:负责DHCP agent与network的调度

OpenStack Neutron 之 Load Balance

OpenStack Neutron 之 Load Balance 负载均衡(Load Balance)是 OpenStack Neutron 支持的功能之一.负载均衡能够将网络请求分发到多个实际处理请求的虚机上,这样能有效处理高流量的网络请求,负载均衡在现实中有很多使用场景.本文将基于 Neutron 所提供的负载均衡,介绍其基本概念.实现过程,并验证其功能. Neutron Load Balance 简介 负载均衡(Load Balance)其实早在 OpenStack 的 Grizzly 版

带着问题了解Openstack Neutron安全组

本文是由最近一个Openstack Neutron安全组的问题所触发而写.希望之后借此机会深入探讨一下iptables和netfilter相关用法.原理等. 本节先看看网络问题的解决思路以及Openstack Neutron安全组,之后再开篇细讲背后的网络内核netfilter. 问题简述 公司系统部同事为业务部门创建lvs服务时,Linux Director与Real Server间无法进行正常的通讯,Real Server是由Hulk平台创建的openstack虚拟机. 网络问题排查,按照"

怎样写 OpenStack Neutron 的 Extension (四)

上文说到需要在 /neutronclient/v2_0/myextension/extension.py 中分别定义五个 class:List/Show/Create/Delete/UpdateExtension.具体形式如下: import argparse import logging from neutronclient.neutron import v2_0 as neutronV20 from neutronclient.openstack.common.gettextutils im

如何区分 OpenStack Neutron Extension 和 Plugin

Neutron 里面的 extension 和 plugin 是非常相似的两个概念,我花了好久才貌似搞懂了两者的区别,还不一定完全正确. 在OpenStack 的官网wiki中,可以找到它们两个的定义: Plugin: Neutron exposes a logical API to define network connectivity between devices from other OpenStack services (e.g., vNICs from Nova VMs). The