之前写网络程序,使用过wireshark,不过发现在Linux平台,特别是服务器上面,tcpdump这个工具使用的更多一些,所以学习一下。网上的例子大多比较冗余,我觉得对于这种强大的工具,大多数人大多数场景中只要掌握最常用的一些语法和使用技巧即可。需要研究某个细节的,直接去看man文档最好。偶然的机会,发现潜水大叔的一篇文章我觉得总结的很清楚明了,收藏学习一下(高级部分暂未转载,有兴趣的可以去看原文)。

原文地址:http://linuxwiki.github.io/NetTools/tcpdump.html

一般情况下,非HTTP协议的网络分析,在服务器端用tcpdump比较多,在客户端用wireshark比较多,两个抓包软件的语法是一样的。

一,基本语法

1.1 过滤主机

  • 抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据
tcpdump -i eth1 host 192.168.1.1
  • 指定源地址
tcpdump eth1 src host 192.168.1.1
  • 指定目的地址
tcpdump eth1 dst host 192.168.1.1

1.2 过滤端口

  • 抓取所有经过eth1,目的或源端口是25的网络数据
tcpdump -i eth1 port 25
  • 指定源端口
tcpdump -i eth1 src port 25
  • 指定目的端口
tcpdump -i eth1 dst port 25

1.3 网络过滤

tcpdump -i eth1 net 192.168
tcpdump -i eth1 src net 192.168
tcpdump -i eth1 dst net 192.168

1.4 协议过滤

tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp

1.5 常用表达式

非:! 或者 not
且:&& 或者 and
或:|| 或者 or
  • 抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的tcp数据
tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
  • 抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据
tcpdump -i eth1 '((icmp) and (ether dst host 00:01:02:03:04:05))'
  • 抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的tcp数据
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'

未完待续...