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


48

我想使用过滤规则仅捕获ack或syn数据包。我该怎么做呢?


我个人不会这样做。我会捕获所有数据包,然后在SYN和ACK标志上进行过滤。如果要对TCP进行故障排除,则几乎总是希望看到整个对话,而不仅仅是握手或ACK。如果您对实际的数据有效负载不感兴趣,可以使用限制数据包的大小tcpdump -s SIZE。TCP标头可以是可变长度,因此捕获-s 128可能会获取所有可能的标头以及一点点数据。
suprjami 2014年

4
也许您没有对TCP进行故障排除。也许您想查看程序的健谈程度,并希望计算其出站连接数。像我一样,现在。
丹·普里兹

Answers:


81

用于tcpdump 的pcap过滤器语法应在Wireshark捕获过滤器上以完全相同的方式工作。

使用tcpdump时,我将使用这样的过滤器。

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

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

确保还检查Wireshark Wiki中有关捕获和显示过滤器的部分。不幸的是,两种类型的过滤器使用完全不同的语法,并且同一事物使用不同的名称。

如果要使用显示过滤器而不是捕获过滤器,则可能需要构建一个将tcp.flags.ack和tcp.flags.syn组合在一起的表达式。不过,我对捕获过滤器更为熟悉,因此您必须自己解决这个问题。


1
我更喜欢你的回应。看来您已经努力了。为您投票。
Ablue 2010年

4
这是一个很好的参考答案,但请注意,即使同时设置了其他标志,此语法也会捕获任何设置了SYN或ACK标志的数据包。这可能是OP的预期结果,也可能不是。如果只需要TCP SYN或ACK数据包,请参阅下面的答案,以获得更严格的过滤器。干杯。
JJC 2012年

14

尽管@Zoredache的回答很好,而且很完整,但是请注意,该语法将产生任何设置了TCP SYN或TCP ACK标志的数据包,包括严格意义上不是纯“ TCP SYN”或“ TCP ACK”数据包的数据包,因为它们设置了其他标志。这可能不是您(或将来的读者)想要的。例如,该语法还将捕获TCP SYN-ACK数据包,TCP FIN-ACK等。如果仅需要 TCP SYN或TCP ACK数据包(即设置这些标志之一),则正确的捕获过滤器语法为:

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

等效地:

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

干杯!


9

我编写了一个脚本,以查看最重要的“同步器”。为此,我只考虑初始的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

5
这是一个很好的例子。您可以将tcpdump捕获过滤器进一步简化,只需将'tcp [tcpflags]&(tcp-syn)!= 0'和'tcp [tcpflags]&(tcp-ack)== 0'“替换为'tcp [tcpflags ] == tcp-syn'。这将自动排除设置了ACK的数据包。干杯!
JJC 2012年

9
tcpdump 'tcp[13] = 3'

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

高级

您还可以根据数据包的特定部分进行过滤,以及将多个条件组合成组。例如,前者在仅查找SYNs或RSTs 时很有用,而后者则用于更高级的流量隔离。

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'

[ 注:只有PSHRSTSYN,和FIN标志显示在tcpdump的的标志字段输出。会显示URGs和ACKs,但它们会显示在输出中的其他位置,而不是在flags字段中显示]


2
抄袭不允许在Stack Exchange上进行。请编辑此帖子,以明确您已从链接站点复制了内容。谢谢。
克里斯S

4

我只想自己获取SYN数据包,所以使用了以下命令:

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

这应该立即为您工作。


3
这将捕获所有设置了SYN标志的数据包,包括SYN,SYN-ACK等。如果只需要SYN数据包,请改用'tcp [13] == 2'。干杯!
JJC 2012年

1

它应该显示它们,而不包含任何过滤器或参数。


从技术上来说,您的回答是正确的,但是OP可能要在他的问题中包括“仅”一词。;-)干杯!
JJC 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.