解决neutron中不同命名空间的mac地址冲突

昨天我们的测试人员提了个bug,具体操作是这样的:
1. 新建VM(通过DHCP分配IP)
2. 绑定公网IP,通过公网IP,ssh登录之后,删除该VM。
3. 再新建VM,手动分配IP,IP使用步骤1中的内网IP。
4. 再绑定公网IP后,ssh验证,无法连接。

随后进行了复现:
虚拟机的ip和mac地址:

192.168.10.2 fa:16:3e:33:8e:7c

删除虚拟机后,重新创建,获取到的mac地址:

fa:16:3e:be:1a:3e

在虚拟机内ping网关IP,发现ping不通。
在虚拟机所在的tap设备上,tcpdump分析,发现有icmp request和reply。

但这只是一种假象,随即对抓包分析:
发现请求的mac地址和回复的mac地址不一致:

图1:
虚拟机发送请求时,源mac是新的mac地址

图2:
回复时,目的mac是旧的mac地址

因此,数据包无法进入虚拟机,在虚拟机里面ping无显示。

因此,数据包无法进入虚拟机,在虚拟机里面ping无显示。

之后检查网络节点和计算节点的arp表,发现一切正常。

把问题定位到qrouter的命名空间中,查看命名空间的arp表,发现关于192.168.10.2,维护的还是之前的arp表。

# ip netns exec qrouter-9b4da896-6baf-4e56-b368-85b25591908a arp -a
? (192.168.1.254) at 78:2b:cb:6b:9c:9a [ether] on qg-7356347e-91
? (10.20.30.2) at fa:16:3e:bc:b1:3d [ether] on qr-760f5ff8-3a
? (10.20.30.28) at fa:16:3e:0e:88:49 [ether] on qr-760f5ff8-3a
? (192.168.10.2) at fa:16:3e:33:8e:7c [ether] on qr-b82a5c08-87
在命名空间执行arp -d命令,删除这条arp表后,ok。

这个就是由于Linux系统中维护的arp表项和qrouter命令空间中arp表不一致造成2层不通。

原因大致清楚了,l2 pop driver在更新arp表的时候,只会发送rpc消息到linux bridge agent,l3 namespace里并不会接收到这种消息。

大概想了2种办法:
1.调整ip neighbor内核参数base_reachable_time,修改arp老化时间,但是在/proc/sys/net/ipv4/neigh目录下看到的只是和qr对应的tap设备,这个办法基本上没法改。

2.在create port的时候,给l3发送notification。dhcp是这么干的,但是这个时候,并不能获取router的id,怎么发送消息呢?

时间: 2024-08-30 22:01:35

解决neutron中不同命名空间的mac地址冲突的相关文章

sk buff-sk_buff和ethhdr结构体中怎么获得源mac地址?并将类型转换

问题描述 sk_buff和ethhdr结构体中怎么获得源mac地址?并将类型转换 请教各位大神,写的这段代码功能没有实现,求指教! static size_t _format_mac_addr(char *buf, int buflen,const unsigned char *addr, int len)//mac地址转换函数,转为 aa:aa:aa:aa:aa:aa 这类 { int i; char *cp = buf; for (i = 0; i < len; i++) { cp += s

获得Unix/Linux系统中的IP、MAC地址等信息

获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 作者:diaoyf  |  文章来源:http://programmerdigest.cn 实际环境和特殊需求往往会将简单问题复杂化,比如计算机IP地址,对于一个连接中socket,可以直接获得本端和对端的IP.端口信息.但在一些特殊场合我们可能需要更多的信息,比如系统中有几块网卡,他们的Mac地

mtk + driver-MTK 驱动中multiple SSID的mac 地址是怎么算的

问题描述 MTK 驱动中multiple SSID的mac 地址是怎么算的 MTK 驱动中multiple SSID的mac 地址是怎么算的? 解决方案 mtk LCD 驱动过程详解 解决方案二: 参考一下这个试试 [MTK智能机]写码IMEI工具和WIFI MAC地址及使用说明+驱动http://d.119g.com/f/34549C84CBE8A25E.html

Java中如何获取用户mac地址?

问题描述 Java中如何获取用户mac地址? 在Java项目中如何用代码获取用户MAC地址,我用的是w7系统 解决方案 http://blog.163.com/09zzy@126/blog/static/71197665201001504753750/ 解决方案二: public static String getWindowsMACAddress() { String mac = null; BufferedReader bufferedReader = null; Process proce

解决ECSHOP中transport.js和jquery的冲突的问题

一流资源网近日在ECSHOP网站加入了几个JS特效代码,在谷歌.火狐下正常,在各版本IE下都不常,左思不得其解. 最后才知道原来是"ECSHOP中transport.js和jquery的冲突" 因为通用头部文件中引用了 {insert_scripts files='transport.js,utils.js'} transport.js与jquery有冲突.原因不多讲.在网上找到一个最简单解决办法: 成功了,请评论欢呼!!! 如果失败了,请重头再来,肯定哪里操作不对. 一.在 page

解决JQuery中$与JS插件库相冲突问题

在代码前加入下面代码 把之后的jquery中的$都用jq代替即可.  代码如下 复制代码 <script type="text/javascript"> jq = jQuery.noConflict(); //以后jquery中的$都用jq代替即可. jq(function(){}); </script>   记得要在载入完各js库后才能用jQuery.noConflict()进行重载哦, 如例子中的prototype和jquery.  代码如下 复制代码 va

解决局域网遭遇盗用MAC地址上网的问题

盗用MAC地址是一直局域网管理里一个比较棘手的问题,而且总是没有简单的方法能够避免这些现象,说起来真的是一个很让网络管理员头痛的问题. 交换机端口绑定MAC地址是一个很彻底的好办法,但只有智能交换机才有端口绑定MAC地址功能,如果全部换智能交换机的话我想是一笔不小的投资,一般的企业也不会为避免盗用MAC现象而投入资金更换网络设备,而且绑定端口后 还会给网管带来很大的不便,如果电脑位置动一下,就要跟着修改端口绑定记录,无形中给管理员增加了很大的工作量.宽带提供商在接入设备上会做这样的投资和设置,我

WDS桥接或级联组网中,如何设置无线MAC地址过滤?

无线MAC地址过滤是防止无线蹭网的高效方法,但在多个路由器组网的时候,则需要在多个路由器上进行设置过滤规则,且不同组网方式下设置方法略有差异.本文介绍WDS桥接和有线LAN级联组网时无线MAC地址过滤的设置方法. 注意:路由器管理界面差异较大,我们分新旧两种界面分别介绍.   组网方式1.WDS无线桥接 主路由器是传统界面(旧界面) 在常见的WDS组网环境中,一般情况下组建的是同一信号的无线漫游网络.那么无论设置无线MAC地址过滤白名单或者黑名单,主路由器和副路由器需要设置一样的清单列表,才能保

如何解决IP地址冲突

IP地址冲突怎么办? 如何解决局域网IP地址冲突? 在同一个局域网里如果有两个用户同时使用了相同的IP地址,或者一个用户已经通过DHCP得到了一个IP地址,而此时又有其他用户以手工分配方式设定了与此相同的IP地址,这将造成IP地址冲突,并会令其中一个用户无法正常使用网络. 那么,应该怎样避免IP地址冲突这种情况的发生呢?我们可以从以下几个方面分析: 发生IP地址冲突的原因: 1.很多用户不知道"IP地址"."子网掩码"."默认网关"等参数如何设置