你们好,我的网工朋友。
点开之前,你脑子里闪出来的工具是什么?ping?又或是arp、tracert、route……?
今天要给你分享的是非常经典的Linux网络抓包工具Tcpdump。
它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。
Tcpdump 适用于大多数的类Unix系统操作系统(如linux,BSD等),你用过吗?
不会使用这个抓包工具的网工,速速安排上!
今日文章阅读福利:《 Tcpdump工具资源丨使用手册 》
私信我,发送关键词“Tcpdump”(建议复制一下直接发哈),即可获取安装、依赖包、中文使用手册(18页)。
tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上。
不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包。
例如:
shell> tcpdump -nn -i eth0 icmp
下面是详细的tcpdump用法。
01 tcpdump选项
它的命令格式为:
01 抓包选项
02 输出选项
03 其他功能性选项
所以常用的选项也就这几个:
- tcpdump -D
- tcpdump -c num -i int -nn -XX -vvv
02 tcpdump表达式
表达式用于筛选输出哪些类型的数据包,如果没有给定表达式,所有的数据包都将输出,否则只输出表达式为true的包。
在表达式中出现的shell元字符建议使用单引号包围。
tcpdump的表达式由一个或多个"单元"组成,每个单元一般包含ID的修饰符和一个ID(数字或名称)。有三种修饰符:
01 type:指定ID的类型
可以给定的值有host/net/port/portrange
。
例如"host foo"
,"net 128.3"
,"port 20"
,"portrange 6000-6008"
。默认的type为host。
02 dir:指定ID的方向
可以给定的值包括src/dst/src or dst/src and dst
,默认为src or dst。
例如,"src foo"
表示源主机为foo的数据包,"dst net 128.3"
表示目标网络为128.3的数据包,"src or dst port 22"
表示源或目的端口为22的数据包。
03 proto:通过给定协议限定匹配的数据包类型
常用的协议有tcp/udp/arp/ip/ether/icmp
等,若未给定协议类型,则匹配所有可能的类型。
例如"tcp port 21"
,"udp portrange 7000-7009"
。
所以,一个基本的表达式单元格式为"proto dir type ID"
除了使用修饰符和ID组成的表达式单元,还有关键字表达式单元:gateway,broadcast,less,greater以及算术表达式。
表达式单元之间可以使用操作符" and / && / or / || / not / ! "进行连接,从而组成复杂的条件表达式。
如"host foo and not port ftp and not port ftp-data"
,这表示筛选的数据包要满足"主机为foo且端口不是ftp(端口21)和ftp-data(端口20)的包"
,常用端口和名字的对应关系可在linux系统中的/etc/service文件中找到。
另外,同样的修饰符可省略;
如"tcp dst port ftp or ftp-data or domain"
与"tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain"
意义相同,都表示包的协议为tcp且目的端口为ftp或ftp-data或domain(端口53)。
使用括号"()"
可以改变表达式的优先级,但需要注意的是括号会被shell解释,所以应该使用反斜线""转义为"()",在需要的时候,还需要包围在引号中。
03 tcpdump示例
注意,tcpdump只能抓取流经本机的数据包。
01 默认启动
tcpdump
默认情况下,直接启动tcpdump将监视第一个网络接口(非lo口)上所有流通的数据包。这样抓取的结果会非常多,滚动非常快。
02 监视指定网络接口的数据包
tcpdump -i eth1
如果不指定网卡,默认tcpdump只会监视第一个网络接口,如eth0。
03 监视指定主机的数据包
例如所有进入或离开longshuai的数据包
tcpdump host longshuai
04 打印helios<-->hot或helios<-->ace之间通信的数据包
tcpdump host helios and ( hot or ace )
05 打印ace与任何其他主机之间通信的IP数据包,但不包括与helios之间的数据包
tcpdump ip host ace and not helios
06 截获主机 hostname发送的所有数据
tcpdump src host hostname
07 监视所有 发送到主机hostname的数据包
tcpdump dst host hostname
08 监视指定主机和端口的数据包
tcpdump tcp port 22 and host hostname
09 对本机的udp 123端口进行监视(123为ntp的服务端口)
tcpdump udp port 123
10 监视指定网络的数据包
如本机与192.168网段通信的数据包,"-c 10"表示只抓取10个包
tcpdump -c 10 net 192.168
11 打印所有通过网关snup的ftp数据包
(注意,表达式被单引号括起来了,这可以防止shell对其中的括号进行错误解析)
shell> tcpdump 'gateway snup and (port ftp or ftp-data)'
12 抓取ping包
如果明确要抓取主机为192.168.100.70对本机的ping,则使用and操作符。
注意不能直接写icmp src 192.168.100.70,因为icmp协议不支持直接应用host这个type。
13 抓取到本机22端口包
14 解析包数据
总的来说,tcpdump对基本的数据包抓取方法还是较简单的。只要掌握有限的几个选项(-nn -XX -vvv -i -c -q),再组合表达式即可。
整理:老杨丨10年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部