@GamerH2o 博友在微博上提的要求,tcpdump专题会写成一个小型系列文章,力求每篇小文中突出重点,讲解清晰,避免长篇累牍,大家必然昏昏欲睡了。

其实tcpdump就好像一个神探,它有着夜视的绝技,在毫无光亮的环境中,也可以看到所有的东西。(好像在编美剧hero一般,哈哈)

在介绍tcpdump之前,要和你确认好几个关键前提,否则的话,往后的内容您看起来会非常困难。
1 了解和使用过linux
2 掌握网络七层协议及其作用
3 熟悉各层协议头,重点是以太网/IP/TCP/UDP
4 了解交换机、路由器所对应的协议层,并知道两者的异同点。

如果你有些忘记了,那么强烈建议你翻出《计算机网络》教材,先好好回忆一下,然后再进入到下面的内容…

==

正文:

通俗的说,tcpdump是一个抓包工具,用于抓取互联网上传输的数据包。
形象的说,tcpdump就好比是国家海关,驻扎在出入境的咽喉要道,凡是要入境和出境的集装箱,海关人员总要打开箱子,看看里面都装了点啥。
学术的说,tcpdump是一种嗅探器(sniffer),利用以太网的特性,通过将网卡适配器(NIC)置于混杂模式(promiscuous)来获取传输在网络中的信息包。

【抓人生中的第一个包】

要用tcpdump抓包,请记住,一定要切换到root账户下,因为只有root才有权限将网卡变更为“混杂模式”。
然后呢,就是用ifconfig的方法查看好你的服务器的网卡名称。(我的叫做eth0,一般都是这个名字)

# tcpdump -i eth0 -nn -X ‘port 53′ -c 1

?

1

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:48:33.285838 IP 116.255.245.206.47940 > 8.8.8.8.53: 22768+ A? www.baidu.com. (31)
       0x0000:  4500 003b c341 0000 4011 3c93 74ff f5ce  E..;.A..@.<.t...        0x0010:  0808 0808 bb44 0035 0027 b457 58f0 0100  .....D.5.'.WX...        0x0020:  0001 0000 0000 0000 0377 7777 0562 6169  .........www.bai        0x0030:  6475 0363 6f6d 0000 0100 01              du.com..... 1 packets captured 1 packets received by filter 0 packets dropped by kernel [/shell] 在此,我重点解释下这个命令:-i选项:
是interface的含义,是指我们有义务告诉tcpdump希望他去监听哪一个网卡。这在我们一台服务器有多块网卡时很有必要。

-nn选项:
意思是说当tcpdump遇到协议号或端口号时,不要将这些号码转换成对应的协议名称或端口名称。比如,众所周知21端口是FTP端口,我们希望显示21,而非tcpdump自作聪明的将它显示成FTP。

-X选项:
告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。

‘port 53’:
这是告诉tcpdump不要看到啥就显示啥。我们只关心源端口或目的端口是53的数据包,其他的数据包别给我显示出来。

-c选项:
是Count的含义,这设置了我们希望tcpdump帮我们抓几个包。我设置的是1,所以tcpdump不会帮我再多抓哪怕一个包回来。

【未完待续】

从混混乱乱的输出中,大家一定隐约的能看到www.baidu.com,是的,我抓到的这个包,其实是DNS解析的第一个包,也就是发出解析请求的包。至于tcpdump输出的内容到底是什么含义,会在后面娓娓道来。敬请期待。

谢谢!