修改openstack默认安全组规则_openstack安全组规则_昆仑云王工的博客-程序员宅基地

技术标签: security group rule  openstack  

因为项目有一个新的需求,需要修改openstack中每次新建租户后的默认安全组规则。

首先先来分析一下:

我用的openstack版本为queens。每次新建租户后本来是没有安全组的,当使用新租户第一次访问dashboard的安全组列表或者调用API时,openstack会自动的为该租户创建一个default安全组,有4条规则。如图

大意就是

1)允许使用该安全组的虚拟机向外部发送一切数据包。

2)阻止所有外部的数据包到达使用该安全组的虚拟机(来自于同一个default安全组的主机的数据包除外)。

我的目标是增加两条安全组规则,①允许外部所有TCP包访问虚拟机 ②允许外部ping虚拟机。

实现这个功能需要修改源代码,非常简单。

直接修改源码,路径为/usr/lib/python2.7/site-packages/neutron/db/securitygroups_db.py,寻找方法create_security_group,源码实现如下:

def create_security_group(self, context, security_group, default_sg=False):
        #前面的创建安全组逻辑省略
        #重点是下面的创建安全组规则逻辑
            for ethertype in ext_sg.sg_supported_ethertypes:
                if default_sg:
                    # Allow intercommunication
                    ingress_rule = sg_obj.SecurityGroupRule(
                        context, id=uuidutils.generate_uuid(),
                        project_id=tenant_id, security_group_id=sg.id,
                        direction='ingress', ethertype=ethertype,
                        remote_group_id=sg.id)
                    ingress_rule.create()
                    sg.rules.append(ingress_rule)

                egress_rule = sg_obj.SecurityGroupRule(
                    context, id=uuidutils.generate_uuid(),
                    project_id=tenant_id, security_group_id=sg.id,
                    direction='egress', ethertype=ethertype)
                egress_rule.create()
                sg.rules.append(egress_rule)
            sg.obj_reset_changes(['rules'])
        #后面的通知广播逻辑省略

在这里的代码后面添加自己需要的安全组规则即可实现,修改后代码如下:

    def create_security_group(self, context, security_group, default_sg=False):
        # 前置逻辑省略
            for ethertype in ext_sg.sg_supported_ethertypes:
                if default_sg:
                    # Allow intercommunication
                    ingress_rule = sg_obj.SecurityGroupRule(
                        context, id=uuidutils.generate_uuid(),
                        project_id=tenant_id, security_group_id=sg.id,
                        direction='ingress', ethertype=ethertype,
                        remote_group_id=sg.id)
                    ingress_rule.create()
                    sg.rules.append(ingress_rule)

                egress_rule = sg_obj.SecurityGroupRule(
                    context, id=uuidutils.generate_uuid(),
                    project_id=tenant_id, security_group_id=sg.id,
                    direction='egress', ethertype=ethertype)
                egress_rule.create()
                sg.rules.append(egress_rule)
            #################### 自定义安全规则逻辑 start ####################
            #remote_ip_prefix定义了允许远端访问的IP地址段,0.0.0.0/0代表所有IP
            remote_ip_prefix = utils.AuthenticIPNetwork('0.0.0.0/0')
            #第一条规则,表示允许所有icmp协议访问安全组内部,即允许ping
            ingress_rule_1 = sg_obj.SecurityGroupRule(
                context, id=uuidutils.generate_uuid(),
                project_id=tenant_id, security_group_id=sg.id,
                direction='ingress', ethertype='IPv4',
                protocol='icmp',
                remote_ip_prefix=remote_ip_prefix)
            ingress_rule_1.create()
            sg.rules.append(ingress_rule_1)
            #第二条规则,表示允许所有tcp协议访问安全组内部机器所有端口
            ingress_rule_2 = sg_obj.SecurityGroupRule(
                context, id=uuidutils.generate_uuid(),
                project_id=tenant_id, security_group_id=sg.id,
                direction='ingress', ethertype='IPv4',
                protocol='tcp',
                remote_ip_prefix=remote_ip_prefix,port_range_max=65535,
                port_range_min=1)
            ingress_rule_2.create()
            sg.rules.append(ingress_rule_2)
            #################### 自定义安全规则逻辑 end ####################
            #后续逻辑不用动,在此省略
            sg.obj_reset_changes(['rules'])
           
           

修改完成后,删除/usr/lib/python2.7/site-packages/neutron/db/securitygroups_db.pyc文件,重新启动neutron服务。

systemctl restart neutron-server

新建租户,查看安全组规则列表,达到预期目的,效果图如下:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014706515/article/details/84657008

智能推荐

vim python-mode_VIM的插件python-mode介绍-程序员宅基地

最近在看vim的插件,也不是想把它作为开发环境,就觉得很好玩。Python我也就写一些小的代码,感觉这个也够用了。前一篇博客主要介绍Vundle,这篇介绍一下功能强大的python-mode这个插件。vim的插件网站先介绍一下vim的插件网站(http://vimawesome.com/),需要什么插件,可以先来看一下,分类我还是蛮详细的。这是python相关的插件,python-mode总的介绍...

python读什么文件最快的软件_这些方法,能够让你的 Python 程序快如闪电-程序员宅基地

原标题:这些方法,能够让你的 Python 程序快如闪电来源:机器之心讨厌 Python 的人总是会说,他们不想用 Python 的一个重要原因是 Python 很慢。而事实上,无论使用什么编程语言,特定程序的运行速度很大程度上取决于编写程序的开发人员以及他们优化程序、加快程序运行速度的技能。那么,让我们证明那些人错了!本文将介绍如何提升 Python 程序的效率,让它们运行飞快! 计时与性能分析..._python读写文件最快的工具

小程序视频video模块_video 在线地址-程序员宅基地

小程序视频video模块小程序官方文档地址: https://developers.weixin.qq.com/miniprogram/dev/component/video.html.视频模块基本的参数/* src 要播放视频的资源地址,支持云文件ID initial-time 指定视频初始播放位置 duration 指定视频时长 controls:true 是否显示默认播放控件(播放/暂停按钮、播放进度、时间) _video 在线地址

PyQt5控件概览-程序员宅基地

一: 什么是控件:一个程序界面上的各个独立元素(一块矩形区域)它一般具有如下的功能:1,用户点击,2,接收用户输入,3,展示内容,4,存放其他控件,二:大致浏览PyQt5中的所有控件: 1 初始常用控件: 2 基础控件 3 按钮: 4 QPushButton:只是点击 ...

推荐算法工程笔记:PySpark特征工程入门总结-程序员宅基地

PySpark Feature Tool1. 数据准备我们定义了一些测试数据,方便验证函数的有效性;同时对于大多数初学者来说,明白函数的输入是什么,输出是什么,才能更好的理解特征函数和使用特征: df = spark.createDataFrame([ ('zhu', "Hi I heard about pySpark"), ('xiang', "I wish python co..._pyspark getstopwords

windows10+python3.6+anaconda3.5.0+tensorflow1.8.0深度学习GPU环境配置_anaconda3.5、python3.6-程序员宅基地

1.安装cuda和cudann之前最好先安装visual studio,安装过程会用到这里面的一些东西。这里安装的是visual studio2015. visual studio2015(2017也是可以的)下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/;安装教程地址:https://blog.csdn.net/qq_40196164/article/details/843750942.cuda9.0下载安装。cuda9.0可以从N_anaconda3.5、python3.6

随便推点

红黑树 ----红黑树的C++完整实现源码_红黑树源码-程序员宅基地

红黑树的C++完整实现源码前言: 本人的原创作品红黑树系列文章,至此,已经写到第5篇了。虽然第三篇文章:红黑树的c源码实现与剖析,用c语言完整实现过红黑树,但个人感觉,代码还是不够清晰。特此,再奉献出一份c++的完整实现源码,以飨读者。 此份c++实现源码,代码紧凑了许多,也清晰了不少,同时采取c++类实现的方式,代码也更容易维护以及重用。ok,有任何问题,欢迎指正。_红黑树源码

大疆无人机M100的Onboard SDK的简介_onboard sdk什么意思-程序员宅基地

1.Onboard SDK,在下面将简称为OSDK。大疆提供的osdk支持下面4个平台: OSDK总体上可以分为上图四类,LINUX和ROS接口可以跑在带linux操作系统的板子上,Qt接口则可以跑在x86系统上,STM32接口可以跑在单片机上。你把源码架构看一遍比较一下就知道,这几个平台调用的核心API源码其实是一样的,这几种平台接口只是在不同平台对核心API接口进行封装和适配..._onboard sdk什么意思

L1正则化和L2正则化比较-程序员宅基地

机器学习监督算法的基本思路是 让拟合的模型尽量接近真实数据, 换句更通俗的话, 要让我们的模型尽量简单又能很好的反应已知数据之间关系。在这个贴近的过程可能存在两个截然相反的问题:过拟合和拟合不够。 拟合不够是模型预测值与真实值之间误差较大,上篇文章中提到梯度下降就是讨论解决问题(求损失函数最小)。 而正则化则是探讨过拟合的问题(当然正则化还能改善ill-posed(condition)等问题,本文...

Python面试的100多题之1-30(详细版)_pyqt有什么面试题-程序员宅基地

1、Python的函数参数传递:看两个如下例子,分析运行结果# 代码1a=1def fun(a): a=2fun(a)print(a) #1# 代码2a=[]def fun(a): a.append(1)fun(a)print(a). #[1]分析:在Python中,分为两种对象,一个是可更改的(例如:列表、字典),一个是不可更改的(例如:字符串、数字、元组)。第一个例子:当一个引用传递给函数的时候,函数自动复制一份引用,这个函数里的引用和外边的引_pyqt有什么面试题

php ajax实时验证表单,Ajax带提示的验证表单实例-程序员宅基地

这篇文章主要介绍了Ajax带提示的验证表单,可实现对表单输入进行实时提示的功能,非常简单实用,需要的朋友可以参考下本文实例讲述了Ajax带提示的验证表单。分享给大家供大家参考。具体如下:这是一个常用的Ajax表单验证程序,实时提示你输入的字符是否符合要求,简洁明快,便于修改,这是用JavaScript实现的,没有掺杂其它的框架类代码,因此比较实用。运行效果截图如下:具体代码如下:/p>"ht..._ajax实时检测表单

android gcc 版本,如何告诉Android Studio将GCC 4.9与CMake一起使用?-程序员宅基地

我在Android Studio 2.2上使用NDK r12.我需要CMake使用GCC 4.9而不是Clang来构建我们的代码库,但是即使我提供以下内容它仍然使用clang:android {compileSdkVersion 17buildToolsVersion "25.0.0"defaultConfig {minSdkVersion 15targetSdkVersion 17externa..._android gcc 版本

推荐文章

热门文章

相关标签