Linux的brctl addif命令可以将一个接口加入到既有的网桥中,接下来,这个接口就成了brport,属于一个从属的接口,然而你还是可以看到它的,并且可以为它添加IP地址,然后route命令会显示出它的新添加的IP地址的链路层路由已经生效,种种迹象都让人觉得这个brport仍然保有IP语义,然而如果此时你使用该IP(Linux内核会做源地址选择)去访问同一网段的其它地址的话,就会发现,不通,反过来从其它同一网段的地址访问该地址也是不通的,原因何在?听我分解。

网络不通的话,一般第一步是通过抓包来分析,发现是在arp这一步出问题的,arp是IPv4的生命源,arp出了问题,什么都别扯了!懂Linux网络实现的家伙们其实早就知道为何出错了,因为作为从属接口brport,它的一切都要被网桥接口接管,包括arp,也就是说arp期望的接口信息都是关于网桥接口的而不是基于brport的。总的来说是这样的。

IP地址配置在物理接口brport上,因此链路层路由显示的出口设备就是该brport,发送数据的时候,arp逻辑会将目标IP-Mac映射记录在该brport门下,然而arp回来的时候,网桥接口接收了它,内核发现网桥接口门下没有任何待解决的arp请求,因此丢弃之,因此根本不可能从本机访问和配置在brport上IP在同网段的任何目标。反过来也一样,arp请求从其它机器过来,被网桥接口接收,可是在arp_process中准备回复reply的时候,反向路由查找由于dev参数而无法通过,dev参数是网桥,而查询结果却是brport,因此failed。能分析到这个地步需要你十分精通网络协议的行为或者Linux内核协议栈。
那么怎么解决这个问题呢?easy啊easy,以下一条命令即可:
ebtables -t broute -A BROUTING -p ARP --arp-ip-dst 12.12.12.12 -j redirect --redirect-target DROP
这句话的意思就是,用物理接口,即brport接管arp,而不是用网桥接口。为了不影响网桥的正常流程,特意指定目标IP地址是这个添加到brport的地址。

最新文章

  1. C语言 · 4-3水仙花数
  2. JS 格式化当前时间
  3. call方法和new对象的关系
  4. web classpath 路径说明
  5. Hello Qt
  6. Java - 选择性排序 PHP || Java 代码对比
  7. AJAX 一些常用方法
  8. windows API 统计系统字体
  9. 【转】Android adb shell操作时出现“ XXX ... Read-only file system”解决办法--不错
  10. ThinkPhp知识大全(非常详细)
  11. Linux 安装Xampp以后,Apache服务器无法启动,以及启动后,连接sql数据库遇到的问题的解决方法
  12. PyCharm中光标变粗的解决方法
  13. dede首页、列表页调用非缩略图
  14. printf 函数原型
  15. 关于matlab2018a版本错误使用 svmclassify 分类器
  16. Linux 中数组的使用
  17. python自动化开发-[第十七天]-django的ORM与其他
  18. [py]软件编程知识骨架+py常见数据结构
  19. VI常用命令及linux下软件
  20. 项目解析1、登录验证用户是否存在 储备知识 Python 之 decorator装饰器

热门文章

  1. 19-Ubuntu-文件和目录命令-删除文件和目录-rm
  2. 检测到“RuntimeLibrary”的不匹配项
  3. this 、typeof、false、parseInt()、this、arguments、Array和object判断
  4. CSIC_716_20191102【input、数据类型概述、运算符】
  5. Es567严格模式
  6. ctrl+shift+k取消
  7. 【JZOJ6294】动态数点
  8. 解决eclipse启动时出现“failed to load the jni shared library”
  9. C++——虚继承(不要使用,会导致二义性)
  10. VS2010-MFC(菜单:菜单及CMenu类的使用)