你将学到什么

  • 虚拟机的Ping包是如何出外网的

DevStack环境准备

节点 硬件配置 网络配置 类型 操作系统
DevStack 4G 2CPU 50GB 2张网卡(NAT模式) VMWare虚拟机(开启CPU虚拟化) CentOS 7
# cat ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.30.11
PREFIX=24
GATEWAY=192.168.30.2
DNS1=114.114.114.114
# cat ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=no
NAME=eth1
DEVICE=eth1
ONBOOT=yes

部署DevStack

# git clone https://git.openstack.org/openstack-dev/devstack -b stable/ocata
# devstack/tools/create-stack-user.sh
### 为stack用户设置密码
# passwd stack
# su stack ### 部署OpenStack
# cd
# git clone https://git.openstack.org/openstack-dev/devstack -b stable/ocata
# cd devstack
# cp samples/local.conf .
# vim local.conf
ADMIN_PASSWORD=123456
# ./stack.sh
### OpenStack服务状态查询
# systemctl status devstack@* ### 1. 部署完成后将eth1添加到br-ex
# ovs-vsctl add-port br-ex eth1
### 2. 登入http://192.168.30.11/把alt_demo和demo下所有网络和路由都删了,然后删除public网络,根据自己的外网地址创建新的public网络,VMWare的NAT网络为192.168.30.0/24,网关为192.168.30.2
### 3. 在admin项目下创建private网络192.168.0.0/24,并添加路由router连接public网络和private网络
### 4. 在private网络下创建虚拟机A

最终DevStack网络拓扑如下

Ping包流向

设备 设备名 IP地址 MAC地址
tap-XXX tapc8139c13-4e 192.168.0.4/24 fe : 16: 3e : 3b : 1c : 16
qvb-XXX tapc8139c13-4e - 2a : 6b : 39 : d5 : a3 : 83
qvo-XXX tapc8139c13-4e - 22 : 76 : f3 : 85 : 76 : df
qr#MN qr-51cb52fe-34 192.168.0.1/24 fa : 16 : 3e : f2 : e6 : c2
qg#KL qg-997f3a2c-2b 192.168.30.101/24 fe : 16: 3e : 3b : 1c : 16

tap-XXX到qvb-XXX

### security flows以后写

qvo-XXX到qr#MN

当数据包到达qvo-XXX后将查询br-int的OVS流表进行转发

### 首先我们来看下br-int的流表,这边都只列举关键数据
# ovs-ofctl show br-int
3(qvoc8139c13-4e): addr:22:76:f3:85:76:df
config: 0
state: 0
current: 10GB-FD COPPER
speed: 10000 Mbps now, 0 Mbps max ### 首先看table=0的行,然后过滤存在icmp6和arp字段的行,然后找到存在in_port=3的行
# ovs-ofctl dump-flows br-int
cookie=0xb0a9009a2f367add, duration=20319.589s, table=0, n_packets=121, n_bytes=12082, idle_age=19038, priority=9,in_port=3 actions=resubmit(,25)
### 可以看到我们接下来要看的表就是25,在table=25的行找到源MAC地址等于tapc8139c13-4e的行(直接看in_port=3也可以,qvb-XXX和qvo-XXX是veth pair设备,tap-XXX发送到qvb-XXX的包都会出现在qvo-XXX,就好像是tap-XXX直接发往qvo-XXX,所以这边的dl_src并不是qvb-XXX)
cookie=0xb0a9009a2f367add, duration=20319.604s, table=25, n_packets=122, n_bytes=12068, idle_age=19036, priority=2,in_port=3,dl_src=fa:16:3e:3b:1c:16 actions=resubmit(,60)
### 最后我们可以看到table=60表的动作是NORMAL,按照设备的常规L2/L3处理流程来处理数据包(外网的数据包都直接发往private网络的网关即qr-XXX),而我们通过打印DATAPATH就可以看到最终的转发路径
cookie=0xb0a9009a2f367add, duration=20344.086s, table=60, n_packets=4715, n_bytes=447847, idle_age=0, priority=3 actions=NORMAL ### 首先查下端口
# ovs-dpctl show
system@ovs-system:
port 4: qr-51cb52fe-34 (internal)
port 11: qvoc8139c13-4e
### 这边可以看到生成了一条qvo-XXX发往qr-XXX的DATAPATH
# ovs-dpctl dump-flows system@ovs-system
recirc_id(0),in_port(10),eth(src=fa:16:3e:3b:1c:16,dst=fa:16:3e:f2:e6:c2),eth_type(0x0800),ipv4(frag=no), packets:1, bytes:98, used:2.121s, actions:4

qr#MN到qg#KL

Neutron的L3 agent是通过iptables来实现路由和NAT功能,每个 L3 Agent 运行在一个network namespace中

# ip netns
qdhcp-5fc6d4d3-4580-42a3-8dd4-bfcef4d5961f
qdhcp-72f9fa34-5f0d-477a-a634-305a6af7968c
qrouter-a8956ad4-bbd1-4cef-a307-528b0b39a7ab
# ip netns exec qrouter-a8956ad4-bbd1-4cef-a307-528b0b39a7ab bash

首先我们来看下路由表

# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.30.2 0.0.0.0 UG 0 0 0 qg-997f3a2c-2b
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-51cb52fe-34
192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-cf0bb1cb-86
192.168.30.0 0.0.0.0 255.255.255.0 U 0 0 0 qg-997f3a2c-2b

这边是在network namespace中了,按照路由表,ping包将由qg-XXX发往192.168.30.2,接着我们来看下在数据包出qg-XXX的时候,iptables怎么实现SNAT

### L3 agent通过自定义链来实现SNAT,需要注意的是在有floating ip的情况下走不到步骤(7)的
# ip netns exec qrouter-a8956ad4-bbd1-4cef-a307-528b0b39a7ab iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N neutron-l3-agent-OUTPUT
-N neutron-l3-agent-POSTROUTING ### Neutorn 增加的 SNAT chain
-N neutron-l3-agent-PREROUTING
-N neutron-l3-agent-float-snat ### Neutorn 增加的 SNAT chain
-N neutron-l3-agent-snat ### Neutorn 增加的 SNAT chain
-N neutron-postrouting-bottom ### Neutorn 增加的 SNAT chain
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A POSTROUTING -j neutron-l3-agent-POSTROUTING ### (1) 将SNAT chain转到自定义的 neutron-l3-agent-POSTROUTING
-A POSTROUTING -j neutron-postrouting-bottom ### (3) 将SNAT chain转到自定义的 neutron-postrouting-bottom
-A neutron-l3-agent-OUTPUT -d 192.168.30.107/32 -j DNAT --to-destination 192.168.0.4
-A neutron-l3-agent-POSTROUTING ! -i qg-997f3a2c-2b ! -o qg-997f3a2c-2b -m conntrack ! --ctstate DNAT -j ACCEPT ### (2) 如果出口或者入口不是qg-997f3a2c-2b并且状态不是DNAT的都接受(由于我们的包是从qg-997f3a2c-2b出去的所以不满足继续找下一个规则)
-A neutron-l3-agent-PREROUTING -d 192.168.30.107/32 -j DNAT --to-destination 192.168.0.4
-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
-A neutron-l3-agent-float-snat -s 192.168.0.4/32 -j SNAT --to-source 192.168.30.107 ### (6) 因为floating ip的存在就会用floating ip的地址192.168.30.107做SNAT,结束匹配
-A neutron-l3-agent-snat -j neutron-l3-agent-float-snat ### (5) 转到 neutron-l3-agent-float-snat
-A neutron-l3-agent-snat -o qg-997f3a2c-2b -j SNAT --to-source 192.168.30.101 ### (7) floating ip不存在的话会走到此处,修改源地址为192.168.30.101
-A neutron-l3-agent-snat -m mark ! --mark 0x2/0xffff -m conntrack --ctstate DNAT -j SNAT --to-source 192.168.30.101 ### (8) -
-A neutron-postrouting-bottom -m comment --comment "Perform source NAT on outgoing traffic." -j neutron-l3-agent-snat ### (4) 转到 neutron-l3-agent-snat

qg#KL到int-br-ex

当ping包由qg#KL再次进入br-int的数据包时源地址已被修改为192.168.30.107

# ovs-ofctl show br-int
1(int-br-ex): addr:32:f4:d5:fc:39:76
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
12(qg-997f3a2c-2b): addr:00:00:00:00:d0:7d
config: PORT_DOWN
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max ### table=0的行里面没有in_port=12的行,所以匹配到的行只有下面一条
# ovs-ofctl dump-flows br-int
cookie=0xb0a9009a2f367add, duration=24922.247s, table=0, n_packets=252, n_bytes=24551, idle_age=26, priority=0 actions=resubmit(,60)
### 可以看到最终的动作还是NORMAL
cookie=0xb0a9009a2f367add, duration=24922.244s, table=60, n_packets=5884, n_bytes=561698, idle_age=15, priority=3 actions=NORMAL ### 我们继续来看下DATAPATH
# ovs-dpctl show
port 2: eth1
port 7: qg-997f3a2c-2b (internal)
# arp -a
? (192.168.30.1) at 00:50:56:c0:00:08 [ether] on eth0
? (192.168.30.2) at 00:50:56:e3:37:85 [ether] on eth0
### 现在已经是外网网段了,数据包这次要发往外网网关192.168.30.2,这边我们找到了最终出外网的DATAPATH
# ovs-dpctl dump-flows system@ovs-system
recirc_id(0),in_port(7),eth(src=fa:16:3e:e8:89:77,dst=00:50:56:e3:37:85),eth_type(0x0800),ipv4(frag=no), packets:3, bytes:294, used:2.682s, actions:2

Neutron网络研究的更多相关文章

  1. Neutron网络-OPENSTACK讲得比较透和方便

    http://www.ustack.com/blog/neutron_intro/ Neutron是OpenStack核心项目之一,提供云计算环境下的虚拟网络功能.Neutron的功能日益强大,并在H ...

  2. Neutron网络性能测试与分析(一) CVR

    测试环境:网络节点运行在Intel(R) Xeon(R) CPU E5-2630 v3服务器上,网卡使用intel的万兆卡82599ES 测试仪使用本人基于dpdk编写的程序,基本上可以打满万兆卡,小 ...

  3. openstack第四章:neutron— 网络服务

    第四篇neutron— 网络服务 一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是 ...

  4. Neutron 网络基本概念

    Neutron 网络基本概念 上次我们讨论了 Neutron 提供的功能,今天我们学习 Neutron 模块几个重要的概念. Neutron 管理的网络资源包括 Network,subnet 和 po ...

  5. Neutron网络学习

    学习 Neutron 系列文章: 转http://www.cnblogs.com/sammyliu/p/4622563.html (1)Neutron 所实现的网络虚拟化 (2)Neutron Ope ...

  6. CentOS7安装OpenStack(Rocky版)-06.安装Neutron网络服务(控制节点)

    上一章介绍了独立的nova计算节点的安装方法,本章分享openstack的网络服务neutron的安装配制方法 ------------------- 完美的分割线 ----------------- ...

  7. OpenStack之Neutron网络服务(一)

    1.Neutron概要 OpenStack网络服务提供了一个API接口,允许用户在云上设置和定义网络连接和地址.这个网络服务的项目代码名称是Neutron.OpenStack网络处理虚拟设备的创建和管 ...

  8. Openstack实践(1)部署使用实例及neutron网络

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://www.cnblogs.com/SuperXJ/ 如何快速部署使用openstack,使用kolla吧,o ...

  9. Neutron网络入门

    Neutron是OpenStack核心项目之中的一个,提供云计算环境下的虚拟网络功能.Neutron的功能日益强大,并在Horizon面板中已经集成该模块.作为Neutron的核心开发人员之中的一个. ...

随机推荐

  1. Windows下控制Nginx的状态

    Windows下Nginx的启动.停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍.1.启 ...

  2. 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素

    1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...

  3. Android之单元测试学习

    1.单元测试概念 单元测试(又称为模块测试),检验程序模块(软件设计的最小单位)正确性的测试工作,常常是程序员写的一段代码.对于面向对象编程,最小单元就是方法,包括基类(超类).抽象类.或者派生类(子 ...

  4. 如何生成HLS协议的M3U8文件

    什么是HLS协议: HLS(Http Live Streaming)是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件 ...

  5. 9th

    2017-2018-2 20179212<网络攻防实践>第9周作业 视频学习 KaliSecurity压力测试工具 压力测试通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能够提供的 ...

  6. bzoj 3653: 谈笑风生 可持久化线段树

    题目大意 在一棵单位边权的有根树上支持询问: 给定a,k求满足下列条件的有序三元对的个数. a,b,c互不相同 a,b均为c的祖先 a,b树上距离<=k 题解 solution 1 首先我们知道 ...

  7. 【转】Pro Android学习笔记(五三):调试和分析(1):Debug视图和DDMS视图

    目录(?)[-] Debug视图 DDMS视图 查看应用运行状态 进入debug状态 HPROF Thread信息 Method信息 Stop 截图 UI层次架构信息 其它的 Tab中提供的功能 我们 ...

  8. LIBCMTD.lib(wincrt0.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

    无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 出现原因: 连接程序在负责连接可执行程序时,选择相应的c/c++运行时启动函数.如果设定了/s ...

  9. Python-Redis的Hash操作

    Redis的hash是一个string类型的field和value的映射表,特别适合用于存储对象,每个hash可以存储40多亿键值对 hset(name, key, value):创建一个name的类 ...

  10. cdh 安装组件 异常总结

    hive 启动 要 把mysql的jar包放到/opt/cloudera/parcels/CDH-5.9.3-1.cdh5.9.3.p0.4/lib/hive/lib 下 假设有3个节点就要放3次