命令概要
Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是不可少的。TcpDump 是 Linux 中强大的网络数据采集分析工具之一。
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。
作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。
TCPDump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
tcpdump 常用示例
查看当前机器有哪些网络接口
1 | # tcpdump -D |
针对指定主机抓包
1 | # tcpdump -i any -n -nn host 192.168.1.10 -w ./$(date +%Y%m%d%H%M%S).pcap |
针对指定端口抓包
1 | # tcpdump -i any -n -nn port 80 -w ./$(date +%Y%m%d%H%M%S).pcap |
针对主机和端口抓包,两者关系 and
1 | # tcpdump -i any -n -nn host 192.168.1.10 and port 80 -w ./$(date +%Y%m%d%H%M%S).pcap |
针对多个端口抓包
1 | # tcpdump -i any -n -nn port 111 or port 443 |
针对多个主机抓包
1 | # tcpdump -i any -n -nn host www.baidu.com or www.360.com |
其他示例:
抓取访问destination 443端口的包
1 | # tcpdump -i any -n dst port 443 # 然后我们做一个curl https://www.baidu.com的操作 |
抓取源端口是80的包
1 | # tcpdump -i any -nn src port 80 |
抓取源或者目标端口都是80的包
1 | # tcpdump -i any -n -nn port 80 |
表示抓取destination prot 在100到455之间的端口的数据
1 | # tcpdump -i any -n -nn dst portrange 100-455 # 在另外的面做curl https://www.baidu.com 以及 telnet www.baidu.com 111 |
抓取源的端口是20-80的包
1 | # tcpdump -i any -n src portrange 20-80 |
抓取端口是20-80的包,不考虑源或目标
1 | # tcpdump -i any -n portrange 20-80 |
抓取destination为www.baidu.com的包
1 | # tcpdump -i any dst www.baidu.com # 然后ping www.baidu.com ,以及 curl www.baidu.com |
抓取destination为192.168.1.[0-255]的包
1 | # tcpdump -i any -n -nn dst 192.168.1 # 可以指定范围 ★★★★★ 注意用法 不是一个完整的IP地址 |
抓取source为192.168.*.*的包
1 | # tcpdump -i any -n -nn src host 192.168 # 等价于 tcpdump -i any -n -nn src 192.168 |
抓取192.168的包(不管是source还是destination )
1 | # tcpdump -i any -n -nn host 192.168 |
抓取包长度小于800的包
1 | # tcpdump -i any -n -nn less 800 |
抓取包长度大于800的包
1 | # tcpdump -i any -n -nn greater 800 |
只抓取tcp包
1 | # tcpdump -i any -n tcp |
只抓取udp包
1 | # tcpdump -i any -n udp |
只抓取icmp的包,internet控制包
1 | # tcpdump -i any -n icmp |
tcpdump 命令格式
1 | # tcpdump option filter |
option 举例 -n,-i any 等
filter 是过滤包的条件,举例:tcp,portrange 1-1000,src port 58895,host www.itshouce.com.cn,
filter可以进行组合 比如:dst port 3306 and src port 58895,portrange 1-1000 or src port 58895 not dst port 3306
option filter 举例:tcpdump -i any -n portrange 1-3306 or portrange 10000-58895
tcpdump 常见选项
参见:man tcpdump
1 | -A 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据(nt: 即Handy for capturing web pages). |
tcpdump 条件表达式
该表达式用于决定哪些数据包将被打印。如果不给定条件表达式,网络上所有被捕获的包都会被打印。否则,只有满足条件表达式的数据包被打印.(nt: all packets, 可理解为,所有被指定接口捕获的数据包)。
表达式由一个或多个表达元组成(nt:primitive,表达元,可理解为组成表达式的基本元素)。一个表达元通常由一个或多个修饰符(qualifiers)后跟一个名字或数字表示的id组成(nt:即 qualifiers id )。有三种不同类型的修饰符:type、dir以及 proto。
参见:man pcap-filter
1 | type 修饰符指定id 所代表的对象类型, id可以是名字也可以是数字. |
1 | dir 修饰符描述id 所对应的传输方向, 即发往id 还是从id 接收(nt: 而id 到底指什么需要看其前面的type 修饰符)。 |
1 | proto 修饰符描述id 所属的协议. 可选的协议有: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp以及 upd. |
表达式顺序:proto dir type
对于修饰符后跟id 的格式,可理解为 type id 是对包最基本的过滤条件:即对包相关的主机,网络,端口的限制;dir 表示对包的传送方向的限制;proto表示对包相关的协议限制
表达元之间还可以通过关键字and,or 以及 not 进行连接,从而可组成比较复杂的条件表达式。比如,host foo and not port ftp and not port ftp-data (nt:其过滤条件可理解为,数据包的主机为foo,并且端口不是ftp(端口21) 和ftp-data(端口20,常用端口和名字的对应可在linux 系统中的/etc/service 文件中找到))。
为了表示方便,同样的修饰符可以被省略,如 tcp dst port ftp or ftp-data or domain 与以下的表达式含义相同 tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain。(nt:其过滤条件可理解为:包的协议为tcp,目的端口为ftp 或 ftp-data 或 domain(端口53) )。