为什么 tcpdump 捕获许多带有“(tcp-syn) != 0”的数据包,但不捕获带有“tcp[tcpflags] & (tcp-syn) != 0”的数据包

为什么 tcpdump 捕获许多带有“(tcp-syn) != 0”的数据包,但不捕获带有“tcp[tcpflags] & (tcp-syn) != 0”的数据包

我想捕获我的计算机和 VPN 服务器之间 UDP 连接的初始握手。为此,我正在使用tcpdump但我不明白为什么:

tcpdump dst port 1194 and "tcp[tcpflags] & (tcp-syn) != 0"

不会捕获任何东西,同时

tcpdump dst port 1194 and "(tcp-syn) != 0" 

当它应该只捕获启动握手的第一个 SYN 数据包时,在连接期间捕获多个数据包。

tcp[tcpflags]是用来做什么的?

答案1

  1. tcp[tcpflags]是一个变量,存储当前捕获的 TCP 数据包上的 TCP 标志(位)。tcp-syn是一个常量,除了 TCP SYN 数据包对应的位之外,其他位置均为零。因此:

    tcpdump dst port 1194 and "(tcp-syn) != 0" 
    

    相当于

    tcpdump dst port 1194 and 1 = 1
    
  2. UDP 协议更简单并且没有这些标志 - UDP 流量中没有 SYN、ACK 等。因此,如果不检查 UDP 数据包的内容,就无法捕获真正的握手。

  3. 如果 VPN 通信确实通过 UDP 运行。那么第一条规则将不会捕获“握手”,因为它仅适用于 TCP 数据包。第二个将捕获它,但连同指向端口 1194 的所有内容 - TCP 和 UDP。

相关内容