【摘要】 前面章节的网络协议栈相关的信息建议大家多学习一遍,因为这些都是最基础的东西,想玩好云网络必备基本功。。
一、上帝视角
之前提到过定位问题可以开启上帝视角,那么如何开启就要依靠tcpdump这个工具了。这个工具可以实时看到一台主机的网卡上面的收到或者发送出去的报文信息。简单的说就是抓包。
我们对网卡进行抓包的时候,会使得网卡进入“混杂模式”,所谓混杂模式就是让网卡接收所有到达网卡的报文,因为默认情况下,不是给自己的报文网卡是不要的,要么丢弃要么转发,反正不读取内容,而进入混杂模式后,就可以看一眼报文内容了。
使用tcpdump命令可以使网卡自动进入混杂模式,这一点可以从dmesg系统日志中看到:
[311135.760098] device eth0 entered promiscuous mode
[311142.852087] device eth0 left promiscuous mode
二、tcpdump命令
由于tcpdump是把经过网卡的报文全部都抓出来,所以数量是非常大的,各种乱七八糟的报文都有,是没办法定位问题的,所以tcpdump一定要配合过滤条件使用。这里只讲平时用得到的几个关键参数,再详细的自己谷歌百度,反正我一般情况下用用是够了的。
1. -n 参数
这个我一般都会加上,以前的文章中提过,-n表示不要做DNS翻译,直接显示IP,不要显示为host name。(影响性能,有时候按个ctr+c都停不下来)
用法:tcpdump -n
2. -i 参数
-i 参数用于指定需要抓包的网卡,一般都会带上。
用法: tcpdump -n -i eth0
3. 指定协议
指定协议抓包比较简单,直接要求tcpdump只抓取指定协议的报文。可以指定的协议一般有:arp / icmp / tcp
用法:tcpdump -n -i eth0 arp
4. host 关键字
host关键字用来指定只抓取对应IP的报文,表示源地址,或者目的地址。语法为 host+空格+IP地址。
(ps:可以用src或者dst代替host关键字,只抓单边的报文)
用法:tcpdump -n -i eth0 host 10.120.175.167
5. port 关键字
port关键字用来指定只抓取对应Port端口的报文,表示源端口,或者目的端口。语法为 port+空格+端口号
用法:tcpdump -n -i eth0 port 53
6. 条件组合 and / or
如果只指定一个条件进行抓包,有时候抓到的报文数量还是太多,那就需要进行多个条件组合。条件之间通过and连接。
用法:tcpdump -n -i docker0 tcp and host 172.17.0.1 and port 3306
7. -w 写入文件
-w 表示将抓到的报文信息写入到指定的pcap文件。然后把pcap文件拷贝到自己电脑上面用Wireshark软件打开分析详情。这里不得不说一下,Wireshark也是一个神器。
用法:tcpdump -n -i docker0 tcp and host 172.17.0.1 and port 3306 -w mypkg.pcap
8. 其他条件
骚年,上面这几个记住了,行走江湖应该不成问题了。其他高深的语法,需要的时候再google/baidu也不迟。
作者:tsjsdbd