• Long Live Kubernetes!
  • 可关注微信公众第一时间知晓网站动态。 微信公众号
  • Long Live Linux!
  • 您觉得本站非常有看点,可以收藏本站,本站将持续推出高质量文章!
  • This site has been created and is maintained by and is the sole property of Yok8s.com. No part of this site may be copied or reproduced without express written consent from the authors of this site.

Linux网络抓包命令之tcpdump

linux网络 Rocloong 4个月前 (09-09) 73次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

上图直观展示了数据包到达网卡后,经过数据包过滤器(BPF)筛选后,拷贝到用户态的tcpdump程序,以供tcpdump工具进行后续的处理工作,输出或保存到 pcap 文件。BPF主要作用是依据用户输入的过滤规则,仅将用户关心的数据包拷贝至tcpdump,大大减少不必要的数据包拷贝,降低抓包带来的性能损耗!

命令参数

tcpdump有众多命令参数,需要理解所有选项及参数可在Linux命令行输入tcpdump -h或者man tcpdump查看每个选项及参数含义。

[root@ubuntu ~]# tcpdump -h
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]

参数详解

[-A] 以ASCII格式打印出所有分组,并将链路层的头最小化。
[-c] 在收到指定的数量的分组后,tcpdump就会停止。
[-C] 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size
中指定的大小。如果超过了指定大小,则关闭当前文件,然后再打开一个新的文件。参数 file_size
的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
[-d] 将匹配信息包的代码以人们能够理解的汇编格式给出。
[-dd] 将匹配信息包的代码以c语言程序段的格式给出。
[-ddd] 将匹配信息包的代码以十进制的形式给出。
[-D] 打印出系统中所有可以用tcpdump截包的网络接口。
[-e] 在输出行打印出数据链路层的头部信息。
[-E] 用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。
[-f] 将外部的Internet地址以数字的形式打印出来。
[-F] 从指定的文件中读取表达式,忽略命令行中给出的表达式。
[-i] 指定监听的网络接口。
[-l] 使标准输出变为缓冲行形式。
[-L] 列出网络接口的已知数据链路。
[-m] 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。
[-M] 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。
[-n] 不把网络地址转换成名字。
[-N] 不输出主机名中的域名部分。例如,link.linux265.com 只输出link。
[-t] 在输出的每一行不打印时间戳。
[-O] 不运行分组分组匹配(packet-matching)代码优化程序。
[-P] 不将网络接口设置成混杂模式。
[-q] 快速输出。只输出较少的协议信息。
[-r] 从指定的文件中读取包(这些包一般通过-w选项产生)。
[-S] 将tcp的序列号以绝对值形式输出,而不是相对值。
[-s] 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
[-T] 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
[-t] 不在每一行中输出时间戳。
[-tt] 在每一行中输出非格式化的时间戳。
[-ttt] 输出本行和前面一行之间的时间差。
[-tttt] 在每一行中输出由date处理的默认格式的时间戳。
[-u] 输出未解码的NFS句柄。
[-v] 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
[-vv] 输出详细的报文信息。
[-w] 直接将分组写入文件中,而不是不分析并打印出来。
[-x] 以16进制数形式显示每一个报文 (去掉链路层报头) . 可以显示较小的完整报文, 否则只显示snaplen个字节.
[-xx] 以16进制数形式显示每一个报文(包含链路层包头)。
[-X] 以16进制和ASCII码形式显示每个报文(去掉链路层报头)。
[-XX] 以16进制和ASCII吗形式显示每个报文(包含链路层报头)。
[-y] 设置tcpdump 捕获数据链路层协议类型
[-Z] 使tcpdump 放弃自己的超级权限(如果以root用户启动tcpdump, tcpdump将会有超级用户权限), 并把当前tcpdump的用户ID设置为user, 组ID设置为user首要所属组的ID

话不多说上示例

示例1:抓取所有网络包,并在terminal中显示抓取结果(十六进制的形式显示)

[root@ubuntu ~]#tcpdump

示例2:抓取所有的网络包,并存到result.cap文件中

[root@ubuntu ~]#tcpdump -w result.cap

示例3:抓取所有的经过eth0网卡的网络包,并存到result.cap文件中

[root@ubuntu ~]#tcpdump -i eth0 -w result.cap

示例4:抓取源地址是192.168.1.100的包,并将结果保存到result.cap文件中

[root@ubuntu ~]#tcpdump src host 192.168.1.100 -w result.cap

示例5:抓取地址包含是192.168.1.100的包,并将结果保存到result.cap文件中

[root@ubuntu ~]#tcpdump host 192.168.1.100 -w result.cap

示例6:抓取目的地址包含192.168.1.100的包,将结果保存到result.cap文件中

[root@ubuntu ~]#tcpdump dest host 192.168.1.100 -w result.cap

示例7:抓取主机地址为192.168.1.100的数据包

[root@ubuntu ~]#tcpdump -i eth0 -vnn host 192.168.1.100

示例8:抓取包含192.168.1.0/24网段的数据包

[root@ubuntu ~]#tcpdump -i eth0 -vnn net 192.168.1.0/24

示例9:抓取网卡eth0上所有包含端口22的数据包

[root@ubuntu ~]#tcpdump -i eth0 -vnn port 22

示例10:抓取指定协议格式的数据包,协议格式可以是「udp,icmp,arp,ip」中的任何一种,例如UDP协议格式:

[root@ubuntu ~]#tcpdump udp -i eth0 -vnn

示例11:抓取经过eth0网卡的源ip是192.168.1.100数据包,src参数表示源

[root@ubuntu ~]#tcpdump -i eth0 -vnn src host 192.168.1.100

示例12:抓取经过eth0网卡目的ip是192.168.1.100数据包,dst参数表示目的

[root@ubuntu ~]#tcpdump -i eth0 -vnn dst host 192.168.1.100

示例13:抓取源端口是22的数据包

[root@ubuntu ~]#tcpdump -i eth0 -vnn src port 22

示例14:抓取源ip是192.168.1.100且目的ip端口是22的数据包

[root@ubuntu ~]#tcpdump -i eth0 -vnn src host 192.168.1.100 and dst port 22

示例15:抓取源ip是192.168.1.100或者包含端口是22的数据包

[root@ubuntu ~]#tcpdump -i eth0 -vnn src host 192.168.1.100 or port 22

示例16:抓取源ip是192.168.1.100且端口不是22的数据包

[root@ubuntu ~]#tcpdump -i eth0 -vnn src host 192.168.1.100 and not port 22

示例17:抓取源ip是192.168.1.100且目的端口是22,或源ip是192.168.1.102且目的端口是80的数据包

[root@ubuntu ~]#tcpdump -i eth0 -vnn ( src host 192.168.1.100 and dst port 22 ) or ( src host 192.168.1.102 and dst port 80 )

示例18:将抓取数据包记录存到/tmp/result文件中,当抓取100个数据包后退出

[root@ubuntu ~]#tcpdump –i eth0 -vnn -w /tmp/result -c 100

示例19:从/tmp/result记录中读取tcp协议的数据包

[root@ubuntu ~]#tcpdump -i eth0 tcp -vnn -r /tmp/result

示例20:想要截获所有192.168.1.100 的主机收到的和发出的所有的数据包

[root@ubuntu ~]#tcpdump host 192.168.1.100

示例21:获取除了192.168.1.100和192.168.1.101主机之外所有通信的ip包

[root@ubuntu ~]#tcpdump ip host 192.168.1.100 and ! 192.168.1.101

示例22:如果想要获取主机192.168.1.100接收或发出的telnet包

[root@ubuntu ~]#tcpdump tcp port 23 host192.168.1.100

示例23:指定抓取2个数据包

[root@ubuntu ~]#tcpdump -c 2

示例24:读取记录文件

[root@ubuntu ~]#tcpdump -r tcpdump_test.log

示例25:打印出所有可工作的接口

[root@ubuntu ~]#tcpdump -D

示例26:显示更详细的数据包信息 -v -vv:

[root@ubuntu ~]#tcpdump -v / tcpdump -vv

示例27:不使用域名反解

使用-n后,tcpdump会直接显示IP地址,不会显示域名(与netstat命令相似)

示例28:打印所有进入或离开sundown的数据包

[root@ubuntu ~]#tcpdump host sundown

示例29:截获主机210.27.48.1和主机210.27.48.2或210.27.48.3的通信

[root@ubuntu ~]#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

示例30:监视所有送到主机hostname的数据包

[root@ubuntu ~]#tcpdump -i eth0 dst host hostname

示例31:获取主机210.27.48.1接收或发出的telnet包

[root@ubuntu ~]#tcpdump tcp port 23 and host 210.27.48.1

示例32:使用tcpdump抓取HTTP包

[root@ubuntu ~]#tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 为"GET"前两个字母"GE"
0x4854 为"HTTP"前两个字母"HT"
示例33:查看数据包完整内容

方法一:
使用-A参数能以ASCII码显示数据包。
例:只抓取1个数据包,并显示其内容命令:
[root@ubuntu ~]#tcpdump -c 1 -A
方法二:
使用-X参数能以16进制数与ASCII码共同显示数据包。
例:只抓取1个数据包,并显示其内容命令:
[root@ubuntu ~]#tcpdump -c 1 -X

示例34:保存数据包为wireshark能识别的文件

[root@ubuntu ~]#tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/2

总结

收藏本文可以当字典使用查询tcpdump相关命令使用,熟悉并掌握常用的tcpdump抓包命令案例,其余较为冷门的tcpdump命令当用到再通过man tcpdump查看。具体命令参数可返回来查阅本文中的使用案例。配合Wireshark、Fiddler等图形化工具使用分析包,能更加深理解参数含义!


《Linux网络抓包命令之tcpdump》版权归作者所有,如需转载请注明出处,并附带文章链接地址,侵权必究!!!
喜欢 (1)
[]
分享 (0)
Rocloong
关于作者:
善战者无赫赫战功!
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到