Tcpdump实践

时间:2021-1-18 作者:admin

一、tcpdump与iptables的关系

telnet、ftp等应用程序,会通过完整的Linux网络协议栈收发网络数据。应用程序只需要对应用层数据进行读写,数据的封装和解封装由Linux操作系统完成。
tcpdump这一类程序则依赖libpcap。libpcap使用的是一种称为设备层的包接口技术,这种技术使得应用程序可以直接读写内核驱动层面的数据,而不经过Linux网络协议栈。
iptables依赖的Netfilter模块工作在Linux网络协议栈中,tcpdump直接从网络驱动层面抓取数据,不经过任何Linux网络协议栈。因此iptables的入栈策略不会影响到tcpdump抓取数据。
应用程序对外发送的数据包会先经过Linux网络协议栈,再到达网络驱动设备。因此,iptables的出栈策略会影响数据包发送到网络驱动设备层面,影响tcpdump抓取数据。

二、tcpdump常用参数和过滤器

2.1、常用的5个参数

  • -i参数: 指定需要抓包的网卡。如果未指定,tcpdump会根据搜索到的系统中状态为UP的最小数字的网卡,如eth0;
  • -nnn参数: 禁止tcpdump展示时,将IP转换为域名,端口号转换为协议名称;
  • -s参数: 指定抓取的数据包的大小。使用“-s 0”指定数据包大小为262144字节,可以使得抓到的数据包不被截断,从而完整反映数据包的内容;
  • -c参数: 指定抓取的数据包的数量;
  • -w参数: 将抓取的数据包保存到相应的文件,文件通常以.pcap.pcapng等结尾。

2.2、常用的过滤器

  • host x.x.x.x:指定抓取本机与主机“x.x.x.x”通信数据包;
  • tcp port x:指定抓取源端口号或目的端口号为“x”的TCP协议数据包;
  • icmp:仅抓取ICMP协议数据包;
  • !:反向匹配。例如:tcp port ! 22,抓取非22端口的TCP协议数据包;
  • host x.x.x.x and tcp port x:指定抓取本机与主机“x.x.x.x”之间,源端口号或目的端口号为“x”的TCP协议数据包;
  • tcp port x or icmp:指定抓取源端口号或目的端口号为“x”的TCP协议数据包或ICMP协议数据包;

例如,通过wget请求www.example.com,使用tcpdump抓取通信过程中的数据包,如下:

# tcpdump -nnn -i ens33 host www.example.com -s 0 -w example.pcap

三、抓包环境

  • 本机环境:直接抓取本机网卡进出流量;
  • 集线器环境:所有主机处于一个冲突域,集线器不对数据包的MAC地址做检查,理论上可以抓取所有主机相互通信的数据包;
  • 交换机环境:仅能抓取网络上其它主机与本机通信的数据包。

四、更多实例

  • 抓取网络上所有经过本地指定网卡的数据包:
# tcpdump -i ens33
  • 抓取网络上所有与192.168.18.131通信的数据包:
# tcpdump -i ens33 host 192.168.18.131
  • 抓取主机192.168.18.131与主机192.168.18.130或192.168.18.132之间通信的数据包:
# tcpdump -i ens33 host 192.168.18.131 and \(192.168.18.130 or 192.168.18.132\)
  • 抓取主机192.168.18.131与192.168.18.130之外的主机通信的数据包:
# tcpdump -i ens33 host 192.168.18.131 and ! 192.168.18.130
  • 抓取网络上所有源地址是192.168.18.131的数据包:
# tcpdump -i ens33 src host 192.168.18.131
  • 抓取网络上所有目的地址是192.168.18.131的数据包:
# tcpdump -i ens33 dst host 192.168.18.131
  • 抓取网络上所有经过主机192.168.18.131并且目的端口号是22的数据包:
# tcpdump -i ens33 host 192.168.18.131 and tcp dst port 22
  • 抓取网络上所有目的地址是192.168.18.131或192.168.18.132,并且源/目的端口号是22的所有TCP协议数据包:
# tcpdump -nnn -i ens33 tcp port 22 and \(dst host 192.168.18.131 or dst host 192.168.18.132\)
  • 抓取网络上所有SYN或ACK数据包:
# tcpdump -nnn -i ens33 'tcp[tcpflags]=tcp-syn' or 'tcp[tcpflags]=tcp-ack'
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。