⑴提醒一下自己, 我们只是要得到包含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命令。