- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试使用 tcpdump 嗅探 http header 。
这个过滤器很好用,但我看不懂 -
(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)
我用谷歌搜索过,但找不到任何有用的信息
这是整个tcpdump命令
sudo tcpdump -A 'dst [dest host] or src [src host] and tcp and
(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i eth0
最佳答案
获取 http header 的不是 BPF 过滤器,而是 tcpdump 命令上的“-A”开关。
您的 tcpdump 命令查找到特定目的地或来自 eth0 上特定源的 tcp 流量,其中最终 BPF 过滤器涉及导致非零总数的计算。使用“-A”选项,它以 ASCII 打印每个数据包减去其链接级别 header 。
我已经在下面解释了计算,但我认为实际过滤器中存在一些问题,可能是通过复制和粘贴造成的。当您在 tcpdump 中使用这些过滤器时,您正在使用 tcp 位掩码,这通常在检查不落在字节边界上的字段时使用
ip[2:2]
指的是 IP header 中的两个字节(即第 3 和第 4 个字节),从字节 2 开始(记住它从偏移量 0 开始)。此总数表示 IP 数据包的总长度,最大长度为 65535 字节。对于这里的位掩码,为了清楚起见,我在前面加上了一个“0”,所以掩码 0xf
变成了 0x0f
。根据下面 GuyHarris 的评论,掩码上的前导“0”被删除。
ip[0]&0x0f
指的是 IP header 中字节 0 的后半部分(即第一个字节),它将为您提供 32 位字的 IP header 长度和因此,对于此类计算,通常将其乘以 4。
tcp[12]&0xf0)
指的是第12字节的前半部分(即第11字节),是数据偏移域,它指定了TCP头中的大小32 位字,因此,通常将其乘以 4 以进行此类计算。
您需要将最后 2 个长度乘以 4,因为它们是 32 位/4 字节字,因此需要转换为以字节为单位的总计才能使计算正确
您的过滤器应该正在计算:
并寻找该值为零的值,即类似这样的值
sudo tcpdump -A -nnpi eth0 '(ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'
当您执行减法时,您正在寻找一个非零总数。这个非零总数意味着第 4 层之上有数据,即 tcp 有效负载中的数据,通常是应用程序流量。
假设大多数 http 流量都通过端口 80,您可能还想添加 端口 80
。
这样的过滤器通常被安全人员用来检测 SYN 上的数据,这是不正常的,但根据 RFC,这是允许的。所以整个事情看起来像 -
'tcp[13]=0x02 and (ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'
TCPIPGuide顺便说一句,是关于 TCP/IP 的非常好的免费在线指南。
更新:根据 Guy Harris 的更新修改位掩码上的“前导零”部分。
关于linux - 了解 Tcpdump 过滤器和位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11757477/
我是一名优秀的程序员,十分优秀!