女主宣言

本文出自于ADDOPS团队,该文章作者李文新是360 HULK云平台容器化及虚拟化平台运维开发工程师,负责网络模块的设计与开发。本文是由他最近解决的一个Openstack Neutron安全组问题所触发而写,让我们跟随作者的思路一起来了解Neutron Security Group和一般网络问题的解决思路吧。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

前言

本文主要用来记录最近解决的一个Openstack Neutron安全组的问题。在为业务部门创建lvs服务时,Linux Director与Real Server间无法进行正常的通讯,Real Server是由Hulk云平台创建的Openstack虚拟机。

网络问题排查,按照『确定网络结构 - 抓包定位 - 分析定位问题 - 纠正网络部署 - 单元测试 - 完整测试 -(推入生产)- 回归测试 - 总结回顾』的思路来就基本搞定了。

1

确定网络结构

遇到网络问题,首先考虑数据包在全流程中drop的位置,所以,首先我们要熟知Openstack Neutron网络的整个架构。 为了重点讲述Openstack Neutron网络及安全组,我们假设Linux Director和Real Server虚机所在的物理主机之间的网络可达。如下图是Openstack Neutron网络数据面的基本架构。

看下这个架构图,首先遇到一个特殊之处,我们暂且花点时间看一下: br-ethx与br-int是OVS创建的OVS Bridge,qbr-XXX是Linux Bridge,为什么不把虚机的Tap设备直接挂到OVS Bridge的br-int上,而在br-int和Tap设备间加个Linux Bridge qbr-XXX?

  1. Openstack Neutron需要在宿主机上执行一定的安全策略;

  2. Hulk平台使用的ovs版本是2.3.1,该版本尚未完全支持安全策略的内核模块实施部分:netfilter模块;

  3. 增加一个中间层Linux bridge可以解决网络策略配置。

Openstack Neutron网络各设备及配置请参考这里。

(http://www.sdnlab.com/13000.html)


接下来我们进入探索之旅。

2

抓包定位

在物理机和虚机上抓包:在客户端发送请求数据包后,分别在ABCDEFG七个点中抓包:

tcpdump -i xxx -nv | grep ipip

其中,在CDEFG 5个点都能抓到数据包,在AB两点没有抓到。

3

分析定位问题

问题出现在BC两点之间,即Linux bridge与Tap设备之间。Openstack Neutron在这两点之间利用iptables做安全策略,那么是如何实现的,为什么会丢包?反过来想,既然ssh能够连接上虚机,说明TCP数据包正常,更确信iptables安全策略存在问题。

下面,我们先了解下Openstack Neutron如何实现安全组策略。

4

Neutron安全组的iptables规则

Neutron L2 Agent承担使用iptables维护链和规则的任务。它为虚机的每块网卡的tap设备建立 i(进)、o(出)和s(防IP欺骗)链和规则,来实现:

1. prepares, updates, removes firewall filters (准备、更新和删除防火墙过滤器)

2. drops all packets by default (默认丢弃所有包)

3. prevents IP spoofing based on port's mac address (compatible with allowed_address_pairs extension) (防IP欺骗)

4. allows incoming DHCP and ICMPv6 RA (允许进入虚机的DHCP包和ICMPV6 RA)

5. blocks outgoing DHCP (禁止出虚机的DHCP包)

6. drops INVALID packets (丢弃无效状态的包)

7. allows stateful, established connections (允许有状态的并且已建立的连接,比如允许进来的ICMP的时候,从外面ping虚机时虚机的响应包是可以返回的)

8. converts security group rules to iptables rules (IPv4, IPv6, TCP, UDP, ICMP, ICMPv6) (将用户配置的规则转化为iptables规则)

9. multiple TCP/UDP ports per iptables rule using multiport module

支持 IPV4 和 IPV6

来看看Neutron为了实现这些功能添加的iptables链:

[root@w-openstack32 ~]# iptables -S | grep neutron

-N neutron-filter-top

-N neutron-openvswi-FORWARD             #neutorn定义的FORWARD链

-N neutron-openvswi-INPUT               #Neutron定义的INPUT链

-N neutron-openvswi-OUTPUT              #Neutron定义的OUTPUT链

-N neutron-openvswi-ibddxxxxc-b         #处理进入该虚机的网络包

-N neutron-openvswi-local

-N neutron-openvswi-obddxxxxc-b         #处理出该虚机的网络包

-N neutron-openvswi-sbddxxxxc-b         #处理出该虚机的网络包的防IP欺骗

-N neutron-openvswi-sg-chain

-N neutron-openvswi-sg-fallback

-A INPUT -j neutron-openvswi-INPUT      #将INPUT链转到neutron的INPUT链

-A FORWARD -j neutron-filter-top

-A FORWARD -j neutron-openvswi-FORWARD  #将FORWARD链转到neutorn的forward链

-A OUTPUT -j neutron-filter-top

-A OUTPUT -j neutron-openvswi-OUTPUT    #将OUTPUT链转到neutron的output链

-A neutron-filter-top -j neutron-openvswi-local

这些链之间的关系:

当前由于iptables主要做控制qbr桥在虚机和br-int之间转发的网络帧,Bridge代码应该是用filter表的FORWARD链来处理这些网络帧。

下面我们逐步跟踪FORWARD链,来找到neutron-openvswi-ixxxxx链定位这个问题。

5

链跟踪,定位位置

首先,查看FORWARD链:

[root@w-openstack32 ~]# iptables -nxvL FORWARD

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts      bytes target     prot opt in     out     source               destination

46935472750 20715430397978 neutron-filter-top  all  --  *      *       0.0.0.0/0            0.0.0.0/0

46935472750 20715430397978 neutron-openvswi-FORWARD  all  --  *      *       0.0.0.0/0            0.0.0.0/0

往下走,跟踪neutron-openvswi-FORWARD链:

[root@w-openstack32 ~]# iptables -nxvL neutron-openvswi-FORWARD

Chain neutron-openvswi-FORWARD (1 references)

pkts      bytes target     prot opt in     out     source               destination

46934035761 20714724813160 neutron-openvswi-scope  all  --  *      *       0.0.0.0/0            0.0.0.0/0

459609600 121602465610 neutron-openvswi-sg-chain  all  --  *      *       0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-out tapbddxxxxc-bd --physdev-is-bridged /* Direct traffic from the VM interface to the security group chain. */

418512415 87324679449 neutron-openvswi-sg-chain  all  --  *      *       0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-in tapbddxxxxc-bd --physdev-is-bridged /* Direct traffic from the VM interface to the security group chain. */

继续往下走,跟踪neutron-openvswi-sg-chain链:

[root@w-openstack32 ~]# iptables -nxvL neutron-openvswi-sg-chain

Chain neutron-openvswi-sg-chain (10 references)

pkts      bytes target     prot opt in     out     source               destination

459619285 121606141606 neutron-openvswi-ibddxxxxc-b  all  --  *      *       0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-out tapbddxxxxc-bd --physdev-is-bridged /* Jump to the VM specific chain. */

418522179 87328347603 neutron-openvswi-obddxxxxc-b  all  --  *      *       0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-in tapbddxxxxc-bd --physdev-is-bridged /* Jump to the VM specific chain. */

46927558621 20715211464005 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0

往下走,跟踪进入neutron-openvswi-ibddxxxxc-b链:

[root@w-openstack32 ~]# iptables -nxvL neutron-openvswi-ibddxxxxc-b

Chain neutron-openvswi-ibddxxxxc-b (1 references)

pkts      bytes target     prot opt in     out     source               destination

428583997 119531816501 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED /* Direct packets associated with a known session to the RETURN chain. */

0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID /* Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack. */

1937647 124006974 neutron-openvswi-sg-fallback  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Send unmatched traffic to the fallback chain. */

最后看下,如果以上规则都不匹配,做的动作:

[root@w-openstack32 ~]# iptables -nxvL neutron-openvswi-sg-fallback

Chain neutron-openvswi-sg-fallback (10 references)

pkts      bytes target     prot opt in     out     source               destination

9841017 629783588 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Default drop rule for unmatched traffic. */

6

Neutron安全组白名单机制

Openstack Neutron安全组使用白名单机制,此时网络的访问能力 = 用户自定义的规则允许的能力。如果这些规则都不匹配,没看错,是drop掉该数据包。

可以通过上边的iptables命令看到,安全组没有放开IPIP协议的规则,所以数据包没进到虚机中。

控制节点上再确认下安全组策略,的确没有IPIP协议规则。

7

确认IPIP协议号

查看kernel源码中头文件include/uapi/linux/in.h,可以看到IPIP协议号是4;

/* Standard well-defined IP protocols.  */

enum {

IPPROTO_IP = 0,   /* Dummy protocol for TCP   */

IPPROTO_ICMP = 1,   /* Internet Control Message Protocol  */

IPPROTO_IGMP = 2,   /* Internet Group Management Protocol */

IPPROTO_IPIP = 4,   /* IPIP tunnels (older KA9Q tunnels use 94) */

IPPROTO_TCP = 6,    /* Transmission Control Protocol  */

IPPROTO_EGP = 8,    /* Exterior Gateway Protocol    */

IPPROTO_PUP = 12,   /* PUP protocol       */

IPPROTO_UDP = 17,   /* User Datagram Protocol   */

IPPROTO_IDP = 22,   /* XNS IDP protocol     */

IPPROTO_DCCP = 33,    /* Datagram Congestion Control Protocol */

IPPROTO_RSVP = 46,    /* RSVP protocol      */

IPPROTO_GRE = 47,   /* Cisco GRE tunnels (rfc 1701,1702)  */

...

8

加入规则,纠正网络

在Openstack Neutron安全组dashboard上加入规则:

在控制节点上看到规则已经生成:

9

单元测试

再去虚机抓包,客户端发包通信接收到应答包,并且在虚机上抓到IPIP数据包。同时用命令行查看iptables,已有数据包匹配并执行(prot为4的pkts不为0)。

[root@w-openstack32 ~]# iptables -nxvL neutron-openvswi-ibddxxxxc-b

Chain neutron-openvswi-ibddxxxxc-b (1 references)

pkts      bytes target     prot opt in     out     source               destination

428583997 119531816501 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED /* Direct packets associated with a known session to the RETURN chain. */

12266  7040888 RETURN     4    --  *      *       0.0.0.0/0            0.0.0.0/0

0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID /* Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack. */

1937647 124006974 neutron-openvswi-sg-fallback  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Send unmatched traffic to the fallback chain. */

在虚机上抓包,没有看到其他类型数据包进入:

tcpdump -i any \(not icmp\) and \(not udp\) and \(not tcp\) and \(not arp\)

10

推入生产,回归测试

经验证,和测试环境效果一致,done。

总结

通过问题的探索,我们了解Openstack Neutron的安全组策略相关知识了,也对Neutron网络数据面的网络拓扑架构有了基本的认识。之后,我会结合源码展开谈谈iptables模式匹配与执行,以及iptables的高级用法和原理,以及部分netfilter的原理。

扫描下方二维码了解更多内容

带着问题了解Openstack Neutron安全组相关推荐

  1. OpenStack Neutron安全组机制探索

    过去一直以为,neutron的安全组是由iptables实现,网上不少文章也印证这个想法,他们的依据如下图: ovs的Port不具备安全功能,因此接入一个qbr-xxx的bridge,这个bridge ...

  2. openstack neutron介绍

    http://www.aboutyun.com/thread-13568-1-1.html openstack的Neutron中虚拟网络设备介绍 http://www.aboutyun.com/thr ...

  3. OpenStack 关闭安全组

    OpenStack Neutron的安全组默认会对每个网口开启MAC/IP过滤功能(防arp欺骗),不是该网口的MAC/IP发出的包会被宿主机丢弃.这种限制会导致vNF的上行网口转发的数据包被丢弃,无 ...

  4. OpenStack Neutron运行机制解析概要

    问题导读: 1.有OpenVswitch为什么还会有Linux Bridge? 2.整个运行流程是怎样的? 3.什么是TAP设备? 自从开学以来,玩OpenStack也已经3个月了,这段时间主要把精力 ...

  5. OpenStack Neutron浅析(三)

    1. 基础知识 1.1 防火墙(firewall) 防火墙是依照特定的规则来控制进出它的网络流量的网络安全系统.一个典型的场景是在一个受信任的内网和不受信任的外网比如 Internet 之间建立一个屏 ...

  6. OpenStack Neutron浅析(二)

    计算.存储和网络,奠定了当今云计算格局的三足鼎立之势. 计算通过虚拟化CPU.disk.Memory等硬件来获得高效的应用:存储通过分布式的文件系统,提供了众多特性的功能.而相对于,计算和存储两方面的 ...

  7. Openstack Neutron : 安全

    目录 - iptable:起源 - tables - chains - rules - 方向 - Security group 安全组: - Firewall 防火墙: - 更高的安全 - 无处安放的 ...

  8. python openstack vpc互通_深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(一)-简述与端口转发...

    VPC的概念与基于vxlan的overlay实现很早就有了,标题中的"新"只是一个和传统网络的相对概念.但从前年开始,不同于以往基础网络架构的新一代SDN网络才真正越来越多的走进国 ...

  9. openstack neutron(tap、qvb、qvo详解)(转)

    openstack neutron 说明:本文转自http://blog.csdn.net/tantexian/article/details/45395075 Linux Host 侧使用的网络元素 ...

最新文章

  1. db2 删除schema中所有表_常用SQL系列之(六):删除方式、数据库、表及索引元信息查询等...
  2. laravel artisan 后台运行_3分钟短文:Laravel用户自定义命令行简明教程
  3. Kafka分区分配策略(3)——自定义分区分配策略
  4. java lua传参_Lua将函数参数作为表键传递
  5. Jupyter更改主题和字体及远程访问
  6. python21天打卡Day12--for循环,列表推导式-构建列表
  7. 微信登录功能的实现直接复制就能使用(封装)
  8. ASP.NET 路由实现页面静态化
  9. 数据库系统设计大作业:图书馆管理系统
  10. 杭州电子科技大学ACM注册与答题指南
  11. bmd硬盘测试_disk speed test mac版下载-Blackmagic Disk Speed Test for Mac(硬盘读写速度测试工具) v3.2免费版 - Mac天空...
  12. html文字边框颜色,css背景颜色/文字/边框 设置渐变色
  13. mysql中status状态说明
  14. 光合作用c3和c5变化语言叙述,浅议光合作用中C3和C5的含量变化
  15. EMCP  物联网云平台萤石云密钥功能使用手册
  16. 基于IPFS视频存储的在线视频网站
  17. VirtualService资源详解
  18. 移动web网站常用MIME类型
  19. bzoj 4338[BJOI2015] 糖果 - 组合
  20. Word去掉拼音检查

热门文章

  1. python利用tkinter弹出消息对话框小程序代码
  2. java设计一百亿的计算器_请设计一个一百亿的计算器
  3. MySQL如何安装离线_mysql8.0.2离线安装配置方法图文教程
  4. 服务器开机需要按f2才能进系统吗,win7系统电脑每次开机总要按F2才能进入系统怎么办...
  5. 从零开始学架构三 高性能
  6. linux系统下如何使用U盘、光盘、软盘?如何挂载U盘,光盘镜像?
  7. jsp脚本、jsp标准动作、EL表达式、JSTL标签
  8. GMIC来了 HTC VIVE细化VR梦
  9. php导出数据到excel,防止身份证等数字字符格式变成科学计数的方法
  10. 面向对象开发方法概述