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 系统上使用root或sudo运行此工具。我们可以使用主机名、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