上一篇文章,在调查跨节点访问pod的时候用到了tcpdump和iptables两个工具。地址如下
记一次kubernetes Pod跨节点访问不通的调查过程
在调查的过程中,也引发了我的思考。
iptables明明已经把一些包给drop丢弃掉了,tcpdump为什么还能抓到包?
tcpdump与iptables相比谁离的网卡驱动更近一些?
根据自己的思考,在网上搜索相关答案,发现了外国老哥关于tcpdump与iptables相关问题的解答https://superuser.com/questions/925286/does-tcpdump-bypass-iptables
我根据自己的疑问,整理如下
tcpdump与iptables相比谁离的网卡驱动更近一些
tcpdump抓包的位置如下表所示,入流量出网卡后首先会被tcpdump抓到,然后进入iptable的规则。出流量则是先经过iptables,然后经过tcpdump抓包最后进入网卡驱动。
入流量:NIC -> tcpdump -> iptables
出流量:iptables -> tcpdump -> NIC
也就是说tcpdump和iptable相比,tcpdump离着网卡驱动更近一些。
如下图所示,图中绿色三角的位置就是tcpdump起作用的地方。
iptables把包drop丢弃掉了,tcpdump为什么还能抓到包
经过对iptables和tcpdump的分析,我发现这个提问本身还是有问题的。iptalbe将包drop掉了,tcpdump并不是都可以将这些包捕获。应该分情况来看。
入流量
入流量离开网卡后,首先遇到的就是tcpdump。在这种场景下,iptables规则还没有发挥作用。所以tcpdump可以抓到所有的包。
出流量
出流量会先经过iptables的规则处理,iptables的规则是和表table相关联的。而drop是filter表(table)中可以添加的规则。filter表(table)可以在INPUT、FORWARD、OUTPUT链(chain)中绑定。链(chain)可以理解为流量经过的不同阶段。
如下图所示,出流量根据drop规则添加的位置不同,tcpdump是否能抓到包表现也是不相同的。
比如上篇文章跨节点访问pod的问题中,drop规则是添加在FORWARD链上的。
当我们跨节点ping pod时,流量进入tunl0设备后并不会直接进入用户空间,而是根据路由表转发给calixxx网卡。这时因为经过Forward链,所以包被drop掉。tcpdump也就抓不到包。流程如下:
NIC -> PREROUTING -> ROUTE -> FORWARD -> POSTROUTING -> tcpdump
而同节点ping pod时,流量是从用户空间根据路由规则进入calixxx设备,不会经过FORWARD链没有触发drop规则,所以tcpdump可以抓到包。流程如下:
用户空间 -> OUTPUT -> ROUTE -> POSTROUTING -> tcpdump
https://www.zsythink.net/archives/1199