(Proudly powered by QKQ)
centOS如何安装tcpdump?
A: 使用yum:
yum install tcpdump
tcpdump是用来干啥的?
A: 根据man tcpdump的输出:
tcpdump - dump traffic on a network
Tcpdump prints out a description of the contents of packets on a network interface that match the boolean expression;
即将网络上的流量给倾倒(dump)出来。tcpdump会输出一个网络接口(interface)的包的内容的描述,用户可以通过一个bool表达式进行筛选。
tcpdump如何使用?
A: tcpdump的格式为:
tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
[ -c count ]
[ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
[ --number ] [ -Q|-P in|out|inout ]
[ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
[ --time-stamp-precision=tstamp_precision ]
[ --immediate-mode ] [ --version ]
[ expression ]
注意tcpdump的所有参数都是中括号,那么就是说所有参数都是可选的,不是必须得。如果直接输入tcpdump,不带任何参数,那么默认是将非loopback的interface的流量dump出来。
# tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
13:02:14.134764 ARP, Request who-has gateway tell master, length 28
13:02:14.135047 ARP, Reply gateway is-at 52:54:00:12:35:02 (oui Unknown), length 46
13:02:14.135578 IP master.44918 > 192.168.0.1.domain: 62858+ PTR? 2.2.0.10.in-addr.arpa. (39)
13:02:14.142491 IP 192.168.0.1.domain > master.44918: 62858 NXDomain 0/0/0 (39)
13:02:14.143702 IP master.57567 > 192.168.0.1.domain: 63494+ PTR? 15.2.0.10.in-addr.arpa. (40)
13:02:14.150640 IP 192.168.0.1.domain > master.57567: 63494 NXDomain 0/0/0 (40)
13:02:14.150990 IP master.36347 > 192.168.0.1.domain: 7340+ PTR? 1.0.168.192.in-addr.arpa. (42)
13:02:14.157539 IP 192.168.0.1.domain > master.36347: 7340 NXDomain 0/0/0 (42)
tcpdump的常用命令有哪些?
A: 先来看看常用参数:
- -A,将包内容展示位ASCII。适用于显示网页
- -c count,接收到多少个包之后就退出
- -D,打印系统中可用的interface,并且tcpdump可以用的interface
- -e,打印链路层的header
- -F,使用文件作为过滤条件
- --version,打印版本信息
- -i interface,指定监听的interface,如果未指定,则使用除loopback外index最小的interface。使用any,表示监听所欲interface
- --immediate-mode,不对网络包进行缓存,系统接收到包之后立即给tcpdump。在直接打印包内容的情况下,默认就是这种模式,输入到文件的情况下,是缓存的模式
- -n,不进行主机地址到名字的转换,可以避免DNS查询
- -nn,不进行协议和端口号到名字的转换
- -Q|-P direction,或者--direction=direction,可选值有in,out,inout,选择发送和接收
- -q,安静模式
- -r file,从文件读取包
- -S,输出绝对的而不是相对的TCP序列号(sequence number)
- -t,不打印timestamp
- -tt,打印timestamp,其值为1970年1月1日 00:00:00开始的秒数
- -ttt,打印当前行和上一行的时间差(毫秒级)
- -v,打印更多信息
- -vv,更多的信息
- -w file,将原始包写入文件
- -x,除了打印出包头,还打印出包的数据(除了链路层的头部)以hex的格式
- -xx,打印出头部(header)和数据以及链路层的头部
- -X(大写),打印头部和数据,以hex和ASCII的格式
- -XX,打印头部和数据以及链路层头部,以hex和ASCII的格式
一些例子:
- tcpdump -i eth0,监听eth0上的流量
- tcpdump -c 5 -i eth0,仅接收eth0上的5个包
- tcpdump -A -i eth0,以ASCII显示包内容
- tcpdump -D,列出能监听的interface
- tcpdump -XX -i eth0
- tcpdump -w 0001.pcap -i eth0,保存到文件
- tcpdump -r 0001.pcap,从文件读取
- tcpdump -n -i eth0
- tcpdump -i eth0 tcp,仅dump tcp包信息
- tcpdump -i eth0 port 22,仅dump端口为22的包信息
- tcpdump -i eth0 src 192.168.0.2,仅dump源地址为192.168.0.2的包信息
- tcpdump -i eth0 dst 50.116.66.139,仅dump目的地址为50.116.66.139的信息
tcpdump的filter expression(过滤表达式)需要从man pcap-filter获取文档信息。filter expression包含了一个或者多个primitive。通常来讲primitive一般是一个或者多个qualifier跟上一个id(名字或者数字)。qualifier有三种类型:
- type,表明了id的类型,可选值有host, net, port和portrange。比如host foo表示名字为foo的主机
- dir,指定了流量流向(transfer direction)的源或者目的地,可选值有src,dst,src or dst, src and dst, ra, ta, addr1, addr2, addr3, and addr4。其中ra, ta, addr1, addr2, addr3和addr4仅对无线网络有用。举例src foo表示源是foo
- proto,限制了协议类型,可选值有ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp和udp。如果没有指定,则默认包括所有协议。举例tcp port 21
除了上面这些qualifier之外,还有gateway,broadcast,less,greater及算术表达式。
允许的primitive有很多,笔者摘抄一些:
- dst host <host>
- src host <host>
- host <host>,源或者目的地址为host
- gateway <host>
- dest net <net>,其中<net>可以是名字或者数字。表示网络包中含有该net的包。
- dest port <port>,网络包中含有该端口的包
- less <length>,包长度小于或者等于length
- greater <length>,包长度大于或者等于length
- tcp,tcp协议
- udp,udp协议
- icmp,icmp协议
- ether broadcast,过滤是Ethernet广播的包
- ip broadcast,ipv4的广播包
- vlan [vlan_id],IEEE 802.1Q的VLAN包
tcpdump的输出是什么意思?
A: tcpdump的输出跟具体的协议是相关的,不同协议的输出可能不同:
时间
时间的格式是:hh:mm:ss.frac,跟内核时间是一致的
链路层的头部
如果使用了-e,那么链路层的头部会打印出来。在Ethernets,源地址、目标地址、协议和包长度会被打印,其他情况则不太相同,这里不再阐述。
ARP/RARP包
其输出具有自解释性,比如:
arp who-has 128.3.254.6 tell 128.3.254.68
arp reply 128.3.254.6 is-at 02:07:01:00:01:c4
IPv4包
IPv4的基本输出格式为:
tos <tos>, ttl <ttl>, id <id>, offset <offset>, flags [flags], proto <proto>, length <length> options (options)
对于TCP或者UDP,还会打印源地址、目的地址及端口信息。用>开分开源地址和目的地址。
TCP包的基本格式:
src > dst: Flags [tcpflags], seq data-seqno, ack ackno, win window, urg urgent, options [opts], length len
其中:
- src,源地址
- dst,目的地址
- flags,为S(SYN), F(FIN), P(PUSH), R(RST), U(URG), W(ECN CWR), E(ECN_Echo), .(ACK), none的组合。
(其余字段意思详见man tcpdump)
一个例子:
IP rtsg.1023 > csam.login: Flags [S], seq 768512:768512, win 4096, opts [mss 1024]
IP csam.login > rtsg.1023: Flags [S.], seq, 947648:947648, ack 768513, win 4096, opts [mss 1024]
IP rtsg.1023 > csam.login: Flags [.], ack 1, win 4096
rtsg源地址的1023端口给csam的login端口发送了包,是一个SYN包,包的sequence number是768512,没有data(因为没有data sequence number或者长度),格式是first:last(sequence number first up to but not including last.).
其中[.]表示是一个ACK flag。
UDP的包,其基本格式为:
actinide.who > broadcast.who: udp 84
主机actinide上的who端口给主机broadcast上的who端口发送了udp报文,其中含有84bytes的用户数据。
参考资料:
[1] man tcpdump
[2] https://www.tecmint.com/12-tcpdump-commands-a-network-sniffer-tool/
[3] man pcap-filter
网友评论