Tcpdump实践

一、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'
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值