如何通过Tcpdump捕获ack或syn数据包?

我想用一个过滤规则来捕获只有ack或syn数据包。 我如何做到这一点?

用于tcpdump的pcapfilter语法应该在wireshark捕获filter上以完全相同的方式工作。

随着tcpdump我会使用这样的filter。

 tcpdump "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0" 

查看tcpdump手册页 ,并密切关注tcpflags。

请务必查看Wireshark Wiki中有关捕获和显示filter的部分。 不幸的是,这两种types的filter使用完全不同的语法,而对于同一个事物则使用不同的名称

如果你想要一个显示filter而不是捕获filter,你可能需要build立一个结合tcp.flags.ack和tcp.flags.syn的expression式。 不过,我对捕捉filter更加熟悉,所以你必须自己去解决。

虽然@ Zoredache的答案很好,但是请注意,该语法将产生任何具有TCP SYN或TCP ACK标志设置的数据包,包括严格地不是纯粹的“TCP SYN”或“TCP ACK”数据包的数据包,因为它们有其他的标志设置。 这可能是也可能不是你(或未来的读者)的意图。 例如,该语法还将捕获TCP SYN-ACK数据包,TCP FIN-ACK等。如果只需要 TCP SYN或TCP ACK数据包(即,只设置其中一个标志),则正确的捕获filter语法是:

 'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack' 

等价的:

 'tcp[13] == 2 or tcp[13] == 16' 

干杯!

我做了一个脚本来看看顶级的“synners”。 为此,我只考虑初始syn数据包(三个数据包握手中的第一个数据包)。 即,syn = 1,ack = 0

 while :; do date; tcpdump -i eth1 -n -c 100 \ 'tcp[tcpflags] & (tcp-syn) != 0' and 'tcp[tcpflags] & (tcp-ack) == 0' 2> /dev/null \ | awk '{ print $3}' \ | sort | uniq -c | sort | tail -5; echo; sleep 1 done 
 tcpdump 'tcp[13] = 3' 

http://danielmiessler.com/study/tcpdump/

高级

您还可以根据数据包的特定部分进行过滤,也可以将多个条件组合在一起。 前者对于仅查找SYN s或RST s很有用,后者则用于更高级的stream量隔离。

UAP RSF

[提示:TCP标志的一个字谜:非技术攻击者Pester Real Security Folk]

你的备忘录:…

给我看所有的紧急( URG )数据包…

 tcpdump 'tcp[13] & 32 != 0' 

显示所有ACKNOWLEDGE( ACK )数据包…

 tcpdump 'tcp[13] & 16 != 0' 

显示所有PUSH( PSH )数据包…

 tcpdump 'tcp[13] & 8 != 0' 

显示所有RESET( RST )数据包…

 tcpdump 'tcp[13] & 4 != 0' 

显示所有SYNCHRONIZE( SYN )数据包…

 tcpdump 'tcp[13] & 2 != 0' 

显示所有FINISH( FIN )数据包…

 tcpdump 'tcp[13] & 1 != 0' 

向我显示所有SYNCHRONIZE / ACKNOWLEDGE( SYNACK )数据包…

 tcpdump 'tcp[13] = 18' 

[ 注:在tcpdump的标志字段输出中只显示PSHRSTSYNFIN标志。 URGACK ,但在输出的其他地方显示,而不是在标志字段中显示]

我只想得到自己的SYN数据包,我使用了下面的命令:

tcpdump -i eth7 'tcp[13] & 2 != 0'

这应该直接为你工作。

它应该显示他们没有任何filter或参数。