大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第57篇文章。
专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴。
如果文章有什么需要改进的地方还请大佬不吝赐教。
个人主页:我是沐风晓月
个人简介:大家好,我是沐风晓月,双一流院校计算机专业
座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步
欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信
很多时候由于网络连接出现问题,使用 ping 命令无法找到故障点,比如在复杂的网络环境中,ping 命令可能运行非常缓慢甚至失效,这个时候怎么办呢?
最简单的办法就是分析网络数据包的流向,通过分析数据包流向,能够了解一条连接是如何进行双向连接的,也能清楚预测出来可能发生的问题。
tcpdump 是 Linux 系统上最为强大的网络数据抓包和采集分析工具之一,本质上是通过调用 libpcap 库的各种 API 来实现数据包的监听,它不仅可以分析网络数据包的流向,也可以监听网络数据包的内容,如果数据包是明文传输,tcpdump 可以在路由器上作为监听敏感信息的黑客工具。
在实际工作中,一般先用 tcpdump 工具抓包,再用 Wireshark 进行分析,tcpdump 仅支持命令行格式使用,运行在用户态而且必须使用 root 身份执行,如果你是普通用户身份登录系统,请运行 sudo su root 命令切换到 root 用户执行该命令。
使用 tcpdump 命令最好掌握较为扎实的 TCP/IP 基础知识,如果想要全面详细了解这个命令,请访问 tcpdump 工具手册官网地址:https://www.tcpdump.org/manpages/tcpdump.1.html
首先需要安装 tcpdump 工具,本文实验是基于 tcpdump 4.9.2 版本进行演示,现在列出在 centos 系统和 ubuntu 系统的参考命令:
[root@mufeng101 ~]# yum install -y tcpdump #centos系统
[root@mufeng101 ~]# apt-get install -y tcpdump #ubuntu系统
tcpdump[ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ] [ -i 网络接口 ] [ -r 文件名] [ -s snaplen] [ -T 类型 ] [ -w 文件名 ] [表达式 ]
由于tcpdump命令说明手册内容过于庞大,为了清晰直观,突出重点,本文对常用的命令参数分为四类,列举如下:
参数 | 描述 |
---|---|
-nn | 直接以IP及port号码显示,而非显示主机名与服务名称 |
-w | 将监听所得到的数据包内容存储下来,输出结果至文件 |
-W | 指定输出文件的最大数量,到达后会重新覆写第1个文件 |
-r | 读取一个抓包文件 |
-C | 限制输入文件的大小,超出以后后缀加1等数字的形式递增,注意单位是1000000字节 |
-G | 指定每隔N秒就重新输出至新文件,注意-w参数应该基于strftime参数指定文件名 |
参数 | 描述 |
---|---|
-D | 列举所有网卡设备 |
-i | 后面接要监听的网络接口设备,例如eth0、lo、ppp0等的界面 |
-c | 监听的数据包数,如果没有这个参数,tcpdump会持续不断监听 |
-s | 指定每条报文的最大字节数,默认是262144字节,可以设置大小 |
–time-stamp-precision | 制定捕获时的时间精度,默认是毫秒级micro,可选选择纳秒nano |
参数 | 描述 |
---|---|
-t | 不显示时间戳 |
-tt | 自1970年1月1日0点至今的秒数 |
-ttt | 显示邻近两行报文间经过的秒数 |
-tttt | 自第一个监听的报文起经历的秒数 |
参数 | 描述 |
---|---|
-e | 使用数据链路层(OSI第二层)的MAC数据包数据来显示 |
-q | 仅列出较为简单的数据包信息,每一行的内容比较精简 |
-v | 显示网络层头部更多的信息,如TTL、id等 |
-n | 显示IP地址、数字端口代替hostname等 |
-S TCP | 信息以绝对序列号代替相对序列号 |
-A | 数据包的内容以ASCII格式显示,通常用来监听WWW网页数据包数据 |
-x | 以16进制方式显示报文内容,不显示数据链路层 |
-xx | 以16进制方式显示报文内容,显示数据链路层 |
-X | 可以列出十六进制(hex)以及ASCII的数据包内容,不显示数据链路层 |
-XX | 可以列出十六进制(hex)以及ASCII的数据包内容,显示数据链路层 |
在主机上面直接输入tcpdump命令通常默认监听Linux系统第一个网卡网络数据包,只有在命令后面加上特定参数或者过滤表达式才能按照指定条件监听设备的网络数据包,下面列举几个例子:
如果我们想快速查看本机全部网卡设备信息,使用tcpdump代替ifconfig会更加高效,包括网桥设备(br0、docker0)、虚拟机网卡(virbr0)、蓝牙网卡(bluetooth0)、usb总线接口(usbmon1、usbmon2)、本机网卡(ens33)、回环地址(lo)等常见设备信息,系统对查询出的全部网卡接口设备进行编号。
[root@mufeng101 ~]# tcpdump -D
1.br0
2.virbr0
3.docker0
4.bluetooth0 (Bluetooth adapter number 0)
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)
9.ens33
10.any (Pseudo-device that captures on all interfaces)
11.lo [Loopback]
监听ens33网卡上的全部网络数据包,需要显示IP及PORT号码,持续收到6条数据包以后自动停止(如果没有指定数据包数或者持续时间,可以在键盘直接按下ctrl-c结束)
[root@mufeng101 ~]# tcpdump -i ens33 -nn -c 6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
21:34:49.795298 IP 192.168.31.110.22 > 192.168.31.60.60114: Flags [P.], seq 2828768596:2828768784, ack 2755628968, win 259, options [nop,nop,TS val 23321858 ecr 5968858], length 188
21:34:49.795485 IP 192.168.31.60.60114 > 192.168.31.110.22: Flags [.], ack 188, win 4096, options [nop,nop,TS val 5968899 ecr 23321818], length 0
21:34:49.795639 IP 192.168.31.110.22 > 192.168.31.60.60114: Flags [P.], seq 188:552, ack 1, win 259, options [nop,nop,TS val 23321858 ecr 5968899], length 364
21:34:49.795756 IP 192.168.31.110.22 > 192.168.31.60.60114: Flags [P.], seq 552:748, ack 1, win 259, options [nop,nop,TS val 23321858 ecr 5968899], length 196
21:34:49.795838 IP 192.168.31.60.60114 > 192.168.31.110.22: Flags [.], ack 748, win 4100, options [nop,nop,TS val 5968900 ecr 23321858], length 0
21:34:49.795911 IP 192.168.31.110.22 > 192.168.31.60.60114: Flags [P.], seq 748:1096, ack 1, win 259, options [nop,nop,TS val 23321858 ecr 5968900], length 348
6 packets captured #监听的数据包个数
6 packets received by filter #过滤的数据包个数
0 packets dropped by kernel #丢弃的数据包个数
上述tcpdump命令监听、分析的是网络数据包的报头信息,输出格式是:
“时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络包详细信息”,现在以结果信息中加粗的特殊行为例进行详解:
需要说明的是,数据包的传输标志一共有五种,具体含义如下所示:
姓名 | 年龄 | 工作 |
---|---|---|
[S] | SYN | 开始连接 |
[P] | PSH | 推送数据 |
[F] | FIN | 结束连接 |
[R] | RST | 重启连接 |
[.] | 没有标记 | 除了 SYN 包外所有的数据包都有ACK,所以一般这个标志也可表示 ACK |
使用tcpdump监听经过ens33网卡的数据包,将数据包每隔3秒时长写入一个特定格式文件(文件生成格式定义为def%M-%S),并且读取其中一个生成文件的内容:
[root@mufeng101 ~]# tcpdump -i ens33 -G 3 -w def%M-%S
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
^C19 packets captured
32 packets received by filter
0 packets dropped by kernel
[root@mufeng101 ~]# ll def*
-rw-r--r-- 1 tcpdump tcpdump 24 Mar 28 12:04 def03-57
-rw-r--r-- 1 tcpdump tcpdump 394 Mar 28 12:04 def04-11
-rw-r--r-- 1 tcpdump tcpdump 24 Mar 28 22:09 def09-08
......
[root@mufeng101 ~]# tcpdump -r def04-11
reading from file def04-11, link-type EN10MB (Ethernet)
12:04:11.516324 IP XiaoQiang.52822 > mufeng101.ssh: Flags [.], ack 1352187868, win 4095, options [nop,nop,TS val 15707391 ecr 4655641], length 0
......
tcpdump过滤条件表达式符合正则表达式规范,过滤原理涉及linux内核,这里我们不展开讲解。
我们只要知道tcpdump支持使用一个或者多个过滤表达式对满足表达式条件网络数据包进行过滤,掌握常用过滤表达式固定写法即可满足大部分的场景需要,表达式按照功能可以划分为六大过滤类型:
(1)主机过滤
host、src host、dst host:设置主机、来源主机、目的主机作为过滤条件,例如:tcpdump -nn host 192.168.31.101 代表过滤指定主机IP地址的网络数据包。
(2)网络过滤
net、src net、dst net: 设置网段、来源网段、目的网段作为过滤条件,例如:tcpdump net -nn 192.168.0.0代表过滤指定网段的网络数据包
(3)端口过滤
port、src port、dst port、portrange:设置端口、来源端口、目的端口、端口范围作为过滤条件,例如:tcpdump -nn dst port 80 代表过滤从目的端口80发来的网络数据包
(4)协议过滤
可以指定网络协议类型,包括ether、fddi、tr、wlan、ip、ip6、arp、rarp、tcp、udp、icmp、igmp、icmp、igrp、pim、ah、esp、vrrp等,例如:tcpdump -nn icmp or tcp代表过滤icmp协议或者tcp协议数据包。
(5)逻辑表达式过滤
and(&&)、or(||)、not(!): 分别代表并且、或者、非逻辑运算,例如:tcpdump ‘src host 192.168.31.101 and dst port 8080’ 代表监听源IP是192.168.31.101主机发送给目的端口8080的所有数据包。
(6)特定状态过滤
tcp[tcpflas]: 按照tcp指定状态标志位进行过滤,例如: tcpdump -i eth0 -nn ‘tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack’ 代表希望同时捕获syn类型和ack类型的数据包
其他常用功能限定词:
gateway:过滤通过指定网关地址的数据包,例如:tcpdump gateway 192.168.0.1 代表过滤指定网关数据包;
broadcast: 过滤广播数据包,例如:tcpdump ether broadcast 代表过滤以太网广播数据包;
multicast: 过滤多播数据包,例如:tcpdump ip multicast 代表过滤IP广播数据包;
less、greater:小于或者大于,例如:tcpdump greater 64 代表过滤大于64byte的数据包;
如何使用tcpdump命令实现如下监控目标:1.监听来自ens33网卡数据,通信协议为port 22,目标数据包来源为192.168.31.101的数据包,请给出正确答案。
答案:tcpdump -i eth0 -nn ‘port 22 and src 192.168.1.101’
以上就是常用的过滤表达式类型,复杂表达式都是上述简单表达式的逻辑组合,希望大家能够在运维实际工作中多加练习,逐步深入掌握TCP/IP网络知识。