2024年11月Linux系统如何使用tcpdump命令(4)

发布时间:

  ⑴提醒一下自己, 我们只是要得到包含SYN标志的数据包。 让我们看看在一个包的包头中, 如果SYN位被设置, 到底

  ⑵在号字节发生了什么:

  ⑶|C|E|U|A|P|R|S|F|

  ⑷|---------------|

  ⑸| |

  ⑹|---------------|

  ⑺| |

  ⑻在控制段的数据中, 只有比特(bit number 被置位。

  ⑼假设编号为的字节是一个位的无符号字符型,并且按照网络字节号排序(nt:对于一个字节来说,网络字节序等同于主机字节序, 其二进制值

  ⑽并且其进制值为:

  ⑾*^ + *^ + *^ + *^ + *^ + *^ + *^ + *^ = (nt: * ^ 表示乘以的次方, 也许这样更

  ⑿清楚些, 即把原来表达中的指数 。。. 挪到了下面来表达

  ⒀接近目标了, 因为我们已经知道, 如果数据包头部中的SYN被置位, 那么头部中的第个字节的值为(nt: 按照网络序, 即大头方式, 最重要的字节

  ⒁在前面(在前面,即该字节实际内存地址比较小, 最重要的字节,指数学表示中数的高位, 如中的 。

  ⒂表达为tcpdump能理解的关系式就是:

  ⒃从而我们可以把此关系式当作tcpdump的过滤条件, 目标就是监控只含有SYN标志的数据包:

  ⒄tcpdump -i xl tcp[] (nt: xl 指网络接口, 如eth

  ⒅这个表达式是说“让TCP数据包的第个字节拥有值吧”, 这也是我们想要的结果。

  ⒆现在, 假设我们需要抓取带SYN标志的数据包, 而忽略它是否包含其他标志。(nt:只要带SYN就是我们想要的。 让我们来看看当一个含有

  ⒇SYN-ACK的数据包(nt:SYN 和 ACK 标志都有, 来到时发生了什么:

  ⒈|C|E|U|A|P|R|S|F|

  ⒉|---------------|

  ⒊| |

  ⒋|---------------|

  ⒌| |

  ⒍号字节的号和号位被置位, 其二进制的值为:

  ⒎转换成十进制就是:

  ⒏*^ + *^ + *^ + *^ + *^ + *^ + *^ + * = (nt: * ^ 表示乘以的次方, 也许这样更

  ⒐清楚些, 即把原来表达中的指数 。。. 挪到了下面来表达

  ⒑现在, 却不能只用’tcp[] ‘作为tcpdump的过滤表达式, 因为这将导致只选择含有SYN-ACK标志的数据包, 其他的都被丢弃。

  ⒒提醒一下自己, 我们的目标是: 只要包的SYN标志被设置就行, 其他的标志我们不理会。

  ⒓为了达到我们的目标, 我们需要把号字节的二进制值与其他的一个数做AND操作(nt:逻辑与来得到SYN比特位的值。 目标是:只要SYN 被设置

  ⒔就行, 于是我们就把她与上号字节的SYN值(nt: 。

  ⒕ SYN-ACK SYN

  ⒖AND (we want SYN AND (we want SYN

  ⒗-------- --------

  ⒘我们可以发现, 不管包的ACK或其他标志是否被设置, 以上的AND操作都会给我们相同的值, 其进制表达就是(进制表达就是。

  ⒙从而我们知道, 对于带有SYN标志的数据包, 以下的表达式的结果总是真(true:

  ⒚( ( value of octet AND ( ( (nt: value of octet , 即号字节的值

  ⒛灵感随之而来, 我们于是得到了如下的tcpdump 的过滤表达式

  ①tcpdump -i xl ’tcp[] & ‘

  ②注意, 单引号或反斜杆(nt: 这里用的是单引号不能省略, 这可以防止shell对&的解释或替换。

  ③上面就是Linux下tcpdump命令的用法介绍了,本文主要通过实例对tcpdump命令做了简单的介绍,以便你能更好的理解tcpdump命令。