分享

openstack Juno neutron必读2:Neutron 深入学习之 OVS + GRE 之 Compute node、ne...

nettman 发表于 2015-2-25 20:48:15 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 3 35449
本帖最后由 nettman 于 2015-2-25 21:39 编辑
问题导读

1.哪个是OVS integration 桥?
2.OVS Tunnel网桥如何表示?
3.你认为什么是tap?






OpenStack网络配置:一个tenant, 2个虚机
  • Type driver: GRE, Mechanism driver: OVS
  • 一个public network: ext-net 和相应的subnet ext-subnet
  • 一个VM network:demo-net 和相应的subnet:demo-subnet
  • 一个router连接ext-subnet和demo-subnet
1.jpg

1、Compute 节点上networking组件
下面会用到OVS的两个重要命令:
  • ovs-vsctl: 查询和更新ovs-vswitchd的配置
  • ovs-ofctl: 查询和控制OpenFlow交换机和控制器
首先查询Compute节点上ovs-vswitchd的配置的配置:
  1. root@compute1:/var/lib/nova# ovs-vsctl show
  2. 205a13a2-1ad6-4ae0-8c84-abed97444aa9
  3.     Bridge br-int //OVS integration 桥 br-int
  4.         fail_mode: secure
  5.         Port "qvo37b25c08-e8" //端口,用来连接一个虚机网卡的TAP设备所连接的linux bridge
  6.             tag: 1
  7.             Interface "qvo37b25c08-e8"
  8.         Port patch-tun //端口,用来连接桥br-tun
  9.             Interface patch-tun
  10.                 type: patch
  11.                 options: {peer=patch-int} //和桥 br-tun上的patch-int是对等端口
  12.         Port br-int
  13.             Interface br-int
  14.                 type: internal
  15.         Port "qvo155845ae-5e" //端口,用来连接另一个虚机网卡的TAP设备所连接的linux bridge
  16.             tag: 1
  17.             Interface "qvo155845ae-5e"
  18.     Bridge br-tun //OVS Tunnel 桥br-tun
  19.         Port br-tun
  20.             Interface br-tun
  21.                 type: internal
  22.         Port patch-int //端口patch-int,用来连接桥br-int
  23.             Interface patch-int
  24.                 type: patch
  25.                 options: {peer=patch-tun}
  26.         Port "gre-0a000115" //端口,连接GRE Tunnel
  27.             Interface "gre-0a000115"
  28.                 type: gre
  29.                 options: {df_default="true", in_key=flow, local_ip="10.0.1.31", out_key=flow, remote_ip="10.0.1.21"}
  30.     ovs_version: "2.0.2" //GRE Tunnel是点到点之间建立的,这头的IP为10.0.1.31,那头的IP地址为 10.0.1.21
复制代码

继续看桥 br-tun:
  1. root@compute1:/var/lib/nova# ovs-ofctl show br-tun
  2. OFPT_FEATURES_REPLY (xid=0x2): dpid:0000f6b428614747
  3. n_tables:254, n_buffers:256
  4. capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
  5. actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
  6. 1(patch-int): addr:3e:7b:d5:fa:26:8d //端口 patch-int的ID 是 1
  7.      config:     0
  8.      state:      0
  9.      speed: 0 Mbps now, 0 Mbps max
  10. 2(gre-0a000115): addr:2a:26:b2:99:f3:5a //端口 gre-0a000115的ID 是 2
  11.      config:     0
  12.      state:      0
  13.      speed: 0 Mbps now, 0 Mbps max
  14. LOCAL(br-tun): addr:f6:b4:28:61:47:47
  15.      config:     0
  16.      state:      0
  17.      speed: 0 Mbps now, 0 Mbps max
  18. OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
复制代码

每个虚机有个虚机网卡 eth0,eth0和host上的一个TAP设备连接,该TAP设备直接挂载在一个Linux Bridge上,该Linux Bridge和OVS integration bridge br-int相连。其实理想情况下,TAP设备能和OVS Integration Bridge 直接相连就好了,但是,因为OpenStack实现Security Group的需要,这里要多加一层Linux bridge。OpenStack使用Linux TAP设备上的iptables来实现Security Group规则,而OVS不支持直接和br-int桥相连的TAP设备上的iptables。通过查看虚机的libvirt XML定义文件 /var/lib/nova/instances/<instance-id>/libvirt.xml可以看出来虚机所连接的TAP设备:
  1. <interface type="bridge">
  2.       <mac address="fa:16:3e:fe:c7:87"/> //
  3.       <source bridge="qbr37b25c08-e8"/> //虚机TAP设备所挂接的linux bridge
  4.       <target dev="tap37b25c08-e8” /> //虚机所连接的interface
  5. </interface>
复制代码

通过以上信息,我们可以画出compute 节点上的网络组建图:
2.jpg

2. Neutron使用TAP设备的iptables来实现Security groups
查看第一个虚机的TAP设备上的iptables:
  1. root@compute1:/var/lib/nova# iptables -S | grep tap37b25c08-e8
  2. -A neutron-openvswi-FORWARD -m physdev --physdev-out tap37b25c08-e8 --physdev-is-bridged -j neutron-openvswi-sg-chain
  3. -A neutron-openvswi-FORWARD -m physdev --physdev-in tap37b25c08-e8 --physdev-is-bridged -j neutron-openvswi-sg-chain
  4. -A neutron-openvswi-INPUT -m physdev --physdev-in tap37b25c08-e8 --physdev-is-bridged -j neutron-openvswi-o37b25c08-e
  5. -A neutron-openvswi-sg-chain -m physdev --physdev-out tap37b25c08-e8 --physdev-is-bridged -j neutron-openvswi-i37b25c08-e
  6. -A neutron-openvswi-sg-chain -m physdev --physdev-in tap37b25c08-e8 --physdev-is-bridged -j neutron-openvswi-o37b25c08-e
复制代码
OpenStack Neutron在neutron-openvswi-sg-chain上实现security groups。在使用默认security group的情况下:
  • neutron-openvswi-o37b25c08-e 控制从虚机出去的traffic

  1. -A neutron-openvswi-o37b25c08-e -p udp -m udp --sport 68 --dport 67 -j RETURN
  2. -A neutron-openvswi-o37b25c08-e -j neutron-openvswi-s37b25c08-e
  3. -A neutron-openvswi-o37b25c08-e -p udp -m udp --sport 67 --dport 68 -j DROP
  4. -A neutron-openvswi-o37b25c08-e -m state --state INVALID -j DROP
  5. -A neutron-openvswi-o37b25c08-e -m state --state RELATED,ESTABLISHED -j RETURN
  6. -A neutron-openvswi-o37b25c08-e -j RETURN
  7. -A neutron-openvswi-o37b25c08-e -j neutron-openvswi-sg-fallback
复制代码
  • neutron-openvswi-i37b25c08-e 控制进入虚机的traffic
  1. -A neutron-openvswi-i37b25c08-e -m state --state INVALID -j DROP
  2. -A neutron-openvswi-i37b25c08-e -m state --state RELATED,ESTABLISHED -j RETURN
  3. -A neutron-openvswi-i37b25c08-e -s 10.0.0.116/32 -p udp -m udp --sport 67 --dport 68 -j RETURN
  4. -A neutron-openvswi-i37b25c08-e -p tcp -m tcp --dport 22 -j RETURN
  5. -A neutron-openvswi-i37b25c08-e -p icmp -j RETURN
  6. -A neutron-openvswi-i37b25c08-e -m set --match-set IPv48c0dc337-0a6d-4ad7-9 src -j RETURN
  7. -A neutron-openvswi-i37b25c08-e -j neutron-openvswi-sg-fallback
复制代码
使用下面的命令来添加一条secrutiy group 规则来允许使用TCP 22端口:
  1. neutron security-group-rule-create --protocol tcp --port-range-min 22 --port-range-max 22 --direction ingress default
复制代码

那么该TAP设备的iptables会出现下面的变化:
  1. root@compute1:/var/lib/nova# iptables -S | grep 22
  2. -A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  3. -A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
  4. -A neutron-openvswi-i155845ae-5 -p tcp -m tcp --dport 22 -j RETURN
  5. -A neutron-openvswi-i155845ae-5 -p tcp -m tcp --dport 22 -j RETURN
  6. -A neutron-openvswi-i37b25c08-e -p tcp -m tcp --dport 22 -j RETURN
  7. -A neutron-openvswi-i37b25c08-e -p tcp -m tcp --dport 22 -j RETURN
复制代码

3. OVS integration 桥 br-int添加和删除traffic的VLAN ID
每一个使用 neutron net-create 命令创建的network都有一个新的 VLAN ID.本例中因为只有一个network,所以VLAN ID是1,见ovsctl-vsctl show命令中的port tag值。

4. OVS Tunnel 桥 br-tun 处理 VLAN ID 和 Tunnel ID的转化

从以下OpenFlow rule tables可见两种ID的处理过程:
  1. root@compute1:/var/lib/nova# ovs-ofctl dump-flows br-tun
  2. NXST_FLOW reply (xid=0x4):
  3. cookie=0x0, duration=11509.036s, table=0, n_packets=1059, n_bytes=116533, idle_age=740, priority=1,in_port=1 actions=resubmit(,2) //从端口1及patch-int进来的traffic会被重新执行table 2的rule
  4. cookie=0x0, duration=2089.491s, table=0, n_packets=1082, n_bytes=115494, idle_age=741, priority=1,in_port=2 actions=resubmit(,3) //从端口2 即 gre 端口进来的traffic重新执行table 3
  5. cookie=0x0, duration=11508.939s, table=0, n_packets=5, n_bytes=390, idle_age=11500, priority=0 actions=drop
  6. cookie=0x0, duration=11508.84s, table=2, n_packets=955, n_bytes=106446, idle_age=741, priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20) //重新执行table 20的rule
  7. cookie=0x0, duration=11508.745s, table=2, n_packets=104, n_bytes=10087, idle_age=740, priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,22)
  8. cookie=0x0, duration=2260.307s, table=3, n_packets=1082, n_bytes=115494, idle_age=741, priority=1,tun_id=0x1 actions=mod_vlan_vid:1,resubmit(,10) //从neutron node来的traffic,打上VLAN ID 1,重新执行table 10的 rule
  9. cookie=0x0, duration=11508.646s, table=3, n_packets=15, n_bytes=1274, idle_age=2098, priority=0 actions=drop
  10. cookie=0x0, duration=11508.495s, table=4, n_packets=0, n_bytes=0, idle_age=11508, priority=0 actions=drop
  11. cookie=0x0, duration=11508.293s, table=10, n_packets=1082, n_bytes=115494, idle_age=741, priority=1 actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1 //学习规则 table 20,从port 1 即 patch-int发出
  12. cookie=0x0, duration=11508.093s, table=20, n_packets=0, n_bytes=0, idle_age=11508, priority=0 actions=resubmit(,22) //重新执行table 22的rule
  13. cookie=0x0, duration=2260.372s, table=22, n_packets=77, n_bytes=7817, idle_age=740, hard_age=2089, dl_vlan=1 actions=strip_vlan,set_tunnel:0x1,output:2,output:2 //去掉VLAN ID,打上TUNNEL ID 1 即 neutron 节点的TUNNEL ID,从端口2 即 gre 端口发出
  14. cookie=0x0, duration=11507.901s, table=22, n_packets=27, n_bytes=2270, idle_age=1664, priority=0 actions=drop
复制代码




1. Neutron节点上的网络组件


画出Neutron节点上网络组件图:
3.jpg
可见:
  (1). 关于Neutron上的三种Agent的作用:
  • Neutron-OVS-Agent:从OVS-Plugin上接收tunnel和tunnel flow的配置,驱动OVS来建立GRE Tunnel
  • Neutron-DHCP-Agent:为每一个配置了DHCP的网络/子网配置dnsmasq,也负责把Mac地址/IP地址 信息写入dnsmasq dhcp lease 文件
  • Neturon-L3-Agent:设置iptables/routing/NAT表
(2). Neutorn节点上同样有OVS Tunnel bridge br-tun和OVS Integration bridge br-int,多了br-ex来提供外部网络连接,br-ex和物理网卡eth0绑定。这里出现的一个问题是eth0的IP无法ping通,OVS提供的解决方法如下。究其原因,一块物理以太网卡如果作为 OpenvSwitch bridge 的一部分,则它不能拥有 IP 地址,如果有,也会完全不起作用。如果发生了上述情况,可以将 IP 地址绑定至某 OpenvSwitch “internal” 设备来恢复网络访问功能。


  1. ifconfig eth0 0.0.0.0
  2. ifconfig br-ex 192.168.1.19
复制代码


(3). Neutron使用Linux network namespace来实现tenant之间的网络隔离。本例中有三个network namespace,每个network namspace包括router,dhcp,interface,routing tables,iptable rules等。
  1. root@network:/home/s1# ip netns
  2. qdhcp-d24963da-5221-481e-adf5-fe033d6e0b4e
  3. qrouter-e506f8fe-3260-4880-bd06-32246225aeae
  4. qdhcp-d04a0a06-7206-4d05-9432-3443843bc199
  5. qrouter-33e2b1bf-04cb-4811-9c58-7e03856022c1
  6. qrouter-9ba04071-f32b-435e-8f44-e32936568102
  7. qdhcp-0a4cd030-d951-401a-8202-937b788bea43
复制代码
(4). OpenStack中每个subnet都有一个不同的VLAN ID。H1/H2/H3端口上分布有不同的VLAN ID,对应不同的tenant的subnet。

(5). 不知道为什么br-ex和br-int之间还需要有直接的path。网上看到一些说法,似乎不是所有的环境都需要使用这条路径,比如当前的环境,往外走的traffic都会经过router到br-ex,应该不会直接到从br-int到br-ex。也许是某些配置中需要用到。解释之一是eth0是虚机网络的物理网卡,这么说的话它就是必须要有的。
  (6). Neutron-OVS-Agent会从Neutron db的表ml2_gre_endpoints中读取GRE端口的信息。如果其中出现错误的IP地址,Neutron上会出现错误的GRE Tunnel。解决方法是先删除数据库中的错误记录,在重启neutron-plugin-openvswitch-agent service.


1.1 br-tun OpenFlow rules

插播Mac地址的基础知识:
  • MAC地址是以太网二层使用的一个48bit(6字节十六进制数)的地址,用来标识设备位置。MAC地址分成两部分,前24位是组织唯一标识符(OUI, Organizationally unique identifier),后24位由厂商自行分配。48bit的MAC地址一般用6字节的十六进制来表示,如XX-XX-XX-XX-XX-XX。
  • 广播地址:FF:FF:FF:FF:FF:FF
  • 组播地址:MAC组播地址的特征是头8位的最低位是1。例如01:80:C2:00:00:00是一个组播地址,表示802.1d网桥多播组。网桥就是使用这个地址,相互之间交换配置信息,运行分布式生成树算法,消除网络拓扑结构中的环路。
  • 单播地址:单播地址的特征是头8位的最低位为0。每个网卡出厂时被分配唯一一个单播地址,头24位是设备制造厂商的编号,由IEEE(电气与电子工程师协会)分配,后24位是设备厂商为网卡制定的唯一编号。例如8C-70-5A-29-3A-48 是单播地址的例子 (8C = 10001100)。

  1. root@network:/home/s1# ovs-ofctl dump-flows br-tun
  2. NXST_FLOW reply (xid=0x4):
  3. cookie=0x0, duration=33.236s, table=0, n_packets=0, n_bytes=0, idle_age=33, priority=1,in_port=1 actions=resubmit(,2) //从H1进来的traffic,到table 2
  4. cookie=0x0, duration=32.131s, table=0, n_packets=0, n_bytes=0, idle_age=32, priority=1,in_port=2 actions=resubmit(,3) //从GRE端口进来的traffic,到table 3
  5. cookie=0x0, duration=33.178s, table=0, n_packets=6, n_bytes=480, idle_age=24, priority=0 actions=drop
  6. cookie=0x0, duration=33.121s, table=2, n_packets=0, n_bytes=0, idle_age=33, priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20) //目的地址为单播地址,到table 20
  7. cookie=0x0, duration=33.066s, table=2, n_packets=0, n_bytes=0, idle_age=33, priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,22) //目的地址为组播地址,到table 22
  8. cookie=0x0, duration=30.614s, table=3, n_packets=0, n_bytes=0, idle_age=30, priority=1,tun_id=0x1 actions=mod_vlan_vid:1,resubmit(,10) //Tunnel 1的traffic,修改VLAN ID 为 1, 再到 table 10
  9. cookie=0x0, duration=29.291s, table=3, n_packets=0, n_bytes=0, idle_age=29, priority=1,tun_id=0x2 actions=mod_vlan_vid:3,resubmit(,10) //Tunnel 2的traffic,修改VLAN ID 为 2, 再到 table 10
  10. cookie=0x0, duration=30.241s, table=3, n_packets=0, n_bytes=0, idle_age=30, priority=1,tun_id=0x3 actions=mod_vlan_vid:2,resubmit(,10) //Tunnel 3的traffic,修改VLAN ID 为 3, 再到 table 10
  11. cookie=0x0, duration=33.001s, table=3, n_packets=0, n_bytes=0, idle_age=33, priority=0 actions=drop
  12. cookie=0x0, duration=32.932s, table=4, n_packets=0, n_bytes=0, idle_age=32, priority=0 actions=drop
  13. cookie=0x0, duration=32.874s, table=10, n_packets=0, n_bytes=0, idle_age=32, priority=1 actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1 //学习一条新的规则添加到table 20,发到端口1,进入br-int
  14. cookie=0x0, duration=32.815s, table=20, n_packets=0, n_bytes=0, idle_age=32, priority=0 actions=resubmit(,22) //到table 22
  15. cookie=0x0, duration=29.35s, table=22, n_packets=0, n_bytes=0, idle_age=29, dl_vlan=3 actions=strip_vlan,set_tunnel:0x2,output:2
  16. cookie=0x0, duration=30.293s, table=22, n_packets=0, n_bytes=0, idle_age=30, dl_vlan=2 actions=strip_vlan,set_tunnel:0x3,output:2
  17. cookie=0x0, duration=30.682s, table=22, n_packets=0, n_bytes=0, idle_age=30, dl_vlan=1 actions=strip_vlan,set_tunnel:0x1,output:2 //以上三条rule,根据目的VLAN ID,修改Tunnel ID,并去掉VLAN ID,发到GRE端口,经过GRE Tunnel到compute node
  18. cookie=0x0, duration=32.752s, table=22, n_packets=0, n_bytes=0, idle_age=32, priority=0 actions=drop
复制代码
总之,br-tun会:
  • 把从GRE端口来的traffic设置相应的VLAN ID,发到br-int
  • 把从br-int/patch-int来的traffic,去掉VLAN ID,设置相应的Trunne ID,经过GRE端口H1 发到Compute节点


2. Router Server

2.1 以tenant-one (有一个虚机)的router为例,先看看它的interface (略去lo)

  1. root@network:/home/s1# ip netns exec qrouter-33e2b1bf-04cb-4811-9c58-7e03856022c1 ip addr
  2. 22: qr-d3d3e235-d4: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
  3.     link/ether fa:16:3e:b3:06:e8 brd ff:ff:ff:ff:ff:ff
  4.     inet 10.0.11.1/24 brd 10.0.11.255 scope global qr-d3d3e235-d4
  5.        valid_lft forever preferred_lft forever
  6.     inet6 fe80::f816:3eff:feb3:6e8/64 scope link
  7.        valid_lft forever preferred_lft forever
  8. 26: qg-6c06581b-bd: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
  9.     link/ether fa:16:3e:0b:ac:82 brd ff:ff:ff:ff:ff:ff
  10.     inet 192.168.1.114/24 brd 192.168.1.255 scope global qg-6c06581b-bd
  11.        valid_lft forever preferred_lft forever
  12.     inet 192.168.1.115/32 brd 192.168.1.115 scope global qg-6c06581b-bd
  13.        valid_lft forever preferred_lft forever
  14.     inet6 fe80::f816:3eff:fe0b:ac82/64 scope link
  15.        valid_lft forever preferred_lft forever
复制代码


可见:
  • qg-6c06581b-bd 连接 br-ex
  • qr-d3d3e235-d4连接br-int
再看看它的route规则:

  1. root@network:/home/s1# ip netns exec qrouter-33e2b1bf-04cb-4811-9c58-7e03856022c1 route -n
  2. Kernel IP routing table
  3. Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
  4. 0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 qg-6c06581b-bd
  5. //默认路由,所有目的地址不在本网络中的traffic都要通过 qg-d3657c7f-28 interface 发到外网网关192.168.1.1
  6. 10.0.11.0       0.0.0.0         255.255.255.0   U     0      0        0 qr-d3d3e235-d4
  7. //目的为本子网内的traffic 经过 qr-d3d3e235-d4 发到子网网关 10.0.11.1
  8. 192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 qg-6c06581b-bd
  9. //目的为 192.168.1.0/24 的traffic通过 qg-6c06581b-bd 发到网关192.168.1.100
复制代码


2.2 Neutorn Floating IP 实现原理

Router namespace中的 netfilter NAT 表负责 Neutron Floating IP 的实现。下面是tenant-two (有两个虚机)的router的NAT表:

  1. root@network:/home/s1# ip netns exec qrouter-e506f8fe-3260-4880-bd06-32246225aeae  iptables -t nat -S
  2. -P PREROUTING ACCEPT
  3. -P INPUT ACCEPT
  4. -P OUTPUT ACCEPT
  5. -P POSTROUTING ACCEPT
  6. -N neutron-l3-agent-OUTPUT
  7. -N neutron-l3-agent-POSTROUTING
  8. -N neutron-l3-agent-PREROUTING
  9. -N neutron-l3-agent-float-snat
  10. -N neutron-l3-agent-snat
  11. -N neutron-postrouting-bottom
  12. -A PREROUTING -j neutron-l3-agent-PREROUTING
  13. -A OUTPUT -j neutron-l3-agent-OUTPUT
  14. -A POSTROUTING -j neutron-l3-agent-POSTROUTING
  15. -A POSTROUTING -j neutron-postrouting-bottom
  16. -A neutron-l3-agent-OUTPUT -d 192.168.1.118/32 -j DNAT --to-destination 10.0.22.200
  17. -A neutron-l3-agent-OUTPUT -d 192.168.1.117/32 -j DNAT --to-destination 10.0.22.202
  18. -A neutron-l3-agent-POSTROUTING ! -i qg-cba7b139-04 ! -o qg-cba7b139-04 -m conntrack ! --ctstate DNAT -j ACCEPT
  19. -A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
  20. -A neutron-l3-agent-PREROUTING -d 192.168.1.118/32 -j DNAT --to-destination 10.0.22.200
  21. -A neutron-l3-agent-PREROUTING -d 192.168.1.117/32 -j DNAT --to-destination 10.0.22.202
  22. -A neutron-l3-agent-float-snat -s 10.0.22.200/32 -j SNAT --to-source 192.168.1.118
  23. -A neutron-l3-agent-float-snat -s 10.0.22.202/32 -j SNAT --to-source 192.168.1.117
  24. -A neutron-l3-agent-snat -j neutron-l3-agent-float-snat
  25. -A neutron-l3-agent-snat -s 10.0.22.0/24 -j SNAT --to-source 192.168.1.116
  26. -A neutron-postrouting-bottom -j neutron-l3-agent-snat
复制代码
  • SNAT (源地址转换) 负责把从虚机来的traffic的 IP源地址 即fixed ip 10.0.22.200/202 转化为 floating ip 192.168.1.118/117,然后该traffic被路由到 br-ex 再到外网
  • DNAT (目的地址转换)负责把从外网来的traffic的 IP目的地址 即floating ip 192.168.1.118/117 转化为虚机所使用的 fixed ip 10.0.22.200/202,然后该traffic被路由到br-int 再到虚机


3. DHCP Server

每一个有DHCP的网络都在Neutron节点上有一个DHCP服务,每个DHCP Server都是一个运行在一个network namespace中的dnsmasq进程。 dnsmasq是一个用在Linux上的轻型DNS和DHCP服务,具体见 http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html.

3.1 每个DHCP在neutron host上都有一个process,其ID是qdhcp-<net id>:
  1. nobody    2049     1  0 06:43 ?        00:00:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=tap15865c29-9b --except-interface=lo --pid-file=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/host --addn-hosts=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/opts --leasefile-ro --dhcp-range=set:tag0,10.0.22.0,static,86400s --dhcp-lease-max=256 --conf-file= --domain=openstacklocal
复制代码
说明:
1.  --interface=tap15865c29-9b: 该process绑定/监听一个TAP设备,即上图中的 H3
2.  --dhcp-hostsfile=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/host:
root@network:/home/s1# cat /var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/host
fa:16:3e:4d:6b:44,host-10-0-22-201.openstacklocal,10.0.22.201 //本子网DHCP Server自己(M3)的Mac地址以及IP
fa:16:3e:79:07:5e,host-10-0-22-1.openstacklocal,10.0.22.1 //本子网Router Server ( N3) 的Mac地址,名字和 IP
fa:16:3e:bf:69:36,host-10-0-22-200.openstacklocal,10.0.22.200 //本子网虚机1的Mac地址,虚机的主机名字,虚机的fixed IP
fa:16:3e:19:65:62,host-10-0-22-202.openstacklocal,10.0.22.202 //本子网虚机2的Mac地址,虚机的主机名字,虚机的fixed IP
fa:16:3e:88:99:c1,host-10-0-0-116.openstacklocal,10.0.0.116 //子网1的DHCP Server (H1)的Mac地址,以及IP地址。那么这里为什么没H2的相应信息?
在虚机的创建过程中,Neutron会把这些信息(应该是从neutron db中拿到一个可用的IP地址)写到该文件中,这样,当虚机使用Mac地址向DHCP Server查询IP地址的时候,dnsmasq会读取该文件把IP地址返回给它。


3.2 DHCP的interface (省去lo)

  1. root@network:/home/s1# ip netns exec qdhcp-0a4cd030-d951-401a-8202-937b788bea43 ip addr
  2. 18: tap6356d532-32: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
  3.     link/ether fa:16:3e:88:99:c1 brd ff:ff:ff:ff:ff:ff
  4.     inet 10.0.0.116/24 brd 10.0.0.255 scope global tap6356d532-32
  5.        valid_lft forever preferred_lft forever
  6.     inet6 fe80::f816:3eff:fe88:99c1/64 scope link
  7.        valid_lft forever preferred_lft forever
  8. root@network:/home/s1# ip netns exec qdhcp-d04a0a06-7206-4d05-9432-3443843bc199 ip addr
  9. 17: tap8dfd0bd8-45: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
  10.     link/ether fa:16:3e:82:fd:26 brd ff:ff:ff:ff:ff:ff
  11.     inet 10.0.11.101/24 brd 10.0.11.255 scope global tap8dfd0bd8-45
  12.        valid_lft forever preferred_lft forever
  13.     inet6 fe80::f816:3eff:fe82:fd26/64 scope link
  14.        valid_lft forever preferred_lft forever
  15. root@network:/home/s1# ip netns exec qdhcp-d24963da-5221-481e-adf5-fe033d6e0b4e ip addr
  16. 19: tap15865c29-9b: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
  17.     link/ether fa:16:3e:4d:6b:44 brd ff:ff:ff:ff:ff:ff
  18.     inet 10.0.22.201/24 brd 10.0.22.255 scope global tap15865c29-9b
  19.        valid_lft forever preferred_lft forever
  20.     inet6 fe80::f816:3eff:fe4d:6b44/64 scope link
  21.        valid_lft forever preferred_lft forever
复制代码


DHCP使用fix ip range的第一个可用IP地址做为其IP地址。它的interface的MAC地址 fa:16:3e:4d:6b:44 会出现在br-tun的rules里面。

3.3 虚机向DHCP Server申请/查询Fixed IP

相关内容


openstack Juno neutron必读1:在Mac上部署Juno版本OpenStack 四节点环境介绍
openstack Juno neutron必读2:Neutron 深入学习之 OVS + GRE 之 Compute node、ne...
openstack Juno neutron必读3:Neutron 深入探索之 OVS + GRE 之 完整网络流程 篇
加微信w3aboutyun,可拉入技术爱好者群

已有(3)人评论

跳转到指定楼层
s060403072 发表于 2015-2-25 20:49:09
个人认为tap为虚拟网卡
回复

使用道具 举报

新手PS 发表于 2015-4-7 18:49:30
本帖最后由 howtodown 于 2015-4-7 18:55 编辑

为什么我的br-int,没有看到端口呢?就是dashboard里面没找到可用的端口。

dasbroad 没有可用端口

dasbroad 没有可用端口

ovs-vsctl show

ovs-vsctl show

回复

使用道具 举报

Echo_ehvRf 发表于 2017-12-22 00:08:36
学习了。感谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条