tcpdump 功能说明: 截获网络数据包的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来以提供分析。 它支持针对网络层、协议、主机、端口等的过滤,并支持与、或、非逻辑语句协助过滤有效信息。 tcpdump命令工作时要先把网卡的工作模式切换到混杂模式(promiscuous mode)。 因为要修改网络接口的工作模式,所以tcpdump命令需要以root的身份运行。 参数选项 -A 以ASCII码的方式显示每一个数据包(不会显示数据包中链路层的头部信息)。在抓取包含网页数据的数据包时,可方便查看数据 -c <数据包数目> 接收到指定的数据包数目后退出命令 -e 每行的打印输出中将包括数据包的数据链路层头部信息 -i <网络接口> 指定要监听数据包的网络接口 -n 不进行DNS解析,加快显示速度 -nn 不将协议和端口数字等转换成名字 -q 以快速输出的方式运行,此选项仅显示数据包的协议概要信息,输出信息较短 -s <教据包大小> 设置数据包抓取长度,如果不设置则默认为68等节,设置为0则自动选择合适的长度来抓取数据包 -t 在每行输出信息中不显示时间截标记 -tt 在每行输出信息中显示无格式的时间载标记 -ttt 显示当前行与前一行的延迟 -tttt 在每行打印的时间戳之前添加日期 -ttttt 显示当前行与第一行的延迟 -v 显示命令执行的详细信息 -vv 显示比-v选项更加详细的信息 -vvv 显示比-vv选项更加详细的输出 范例:不加参数运行tcpdump命令监听网络。 [root@lewen ~]# tcpdump #默认清况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes ... 使用tcpdump命令时,如果不输入过滤规则,则输出的数据量将会很大。 范例:精简输出信息。 [root@lewen ~]# tcpdump -q 04:08:32.963134 IP lewen.ssh > 10.0.0.1.10662: tcp 180 04:08:32.963256 IP lewen.ssh > 10.0.0.1.10662: tcp 116 04:08:32.963325 IP 10.0.0.1.10662 > lewen.ssh: tcp 0 04:08:32.963390 IP lewen.ssh > 10.0.0.1.10662: tcp 180 04:08:32.963492 IP lewen.ssh > 10.0.0.1.10662: tcp 116 04:08:32.964604 IP lewen.ssh > 10.0.0.1.10662: tcp 116 [root@lewen ~]# tcpdump -c 5 #使用-c选项指定监听的数据包数量,这样就不需要使用Ctrl+C了。 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 04:09:50.191752 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 3827665832:3827666044, ack 1911166938, win 274, length 212 04:09:50.192434 IP lewen.44182 > public1.alidns.com.domain: 5716+ PTR? 1.0.0.10.in-addr.arpa. (39) 04:09:50.245211 IP 10.0.0.1.10662 > lewen.ssh: Flags [.], ack 212, win 8212, length 0 04:09:50.257155 IP public1.alidns.com.domain > lewen.44182: 5716 NXDomain 0/1/0 (116) 04:09:50.258230 IP lewen.36787 > public1.alidns.com.domain: 45732+ PTR? 81.0.0.10.in-addr.arpa. (40) 5 packets captured 21 packets received by filter 0 packets dropped by kernel 范例:监听指定网卡收到的数据包 [root@lewen ~]# tcpdump -i eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 04:11:33.924611 IP 10.0.0.1.10662 > lewen.ssh: Flags [.], ack 651624, win 8209, length 0 04:11:33.924679 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 651624:651884, ack 105, win 274, length 260 04:11:33.924776 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 651884:652048, ack 105, win 274, length 164 04:11:33.924834 IP 10.0.0.1.10662 > lewen.ssh: Flags [.], ack 652048, win 8207, length 0 04:11:33.924901 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 652048:652308, ack 105, win 274, length 260 04:11:33.929182 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 652308:652472, ack 105, win 274, length 164 04:11:33.931108 IP 10.0.0.1.10662 > lewen.ssh: Flags [.], ack 652472, win 8212, length 0 04:11:33.931140 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 652472:652636, ack 105, win 274, length 164 04:11:33.931140:当前时间,精确到微秒。 IP lewen.ssh > 10.0.0.1.10662:从主机lewen的SSH端口发送数据到10.0.0.1的10662端口,“>”代表数据流向。 Flags[P.]:TCP包中的标志信息,S是SYN标志的缩写,F(FIN)、P(PUSH)、R(RST)、"."(没有标记)。 seq:数据包中的数据的顺序号。 ack:下次期望的顺序号。 win:接收缓存的窗口大小。 length:数据包长度。 范例:监听指定主机的数据包 [root@lewen ~]# tcpdump -n host 10.0.0.1 #<=使用-n选项不进行DNS解析,加快显示地度。监听指定主机的关键字为host,后面直接接主机名或了IP地址即可。本行命令的作用是监听所有10.0.0.1的主机收到的和发出的数据包。 [root@lewen ~]# tcpdump -n src host 10.0.0.1 #<-只监听从10.0.0.1发出的数据包,即源地址为10.0.0.1,关键字为src(source,原地址)。 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 20:20:55.821984 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 3862927143, win 4106, length 0 20:20:55.866408 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 149, win 4105, length 0 20:20:55.907580 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 297, win 4105, length 0 20:20:55.950705 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 445, win 4104, length 0 20:20:55.991940 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 593, win 4103, length 0 20:20:56.032129 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 741, win 4103, length 0 [root@lewen ~]# tcpdump -n dst host 10.0.0.1 #<==只监听10.0.0.1收到的数据包,即目标地址为10.0.0.1,关就字为dst(destination,目的地)。 20:22:13.074240 IP 10.0.0.7.ssh > 10.0.0.1.14389: Flags [P.], seq 506496:506660, ack 53, win 252, length 164 20:22:13.074331 IP 10.0.0.7.ssh > 10.0.0.1.14389: Flags [P.], seq 506660:506824, ack 53, win 252, length 164 范例:监听指定端口的数据包 [root@lewen ~]# tcpdump -nn port 22 #使用-n选项不进行DNS解析,但是其会将一些协议、端口进行转换,比如22端口转为ssh。因此本例使用nn 选项。监听指定端口的关键字是port,后面接上端口号即可 20:24:26.193100 IP 10.0.0.1.14389 > 10.0.0.7.22: Flags [.], ack 556296, win 4101, length 0 20:24:26.193225 IP 10.0.0.7.22 > 10.0.0.1.14389: Flags [P.], seq 556296:556556, ack 105, win 252, length 260 20:24:26.193535 IP 10.0.0.7.22 > 10.0.0.1.14389: Flags [P.], seq 556556:556720, ack 105, win 252, length 164 范例:监听指定协议的数据包 [root@lewen ~]# tcpdump -n arp #<--监听ARP数据包,因此表达式直接写arp即可。 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 20:26:43.219758 ARP, Request who-has 10.0.0.96 tell 10.0.0.210, length 46 20:26:43.511133 ARP, Request who-has 10.0.0.95 tell 10.0.0.210, length 46 20:26:44.224050 ARP, Request who-has 10.0.0.96 tell 10.0.0.210, length 46 20:26:44.512986 ARP, Request who-has 10.0.0.95 tell 10.0.0.210, length 46 20:26:45.230012 ARP, Request who-has 10.0.0.96 tell 10.0.0.210, length 46 [root@lewen ~]# tcpdump -n icmp #<-监听icmp数据包(想要查着下面的监拉数据,可以使用其他机器ping本机即可) tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 20:27:31.377258 IP 10.0.0.210 > 10.0.0.2: ICMP 10.0.0.210 udp port 49207 unreachable, length 127 20:27:31.479590 IP 10.0.0.210 > 10.0.0.2: ICMP 10.0.0.210 udp port 48776 unreachable, length 135 常见的协议关键字有ip、arp、icmp、tcp、udp等类型。 范例:多个过滤条件混合使用 前面的几种方法都是使用单个过滤条件过滤数据包,其实过滤条件可以混合使用,因为tcpdump命令支持逻辑运算符and(与)、or(或)、!(非)。 [root@lewen ~]# tcpdump -n ip host 10.0.0.7 and ! 10.0.0.1 #<==获取主机10.0.0.7与所有主机(除了主机10.0.0.1之外)通信的ip数据包。 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 20:29:42.366445 IP 10.0.0.210.51642 > 10.0.0.7.zabbix-agent: Flags [S], seq 1999440710, win 29200, options [mss 1460,sackOK,TS val 75899232 ecr 0,nop,wscale 7], length 0 20:29:42.366483 IP 10.0.0.7.zabbix-agent > 10.0.0.210.51642: Flags [S.], seq 920922656, ack 1999440711, win 28960, options [mss 1460,sackOK,TS val 80531477 ecr 75899232,nop,wscale 7], length 0 20:29:42.366628 IP 10.0.0.210.51642 > 10.0.0.7.zabbix-agent: Flags [.], ack 1, win 229, options [nop,nop,TS val 75899232 ecr 80531477], length 0 20:29:42.366674 IP 10.0.0.210.51642 > 10.0.0.7.zabbix-agent: Flags [P.], seq 1:15, ack 1, win 229, options [nop,nop,TS val 75899232 ecr 80531477], length 14 20:29:42.366681 IP 10.0.0.7.zabbix-agent > 10.0.0.210.51642: Flags [.], ack 15, win 227, options [nop,nop,TS val 80531477 ecr 75899232], length 0 20:29:42.371129 IP 10.0.0.210.51644 > 10.0.0.7.zabbix-agent: Flags [S], seq 2767440940, win 29200, options [mss 1460,sackOK,TS val 75899236 ecr 0,nop,wscale 7], length 0 20:29:42.371153 IP 10.0.0.7.zabbix-agent > 10.0.0.210.51644: Flags [S.], seq 3632462468, ack 2767440941, win 28960, options [mss 1460,sackOK,TS val 80531482 ecr 75899236,nop,wscale 7], length 0 20:29:42.371313 IP 10.0.0.210.51644 > 10.0.0.7.zabbix-agent: Flags [.], ack 1, win 229, options [nop,nop,TS val 75899237 ecr 80531482], length 0 20:29:42.371397 IP 10.0.0.210.51644 > 10.0.0.7.zabbix-agent: Flags [P.], seq 1:25, ack 1, win 229, options [nop,nop,TS val 75899237 ecr 8 范例:利用tcpdump抓包详解tcp/ip 连接和断开过程的案例 正常的TCP连接的三个阶段。 1.TCP三次握手 2.数据传送 3.TCP四次断开 TCP的状态标识。 •SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。 •ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收了所有的数据。 •FIN:(结束标志,FINish)用来结束一个TCP回话。但对应端口仍然处于开放状态,准备接收后续数据。 There are 8 bits in the control bits section of the TCe header: CWR | ECE | URG | ACK| PSH | RST|SYN|FIN [root@doit ~]# tcpdump tcp dst port 80 or src 104.243.30.169 -i eth0 -n tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 20:35:59.136119 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 2702154317:2702154529, ack 1793279353, win 501, length 212 20:35:59.136535 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 212:408, ack 1, win 501, length 196 20:35:59.137177 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 408:588, ack 1, win 501, length 180 20:35:59.137818 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 588:768, ack 1, win 501, length 180 20:35:59.138447 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 768:948, ack 1, win 501, length 180 20:35:59.139087 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 948:1128, ack 1, win 501, length 180 20:35:59.139729 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1128:1308, ack 1, win 501, length 180 20:35:59.140360 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1308:1488, ack 1, win 501, length 180 20:35:59.140996 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1488:1668, ack 1, win 501, length 180 20:35:59.141636 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1668:1848, ack 1, win 501, length 180 20:35:59.142273 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1848:2028, ack 1, win 501, length 180 20:35:59.142908 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 2028:2208, ack 1, win 501, length 180