hairpin中文翻译为发卡。bridge不允许包从收到包的端口发出,比如bridge从一个端口收到一个广播报文后,会将其广播到所有其他端口。bridge的某个端口打开hairpin mode后允许从这个端口收到的包仍然从这个端口发出。这个特性用于NAT场景下,比如docker的nat网络,一个容器访问其自身映射到主机的端口时,包到达bridge设备后走到ip协议栈,经过iptables规则的dnat转换后发现又需要从bridge的收包端口发出,需要开启端口的hairpin mode。See https://wiki.mikrotik.com/wiki/Hairpin_NAT

我们在使用Kubernetes的时候遇到了一个大流量的问题,集群计算节点偶然流量突增,机器ping不通。

网络运营的同事反馈说从交换机上发现这些服务器组播包很多

对其进行了抓包分析和系统各模块梳理排查,但是只能截取到VRRP组播报文。

分析不出来,限流组播报文!ebtables -A INPUT --pkttype-type multicast --limit 1000/s -j ACCEPT, ebtables -A INPUT --pkttype-type multicast -j DROP

发现Ebtables drop规则计数偶现增长 => 写脚本抓取计数增长时刻的报文并告警 => 禁止IPv6 DAD报文 抓取的样例报文有大量ICMP6/ARP报文 => 内核发出的IPv6 dad报文=>关闭容器网卡IPv6

后续发现关闭ipv6功能后,问题依然复现了。是否方向错了,不是dad报文导致的?

正没有头绪的时候,网平DC运营组同事提示是否开启了hairpin mode。在主机上查看确实物理网卡开启了hairpin mode。经查发现是K8s老版本的代码bug,本意是开启容器veth device的hairpin mode,支持同主机容器的NAT访问,新版本已经修复,commit参见0cfd09。从代码上分析如果在创建容器的时候并发删除容器,拉起pod的线程有可能正在尝试进入容器的网络空间给veth设备配置hairpin mode,而如果容器进程已经停止了,所以都没进入容器的网络空间,代码中就会尝试给所有的网卡都配置hairpin mode,就给主机的所有网卡都配置了hairpin mode。

那开启Hairpin mode为啥会造成这么多流量?我们FloatingIP使用bridge拓扑下,eth1与bridge桥接,eth1如果收到一个组播/广播报文,bridge会将这个报文广播(默认收到组播报文会flood到所有口mcast_flood可以关闭)到所有端口,也就是回头又会从eth1出去,然后交换机收到报文后又会广播,被也开启hairpin的主机收到后同样会广播回交换机和其他主机,这样就形成了大量的流量。

我们用bridge设备和veth设备做个简单的测试就可以验证这个问题,创建两个网桥和一对veth设备,将veth设备的两端分别连接到两个网桥上,up所有网卡,将其中一个网桥配上一个ip地址后,用arping从配ip地址的网桥上发送一个arp宣告的广播报文,在另一个网桥上抓包,可以收到一条arp报文,但是当我们将veth设备都开启hairpin mode后,再发一个arp宣告,再次抓包,我们会收到无穷无尽的arp包。

附测试的操作过程

ip link add br0 type bridge

ip link add br1 type bridge

ip link add dev v0 type veth peer name v1

ip link set v0 master br0

ip link set v1 master br1

ip link set br0 up

ip link set br1 up

ip link set v0 up

ip link set v1 up

ip ad add 192.168.0.1/24 dev br0

[root@10 vagrant]# arping -c 1 -A -I br0 192.168.0.1

ARPING 192.168.0.1 from 192.168.0.1 br0

Sent 1 probes (1 broadcast(s))

Received 0 response(s)

[root@10 vagrant]# tcpdump -vvnneSs 0 -i v1

tcpdump: WARNING: v1: no IPv4 address assigned

tcpdump: listening on v1, link-type EN10MB (Ethernet), capture size 65535 bytes

15:52:20.866169 66:83:79:e3:a5:6c > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Reply 192.168.0.1 is-at 66:83:79:e3:a5:6c, length 28

bridge link set dev v0 hairpin on

bridge link set dev v1 hairpin on

[root@10 vagrant]# bridge -d link show

15: v1 state UP @v0: mtu 1500 master br1 state forwarding priority 32 cost 2

hairpin on guard off root_block off fastleave off

16: v0 state UP @v1: mtu 1500 master br0 state forwarding priority 32 cost 2

hairpin on guard off root_block off fastleave off

[root@10 vagrant]# arping -c 1 -A -I br0 192.168.0.1

ARPING 192.168.0.1 from 192.168.0.1 br0

Sent 1 probes (1 broadcast(s))

Received 0 response(s)

[root@10 vagrant]# tcpdump -vvnneSs 0 -i v1

tcpdump: WARNING: v1: no IPv4 address assigned

tcpdump: listening on v1, link-type EN10MB (Ethernet), capture size 65535 bytes

15:53:53.586450 66:83:79:e3:a5:6c > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Reply 192.168.0.1 is-at 66:83:79:e3:a5:6c, length 28

15:53:53.586479 66:83:79:e3:a5:6c > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Reply 192.168.0.1 is-at 66:83:79:e3:a5:6c, length 28

15:53:53.586489 66:83:79:e3:a5:6c > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Reply 192.168.0.1 is-at 66:83:79:e3:a5:6c, length 28

15:53:53.586491 66:83:79:e3:a5:6c > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Reply 192.168.0.1 is-at 66:83:79:e3:a5:6c, length 28

15:53:53.586494 66:83:79:e3:a5:6c > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Reply 192.168.0.1 is-at 66:83:79:e3:a5:6c, length 28

15:53:53.586495 66:83:79:e3:a5:6c > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Reply 192.168.0.1 is-at 66:83:79:e3:a5:6c, length 28

...

来源:oschina

链接:https://my.oschina.net/u/4361028/blog/4728194

linux bridge 抓包,Linux bridge hairpin mode相关推荐

  1. Linux日常运维管理技巧(一)监控系统状态、监控网卡流量、监控IO性能、查看系统进程、查看网络状态、Linux下抓包tcpdump、Linux网络相关、DNS配置

    目录 监控系统状态 监控网卡流量 监控IO性能 查看系统进程 查看网络状态 Linux下抓包 Linux网络相关 监控系统状态 w/uptime查看系统负载 [root@zyshanlinux-01 ...

  2. 监控io性能,free命令,ps网络命令,查看网络状态,Linux下抓包

    10.6 监控io性能 磁盘的io是一个非常重要的指标,所以要更详细的查看磁盘状态,需要用到iostat命令,如果之前已经安装了sysstat包的话,在安装sysstat包时iostat命令就已经被安 ...

  3. 监控io性能, free命令, ps命令, 查看网络状态, linux下抓包

    2019独角兽企业重金招聘Python工程师标准>>> 监控io性能 free命令 ps命令 查看网络状态 linux下抓包 --- 监控io性能 查看磁盘 iostat 和sar属 ...

  4. linux下怎么监控网络 io swap,监控io性能,free命令,ps命令,查看网络状态,linux下抓包...

    监控io性能 [root@localhost ~]# iostat Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2017年09月12日 _x ...

  5. 七周二次课(1月23日) 10.6 监控io性能 10.7 free命令 10.8 ps命令 10.9 查看网络状态 10.10 linux下抓包...

    七周二次课(1月23日) 10.6 监控io性能 10.7 free命令 10.8 ps命令 10.9 查看网络状态 10.10 linux下抓包 ========================== ...

  6. centost查看网络信息_监控io性能、free命令、ps命令、查看网络状态、Linux下抓包...

    一.监控io性能 iostat命令 iostat命令被用于监视系统输入输出设备和cpu的使用情况.它的特点是汇报磁盘活动统计情况,同时也会汇报出cpu使用情况.通vmstat一样,iostat也有一个 ...

  7. linux服务器udp抓包工具,Linux下抓包工具tcpdump使用介绍

    点评:在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一,本文将介绍Linux下抓包工具tcpdump使用,需要的朋友可以参考下 在传统的网络分析和测试技术中,嗅探器 ...

  8. linux下怎么监控网络 io swap,监控io性能,free命令,ps命令,查看网络状态,linux下抓包(示例代码)...

    监控io性能 [[email protected] ~]# iostat Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2017年09月12日 ...

  9. Linux tcpdump抓包

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  10. 【linux tcp抓包之三次握手】

    [linux tcp抓包之三次握手] 写在前面 三次握手 tcpdump 参数说明 返回值说明 IP 127.0.0.1.42004 > 127.0.0.1.5051 Flags [S] win ...

最新文章

  1. 分享ShareSDK
  2. 漫画:五分钟学会贪心算法!
  3. JavaEE(14) - JPA关联映射
  4. 弹出框插件layer使用
  5. 给QTreeWidget添加右键菜单功能
  6. phpStudy mysql升级至5.7
  7. Linux / 惊群效应
  8. 实验10 编写子程序
  9. 迅雷影音怎样 1.5倍速度播放
  10. mysql wb bbu_BBU
  11. c语言最短延时程序,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写...
  12. 勒索病毒恐难暴力破解 国内比特币平台尚买币潮
  13. Netty工作笔记0042---Netty入门--编写客户端
  14. python批量读取文件赋值给一个参数_求助一个Python 循环读取文件,并对读到的字符串进行赋值,然后进一步生成json file 的方法。...
  15. php无限级回复页面如何嵌套,php无限级评论嵌套实现代码
  16. java面向对象传播智客,传智播客java培训 java基础之javabean
  17. python爬虫 爬取网页图片
  18. 组建家庭计算机网络过程是怎么样的,如何组建完善的家庭无线网络操作步骤
  19. 计算机课反思的作文600字,中考反思作文600字6篇
  20. C语言printf输出百分号

热门文章

  1. h5跳转高德百度导航
  2. 新手iso系统怎么安装 新手安装iso镜像文件详细步骤
  3. linux中iso源码解压_linux下解压iso镜像文件方法
  4. linux 效果器软件下载,盘点丨15款免费又好用的音乐制作软件
  5. Java面试题大全(part_4)
  6. 博纳影业明日上市:于冬陷入与江疏影绯闻 被曝斥资千万买珠宝
  7. Java 并发编程(一):简介
  8. 网易免费邮箱服务器,网易免费邮箱重新免费开放POP3/SMTP服务
  9. linux chm 阅读器,linux下最好的chm阅读器KchmViewer,安装使用/与oklular,xCHM,gnochm简单比较...
  10. 在线CHM阅读器(2)——文件提取及关键文件解析