Contents

TCPDUMP:Local主机到Local主机

1. 概述

总是,识别和解决网络问题是网络管理员的例行任务。有几个命令行实用程序可以解决这些问题,其中tcpdump 最适合这个目的。

在本教程中,我们将通过逻辑和物理接口捕获网络数据包来扩展tcpdump的用法。

2. 什么是Localhost 和Loopback 接口?

为了更好地理解,让我们将 localhost 的概念形象化为我们计算机系统的虚拟主机名和域名。每当我们调用localhost 时,它总是指向我们自己的计算机系统。简而言之,计算机与自己对话。因此,它对我们检查机器的网络服务有很大的帮助,即使是在硬件卡故障的时候。

通常,本地主机通过网络环回接口 访问机器,该接口总是存在于所有操作系统中。默认情况下,环回接口获得 127.0.0.1 IP 地址。随后,localhost也解析为同一个IP进行名称解析:

$ cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       sandbox1
::1     ip6-localhost ip6-loopback

一般情况下,通过这个逻辑接口传输的数据包都会返回(looped back)到同一个接口,而不涉及机器的任何物理接口。因此,该接口得名于环回。

IETF 分配整个 127.0.0.0/8 用于网络环回目的。每次安装服务器后,系统都会获得环回接口。

让我们看一下下面的环回接口配置片段:

$ ip a s lo 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
    inet 127.0.0.1/8 scope host lo 
       valid_lft forever preferred_lft forever 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

3. tcpdump

tcpdump是一个强大的命令行工具,用于分析 Linux 系统上的网络接口流量。我们需要特权访问才能在 Linux 系统上使用rootsudo运行此工具。我们可以使用主机名、IP、协议、网络名称等轻松搜索和过滤网络数据包。

现在,让我们看一下tcpdump 的用法。在这里,输出与 SSH 会话相关:

$ sudo tcpdump
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
04:47:21.629831 IP 27.57.7.242.32917 > sandbox1.ssh: Flags [P.], seq 639116254:639116462, ack 1982486691, win 501, length 208
04:47:21.757924 ARP, Request who-has 10.87.34.12 tell _gateway, length 46
06:47:21.880039 IP sandbox1 > 104.26.11.14: ICMP echo request, id 20418, seq 1, length 64
06:47:21.914808 IP 104.26.11.14 > sandbox1: ICMP echo reply, id 20418, seq 1, length 64

现在,让我们输出第一行:

  • 04:47:21.629831 – IP 数据包的时间戳(以微秒为单位)
  • IP – 协议类型,例如 IP {Internet 协议}、ARP {地址解析协议}、ICMP {Internet 控制消息协议}
  • 27.57.7.242.32917 – 源 IP 地址和端口。通常,源端口是从注册的未知端口范围中随机获取的
  • sandbox1.ssh – 目标 IP 地址和端口。{众所周知的端口号 22 被转换为 ssh}
  • Flags[P.] – 任何 TCP 标志 {P – PUSH};句点表示 ACK
  • seq 639116254:639116462 – 具有起始和结束序列号的序列范围。不同之处在于字节中携带的数量,即字段长度
  • ack 1982486691 – TCP 数据包的确认号
  • win 501 – 源机器 TCP 窗口大小
  • length 208 – TCP 数据长度或负载大小。在这里,它是 639116462 – 639116254 = 208

4. 使用tcpdump监控接口

tcpdump有很多选项来解析、搜索和过滤网络接口流量。如果我们想监控来自特定接口的数据包,我们可以使用选项*-i*。

为了演示,让我们打开两个 PuTTY 会话。在第一个会话中,我们在环回接口上启动数据包捕获,然后我们将对本地主机执行一个简单的 ping:

$ ping -c 1 localhost
..
..
$ sudo tcpdump -i lo
06:24:36.453843 IP localhost > localhost: ICMP echo request, id 19865, seq 1, length 64
06:24:36.453854 IP localhost > localhost: ICMP echo reply, id 19865, seq 1, length 64

类似地,让我们尝试从环回接口生成并捕获 SSH 数据包:

$ ssh localhost
tools@localhost's password:
$ sudo tcpdump -i lo
06:30:52.419160 IP localhost.43398 > localhost.ssh:
  Flags [S], seq 4234592172, win 65495, options [mss 65495,sackOK,TS val 796452486 ecr 0,nop,wscale 7], length 0

tcpdump还有一些其他有用的选项。

要获取低级信息,我们需要启用详细信息:

tcpdump -vv -i ens160

要读取任何pcap文件,我们可以使用*-r*选项:

tcpdump -r prod_inf_mtr.pcap

如果我们想使用主机名/源 IP 进行过滤,并且只从任何接口捕获十个数据包:

tcpdump host blogdemo.com -i any -c10
tcpdump host 104.26.12.74 -i any -c10

接下来,我们可以使用主机和端口信息进行过滤:

tcpdump -i any "host blogdemo.com and (port 22 or port 443)"

此外,我们可以使用它来使用源和目标网络信息进行过滤:

tcpdump -i any -n "src net 192.168.0.0/16 and not dst net 10.0.0.0/8" -c4

最后,我们还可以解密 IPv6 信息,如下所示:

tcpdump -i any ip6 host google.com -c4