TCPDUMP
tcpdump是一款经典的网络抓包工具。即使在今天,我们拥有像Wireshark这样更易于使用和掌握的抓包工具,tcpdump仍然是网络程序员的必备利器。
-n,使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名称。
-i,指定要监听的网卡接口。“-i any”表示抓取所有网卡接口上的数据包。
-v,输出一个稍微详细的信息,例如,显示P数据包中的TTL和TOS信息。
-t,不打印时间戳。
-e,显示以太网帧头部信息。
-c,仅抓取指定数量的数据包。
-x,以十六进制数显示数据包的内容,但不显示包中以太网帧的头部信息。
-X,与-x选项类似,不过还打印每个十六进制字节对应的ASCH字符。-
-XX,与-X相同,不过还打印以太网帧的头部信息。
-s,设置抓包时的抓取长度。当数据包的长度超过抓取长度时,tepdump抓取到的将是被截断的数据包。在4.0以及之前的版本中,默认的抓包长度是68字节。这对于IP、TCP和UDP等协议就已经足够了,但对于像 DNS、NFS这样的协议,68字节通常不能容纳一个完整的数据包。比如我们在1.6.3小节抓取 DNS数据包时,就使用了-s选项(测试机器ernest-laptop 上,tcpdump的版本是4.0.0)。不过4.0之后的版本,默认的抓包长度被修改为65 535字节,因此我们不用再担心抓包长度的问题了。
-S,以绝对值来显示TCP报文段的序号,而不是相对值。
-w,将tcpdump的输出以特殊的格式定向到某个文件。
-r,从文件读取数据包信息并显示之。
host 能够用来查询域名,它还能得到更多的信息
host -t mx example.com 可以查询出 example.com 的 MX 记录,以及处理 mail 的 host 的名字
host -l example.com 会返回所有注册在 example.com 下的域名
host -a example.com 则会显示这个主机的所有域名信息.
tcpdump观察DNS
tcpdump -i ens33 -nt -s 500 port domain
host -t A www.baidu.com
IP 192.168.179.188.49431 > 192.168.179.2.domain: 43016+ A? www.baidu.com. (31)
IP 192.168.179.2.domain > 192.168.179.188.49431: 43016 3/0/0 CNAME www.a.shifen.com., A 14.215.177.39, A 14.215.177.38 (93)
这两个数据包开始的“IP”指出,它们后面的内容描述的是IP数据报。tcpdump以“IP地址.端口号”的形式来描述通信的某一端;以“>”表示数据传输的方向,“>”前面是源端,后面是目的端。可见,第一个数据包是测试机器CENTOS7 (IP地址是192.168.179.188)向其首选 DNS服务器(IP地址是192.168.179.2)发送的DNS查询报文,
第二个数据包是服务器反馈的DNS应答报文
第一个数据包中,数值49431是 DNS查询报文的标识值,因此该值也出现在 DNS应答报文中。“+”表示启用递归查询标志。“A?”表示使用A类型的查询方式。“www.baidu.com则是DNS查询问题中的查询名。括号中的数值31是DNS查询报文的长度(以字节为单位)。
第二个数据包中,“3/0/0”表示该报文中包含3个应答资源记录、0个授权资源记录和0个额外信息记录。“CNAME www.a.shifen.com.,A 14.215.177.39,A 14.215.177.39 则表示3个应答资源记录的内容。其中CNAME表示紧随其后的记录是机器的别名,A表示紧随其后的记录是IP地址。该应答报文的长度为39字节。
TCPDUMP观察ARP
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.179.189 netmask 255.255.255.0 broadcast 192.168.179.255
inet6 fe80::9da6:ae67:d11e:7e5c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ba:38:85 txqueuelen 1000 (Ethernet)
RX packets 27178 bytes 39906383 (39.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3039 bytes 222599 (222.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 266 bytes 26465 (26.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 266 bytes 26465 (26.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ubuntu
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.179.188 netmask 255.255.255.0 broadcast 192.168.179.255
inet6 fe80::e7e6:2e30:d103:fc1 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1c:81:25 txqueuelen 1000 (Ethernet)
RX packets 286 bytes 33587 (32.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 140 bytes 14921 (14.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
//centos
sudo tcpdump -i ens33 -ent '(dst 192.168.179.189 and src 192.168.179.188)or(
dst 192.168.179.188 and src 192.168.179.189)'
telnet 192.168.179.188
00:0c:29:ba:38:85 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.179.188 tell 192.168.179.189, length 28
00:0c:29:1c:81:25 > 00:0c:29:ba:38:85, ethertype ARP (0x0806), length 60: Reply 192.168.179.188 is-at 00:0c:29:1c:81:25, length 46
由tcpdump抓取的数据包本质上是以太网帧,我们通过该命令的众多选项来控制帧的过滤(比如用dst和 src指定通信的目的端IP地址和源端地址)和显示(比如用-e选项开启以太网帧头部信息的显示)。
第一个数据包中,ARP通信的源端的物理地址00:0c:29:ba:38:85是(ernest-laptop-ubantu),目的端的物理地址是ff:ff:ff;:ff:ff:ff,这是以太网的广播地址,用以表示整个LAN。该LAN上的所有机器都会收到并处理这样的帧。数值0x806是以太网帧头部的类型字段的值,它表示分用的目标是ARP模块。该以太网帧的长度为42字节(实际上是46字节,tcpdump未统计以太网帧尾部4字节的CRC字段),其中数据部分长度为28字节。“Request”表示这是一个ARP请求,“who-has 192.168.1.109 tell 192.168.1.108”则表示是ernest-laptop要查询Kongming20的IP地址。
第二个数据包中,ARP通信的源端的物理地址00:0c:29:1c:81:25是0(centos),目的端的物理地址是00:16:d3:5c:b9:e3 (ernest-laptop-ubantu)。"Reply”表示这是一个ARP应答,“192.168.179.188 is-at 00:0c:29:1c:81:25”则表示目标机器Kongming20报告其物理地址。该以太网帧的长度为60字节(实际上是64字节),可见它使用了填充字节来满足最小帧长度。
使用tcpdump观察ipv4与tcp
sudo tcpdump -ntx -i lo
telnet 127.0.0.1
IP 127.0.0.1.47534 > 127.0.0.1.23: Flags [S], seq 1438175385, win 65495, options [mss 65495,sackOK,TS val 2673867955 ecr 0,nop,wscale 7], length 0
0x0000: 4510 003c 63c2 4000 4006 d8e7 7f00 0001
0x0010: 7f00 0001 b9ae 0017 55b8 d099 0000 0000
0x0020: a002 ffd7 fe30 0000 0204 ffd7 0402 080a
0x0030: 9f5f fcb3 0000 0000 0103 0307
tcpdump输出Flags[S],表示该TCP报文段包含SYN标志,因此它是个同步报文段
seq是序号值。因为该同步报文段是从127.0.0.1.47534(客户端IP地址和端口号)到127.0.0.1.23(服务器IP地址和端口号)这个传输方向上的第一个TCP报文段,所以这个序号值也就是此次通信过程中该传输方向的ISN值。并且,因为这是整个通信过程中的第一个TCP报文段,所以它没有针对对方发送来的TCP报文段的确认值(尚未收到任何对方发送来的TCP报文段)。
win是接收通告窗口的大小。因为这是一个同步报文段,所以win值反映的是实际的接收通告窗口大小。
options是TCP选项,其具体内容列在方括号中。mss是发送端(客户端)通告的最大报文段长度。通过ifconfig命令查看回路接口的MTU为65536字节,因此可以预想到TCP报文段的MSS 为 ( 65536-40)字节。sackOK表示发送端支持并同意使用SACK选项。TS val是发送端的时间戳。ecr是时间戳回显应答。因为这是一次TCP通信的第一个TCP报文段,所以它针对对方的时间戳的应答为0(尚未收到对方的时间戳)。紧接着的nop是一个空操作选项。wscale指出发送端使用的窗口扩大因子为7。
字段分析放在38/54
tcpdump观察TCP的连接的建立和关闭
$ sudo tcpdump -i eth0 -nt '(src 192.168.1.109 and dst 192.168.1.108) or (src192.168.1.108 and dst 192.168 .1.109j'
telnet 192.168.1.109 8o
Trying 192.168 .1.109...connectei to 192.168.1.109.Escape character is "一].]《回车)。输入ctrl+]并回车
telnet> quit〔回车)
connection closed.
1. IP 192.168.1.108.60871 > 192.168.1.109.80: Flags [S], seq 535734930,win5840,length o
2. IP 192.168.1.109.80 > 192.168.1.108.60871: Flags [8.],seq 2159701207,ack 535734931,win 5792.length o
3.IP 192.168.1.108.60871 > 192.168.1.109.80: Flags [.1,ack 1,win 92,length 4. IP 192.168.1.108.60871 > 192.168.1.109.80: rlags [F.],8eq 1,ack 1,win 92,length 0
5.IP 192.168.1.109.80 > 192.168.1.108.60871: Flags [.), ack 2,win 91,length 06.IP 192.168.1.109.80 > 192.168.1.108.60871: Flags [F.],seq l,ack 2,win 91,length o
7. IP 192.168.1.108.60871 > 192.168.1.109.80: Flags 〔.], ack 2,win 92,length o
第1个TCP报文段包含SYN标志,因此它是一个同步报文段,即ernest-laptop(客户端)向Kongming20(服务器)发起连接请求。同时,该同步报文段包含一个ISN值为535734930的序号。第2个TCP报文段也是同步报文段,表示Kongming20同意与ernest-laptop建立连接。同时它发送自己的ISN值为2159701207的序号,并对第1个同步报文段进行确认。确认值是535734931,即第1个同步报文段的序号值加1。前文说过,序号值是用来标识TCP数据流中的每一字节的。但同步报文段比较特殊,即使它并没有携带任何应用程序数据,它也要占用一-个序号值。第3个TCP报文段是ernest-laptop对第2个同步报文段的确认。至此,TCP连接就建立起来了。建立TCP连接的这3个步骤被称为TCP三次握手。
后面4个TCP报文段是关闭连接的过程。第4个TCP报文段包含FIN标志,因此它是一个结束报文段,即 ernest-laptop要求关闭连接。结束报文段和同步报文段一样,也要占用一个序号值。Kongming20用TCP报文段5来确认该结束报文段。紧接着Kongming20发送自己的结束报文段6,ernest-laptop则用TCP报文段7给予确认。实际上,仅用于确认目的的确认报文段5是可以省略的,因为结束报文段6也携带了该确认信息**。确认报文段5是否出现在连接断开的过程中,取决于TCP的延迟确认特性**。延迟确认将在后面讨论。