telnet、ftp等应用程序,其网络通信收发数据,会通过完整的Linux网络协议栈,由Linux操作系统完成数据的封装和解封装,应用程序只需要对应用层数据进行读写即可。
tcpdump这一类程序则依赖libpcap。libpcap使用的是一种称为设备层的包接口技术。这种技术使得应用程序可以直接读写内核驱动层面的数据,而不经过Linux网络协议栈。
以上,可以看出tcpdump和iptables的关系:
tcpdump直接从网络驱动层面抓取数据。不经过任何Linux网络协议栈。iptables依赖的netfilter模块工作在Linux网络协议栈中。因此iptables的入栈策略不会影响到tcpdump抓取数据。
应用程序对外发送的数据包会先经过Linux网络协议栈,再到达网络驱动设备。因此,iptables的出栈策略会影响数据包发送到网络驱动设备层面,影响tcpdump抓取数据。
tcpdump常用参数和过滤器:
5个参数:
-i参数: 指定需要抓包的网卡。如果未指定,tcpdump会根据搜索到的系统中状态为UP的最小数字的网卡,一般情况下是eth0。
-nnn参数: 禁止tcpdump展示时,将IP和端口转换为域名、端口对应的指明服务名称。
-s参数: 指定抓取的数据包的大小。使用-s 0指定数据包大小为262144字节,可以使得抓到的数据包不被截断,完整反映数据包的内容。
-c参数: 指定抓取的数据包的数量。
-w参数: 指定抓取的数据包保存到相应的文件。
过滤器:
host x.x.x.x: 指定抓取本机和主机x.x.x.x的通信数据。
tcp port x: 指定抓取TCP协议源端口或目的端口为x的通信数据。
icmp: 仅抓取icmp协议的通信数据。
!: 反向匹配。例如port !22,抓取非22端口的通信数据。
可以使用and或or进行组合:
host x.x.x.x and tcp port x:只抓取本机和主机x.x.x.x之间基于TCP的源端口或者目的端口是x的通信。
tcp port x or icmp:抓取TCP协议目的端口或者源端口为x的数据通信或者ICMP协议的数据通信。
例子,通过wget请求www.example.com,使用tcpdump抓取通信过程中的数据包,如下:
# tcpdump host www.example.com -i eth0 -nnn -s 0 -w example.pcap tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes ^C14 packets captured 18 packets received by filter 0 packets dropped by kernel
保存的example.pcap文件可以使用wireshark打开进行分析。
原文地址:http://blog.51cto.com/13568014/2084226