背景
在遇到网络问题时,我们不确定到底在哪一步中断了,导致程序无法正常的收发数据。这个时候就需要逐个排查问题。排查网络问题就好比时排查下水管道哪里堵了一样。排查网络问题我们通常叫做抓包。
分析
所谓的抓包,即抓取网络数据包。实际上抓包就是监听网络流量。这个就好比在下水管道里每一个接头处打开排查,看看从源头放进去的水会不会到达当前的接头处,这样就可以确定这一段管道是否通畅。就这样,一节节的排查,最终就可以找到堵的地方。找到之后就在针对性的分析这一节的特征和配置,最终解决问题。
Linux的网络抓包工具叫做tcpdump。这个命令一般系统都安装了,所以可以直接使用。
下面是tcpdump的命令格式:
tcpdump version 4.99.1
libpcap version 1.10.1 (with TPACKET_V3)
OpenSSL 1.1.1m 14 Dec 2021
Usage: tcpdump [-AbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [--count]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ --immediate-mode ] [ -j tstamptype ]
[ -M secret ] [ --number ] [ --print ] [ -Q in|out|inout ]
[ -r file ] [ -s snaplen ] [ -T type ] [ --version ]
[ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ]
[ --time-stamp-precision precision ] [ --micro ] [ --nano ]
[ -z postrotate-command ] [ -Z user ] [ expression ]
这里有很多参数,这里不展开讲。只那几个重点的参数来说明,分别是-i、host、port和-w。
-i interface,指的是接口,即网卡。网卡名称可以使用ifconfig 或 ip addr命令查询到:
这里的eth0是实际的网卡,而docker0则是虚拟网卡,都是网卡,都可以作为被抓包的参数。
使用下面的命令可以监听eth0网卡的流量:
tcpdump -i eth0
可以看到,开启监听后就看到了两条流量进到eth0网卡。持续观察会有大量的流量进来。这样说明这个网卡是在正常工作。
不过这里监听到的流量是所有进到eth0的流量。有时候我们在抓包时,会执行特定的动作来测试,比如ping或telnet。在大量的流量中很容易错过观察。所以最好有一个办法可以过滤IP和端口,这样就可以把不必要的流量排除掉,进而确认端口是否正常联通。
使用下面的命令可以实现tcpdump根据IP和端口过滤:
tcpdump -i eth0 host 要过滤出来的IP and port 要过滤的端口
例如:tcpdump -i eth0 host 103.144.218.22 and port 443
如果这个IP访问了443,且通过的是eth0进来的,那么监听就会打印日志。这样打印出来的就是都是这个IP的443端口的。可以用来分析这个IP的请求情况。如果有流量进来,说明网卡是可以正常接收流量的。如果服务没有接收到请求,那么就可能是网卡到服务的这一段有问题。
如果是部署的容器,则请求还要经过容器的网卡docker0进入到容器,再传递到服务程序。如果服务不能正常处理请求,在eth0可以正常接收到请求的情况下,则需要进一步排查docker0是否能够接收到请求。只需要把前面的eth0换成docker0即可。然后再在页面上请求一下就可以检测了。
依次类推,一直到服务程序。如果服务程序能够处理请求,则还要反向检测,即看看从服务响应从容器返回到宿主机,再从宿主机返回到客户端。这期间还会经过docker0,再到eth0,再返回客户端。一来一回,都要一步步的确认。
不过因为这些流量不直观,再加上流量很多,肉眼很难分析。这个时候就可以将流量日志导出到文件,再用wireshark流量分析工具来打开文件,软件会自动解析日志,这样看起来会更清晰。
此时使用-w参数,指定文件名即可。
tcpdump -i eth0 host 要过滤出来的IP and port 要过滤的端口 -w 1.dat
需要注意的是,1.dat的文件内容是二进制的,不是文本文件,所以直接打开是乱码。需要使用wireshark流量分析工具打开。这软件的具体使用,在这里就不展开了。
总结
网络抓包并没有多高大上,入门还是相当简单的。我们目前学会了基本的判断流量的有无、指定IP和端口的流量的有无,已经可以应对大部分的抓包需求了。至于更高级的,则需要学习网络知识,针对不通的协议,请求的交互是不同的,需要针对性的研究了。