Neutron DVR两个问题的思考

两个问题

这一段时间研究Neutron DVR,即分布式路由 (Distributed Virtual Router)。当把南北向和东西向流程打通后,突然产生了两个问题,让我思索了很久,终于得到了比较令自己信服的答案,特此记录,分享给一同搞OpenStack的朋友们。如果有朋友觉得有错误,欢迎指出,一起探讨!

  • 为什么要引入与计算节点绑定的MAC
  • 为什么跨网段的东西向流量必须使用静态arp

1. 为什么要引入与计算节点绑定的MAC

1.1 什么是与计算节点绑定的MAC

首先说一下这个与计算节点绑定的MAC。我们知道,DVR的主要思想是将路由功能下发给所有的计算节点。从Linux实现的角度,就是每个计算节点都有一个namespace用来实现路由功能,而所有的计算节点的namespace中的虚拟网口都是一模一样的。DVR认为,这些namespace中的虚拟网口qr对其他计算节点应该是不可见的,因此,从Overlay发到其他计算节点的数据包中,如果源MAC是qr的,都会被替换成该计算节点的唯一MAC;如果目的MAC是qr的,都会被DROP。

与计算节点绑定的MAC在启用DVR之后会自动创建,并写入Neutron DB。通过neutron的配置文件可以指定这个唯一MAC的前缀。

1.2 Traffic Flow

L2 agent选择neutron-openvswitch-agent时,主要是由br-tunbr-int来确保该功能正常运作的。以跨网段的东西向流量为例,拓扑图如下:

拓扑图.jpg

从Instance 1发往Instance2的traffic flow:

  • Instance 1发往Instance 2的流量通过br-int的规则仍以NORMAL模式发送,在本地的namespace做路由,从br-tun准备发往Instance 2所在的计算节点。因为此时数据包的源MAC是Instance 2的默认网关qr-2的MAC,所以br-tun在数据包发出之前将源MAC修改为计算节点1的唯一MAC,即图中“1”的位置。
  • 穿过了Overlay Network,数据包到达计算节点2,此时不需要再经过该节点的namespace,从patch口由br-tun到达br-intbr-int流表中有规则被匹配:源MAC是计算节点1的唯一MAC且发往Instance 2。按常理讲,数据包应该是从Instance 2的网关发过来的,因此该规则的动作是:将计算节点唯一MAC改为Instance 2的网关qr-2的MAC,即图中“2”的位置。
1.3 是否有必要修改qr的MAC

为什么计算节点的namespace中的网口qr不能让别的计算节点看到?这里假设图中“1”位置处并没有修改源MAC,我们再走一遍traffic flow:

  • Instance 1发往Instance 2的流量通过br-int的流表规则仍以NORMAL模式发送,从br-tun准备发往Instance 2所在的计算节点。
  • 穿过的Overlay Network,数据包到达计算节点2,此时不需要再经过该节点的namespace,从patch口由br-tun到达br-intbr-int的规则不会被匹配,因为此时源MAC是qr-2的,因此会按照NORMAL模式发送,即按照MAC和端口转发,并且在MAC表中记下qr-2的数据是从patch口进来的

也就是说,此时图中1、2两个位置都没有进行数据包源MAC的修改,此时数据包还是可以到达Instance 2的。但,Instance 2再往Instance 1发的报文就会出问题,此时的traffic flow会是这样的:

假设Instance 2的arp表记住了qr-2的MAC,不需要再发送arp请求

  • Instance 2发往Instance 1的流量通过br-int的流表规则仍以NORMAL模式发送, br-int查看MAC表发现,qr-2的数据包应该从patch口发出,因此数据包不会在计算节点2的namespace做路由,而是进入br-tun

问题由此诞生。先不说br-tun的流表规则会把目的MAC是qr的流DROP,假设数据包可以到达计算节点1做路由,但这样的traffic flow显然已经丧失了DVR设计的初衷。

因此,与计算节点绑定的MAC是必须的。

2. 为什么跨网段的东西向流量必须使用静态arp

2.1 Traffic Flow

L2 agent选择neutron-openvswitch-agent时,主要是由namespace内部配置静态arp表来响应Instance 1的arp请求报文。以跨网段的东西向流量为例,拓扑图如下:

拓扑图.jpg

从Instance 1发往Instance 2的traffic flow:

  • Instance 1与Instance 2不在同一网段,因此数据包通过br-int的流表规则最终仍是以NORMAL模式发送,到达namespace中的qr-1
  • L3 agent通过从Neutron DB获取其他实例port对应的IP/MAC关系,写入namespace的静态arp表中。Instance 1的默认网关qr-1经过路由,由qr-2根据arp表将数据包发送到Instance 2,即图中“+”位置。其余的部分与前面是一样的,省略。
2.2 为什么一定要使用静态arp

为什么不能向legacy_router模式或者同网段一样发送arp请求?通过手动将namespace中的静态arp删掉发现无法获取到Instance 2的MAC,原因是在图中2的位置,arp请求报文会命中br-int规则:源MAC是计算节点1的唯一MAC但并不是发往Instance 2,该规则的动作是:DROP,即图中“2”的位置是不会有arp请求报文发到Instance 2的。

静态arp和所有计算节点br-int的流表规则都说明一件事:跨网段东西向流量必须使用静态arp。对比之下,同网段东西向流量可以使用arp请求来获取对端的MAC,总觉得匪夷所思。

假设放开静态arp和br-int流表的限制,让arp请求报文到达Instance 2,看看会有什么问题:

  • Instance 1与Instance 2不在同一网段,因此数据包通过br-int的流表规则最终仍是以NORMAL模式发送,到达namespace中的qr-1qr-2发送arp请求报文,询问Instance 2的MAC。arp请求从br-tun准备发往所有的计算节点。因为此时数据包的源MAC是Instance 2的默认网关qr-2的MAC,所以br-tun在数据包发出之前将源MAC修改为计算节点1的唯一MAC,即图中“1”的位置。
  • 穿过了Overlay Network,数据包到达计算节点2,从patch口由br-tun到达br-int。在图中“2”位置发出,源MAC修改为Instance 2的网关qr-2的MAC。
  • Instance 2回复arp请求,将发往默认网关qr-2。数据包通过br-int流表规则最终仍是以NORMAL模式发送,从MAC表查询得知,目的MAC为qr-2的应发往namespace

问题由此诞生。目的MAC为qr的数据包只能在计算节点内部,不能发送到其他计算节点,否则还是会引起br-int的混乱。所以,就算跨网段的东西向流量允许发送arp请求,发送arp请求的namespace也永远收不到arp回复报文。

因此,跨网段的东西向流量必须使用静态arp。


后面有时间会补充ovs流表作为证据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 当搭建完openstack之后,在创建instance之前,第一件事情就是创建network,一个经典的流程如下:...
    ximitc阅读 1,125评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 一、高可用集群 (一)提升系统高可用性的解决方案:冗余(redundant) 工作模式active/passive...
    哈喽别样阅读 1,719评论 2 5
  • 装载自http://sdnhub.cn/index.php/openv-switch-full-guide/ 1 ...
    ximitc阅读 5,675评论 0 11
  • 大家好,我是姹紫嫣红,拥有健康的体魄,美丽青春的容颜,养育健康聪明的子女,这是我们每个人的梦想。 但是随着各种慢...
    辣妈姹紫嫣红阅读 238评论 0 0