Monthly Archives: 六月 2015

You are browsing the site archives by month.

前几个星期,社区通过了一个 Patch 来解决一个遗留很久的 DHCP 相关的问题,这个 Patch 并不复杂(review 地址是 https://review.openstack.org/#/c/185486/),但为什么这么做却有一点故事,拿出和大家聊一聊。

事情从 DHCP HA 说起。我们知道 Neutron 的架构是每个“网络”(Network),都会有一个相应的 namespace 名为 qdhco-XXX(XXX 为网络的 UUID)运行在网络节点上。这个网络命名空间内会有一个  tuntap 设备,名为 tapXXX(XXX 为 port 的 ID),然后有一个 dnsmasq 进程与之绑定。

dnsmasq.png

这样,每当新的虚拟机启动,自动广播 DHCP 请求,namespace 下的 dnsmasq 将收到这个广播包并根据 dhcp-hostfile 里的内容对 VM 给予回应,分配并确认其 IP 地址。这一切都挺好的,先不考虑网络规模很大时 dnsmasq 的承载能力, 不考虑将 dhcp 分布式时,it works。

但如果我们想尝试将 DHCP 做 HA 呢?考虑到如果这个 dnsmasq 进程挂掉了,或者这个网络节点上的 ovs 异常了,甚至网络节点挂掉了…… 嗯,让我们先从 DHCP 的流程说起。

IPv4 版的 DHCP 是按照 RFC 2131 Dynamic Host Configuration Protocol 标准的,先撇开其具体细节,大概的 DHCP 流程是这样的:

[caption id="" align="alignnone" width="640"] dhcp[/caption]

首先在 DHCP 发现阶段,客户端发送目的地址为 255.255.255.255 的 UDP 广播包,然后服务端回复 DHCP OFFER,包含分配的 IP、默认路由、租约有效期等等。为了避免同一个网络下有多个 DHCP 服务端,而客户端只接受一个 DHCP 结果,所以客户端需要再发广播通知所有 DHCP 服务端自己接受了哪个 DHCP 分配结果,这个包里含有它自己给自己确定的 IP 地址,这个 IP 地址来自于哪个 DHCP 服务端(服务端的 IP 地址)。最后服务端广播一条 ACK 作为结束。 Read More →

Port Security 功能

相关链接

bp:[https://blueprints.launchpad.net/neutron/+spec/ml2-ovs-portsecurity]

code review:[https://review.openstack.org/#/q/topic:bp/ml2-ovs-portsecurity,n,z]

spec:[http://specs.openstack.org/openstack/neutron-specs/specs/kilo/ml2-ovs-portsecurity.html]

main patch:[https://review.openstack.org/#/c/126552/]

问题描述

Neutron 的安全组会向虚拟机默认添加`anti-spoof`的规则,这个规则将保证虚拟机只能发出/接受以它为原地址或目的地址(IP & MAC)的流量,不过注意的是`anti-spoof`并不能屏蔽**arp**包,因为`anti-spoof`是基于 iptables 的,无法识别 arp 包内的信息,社区新实现了一个基于 ovs 的 arp 识别、过滤的功能,见 Commit:`aa7356b729f9672855980429677c969b6bab61a1`,注意这个 Commit 的实现中考虑到了 Port Security 的影响。

上述这些功能确实有助于提高私有网络的安全性,特别是对于公有云而言,用户除非使用`allowed address pair`,将无法以非自己绑定的 IP、MAC 来发送或接收包,方便了云中流量的定位、debug 等。但是,对于一些应用,比如**LVS、基于虚拟机的路由器、基于虚拟机的防火墙等**,它们需要在一个**无防火墙、安全组和 anti-spoof 规则**的私有网络(虚拟网卡)下运行,特别是如果保持着 anti-spoof 规则的话,上述的应用很多都完全无法工作。

改进

Port Security 将提供一个新的属性`port_security_enabled`给`network`和`port`,其默认值为`True`,即与该 Patch 之前的行为相同,可以应用安全组、自动应用`anti-spoof`规则,当`port`的`port_security_enabled`被设置为`False`时,这个`port`将无法设置和应用安全组,`anti-spoof`会被关闭,`allowed address pair`也将无法设置。因为这个属性与安全相关,所以只有网络的`owner`可以设置这个值。

当给一个网络的`port_security_enabled`设置为`False`时,这意味着该网络下建立的`port`都将默认应用`False` 的`port_security_enabled`。

实现概述

Port Security 的 Topic 下有 5 个 Patch,此外在 Spec 中还提到另一个比较 general 的 Patch,但实际上主要的实现都在 [https://review.openstack.org/#/c/126552/] 这个 Patch 中,Commit 号为`554d266f56862d4f15de104e9199e9149124efbe `。 Read More →