本文由 简悦 SimpRead 转码, 原文地址 https://juejin.im/post/5cc0214e6fb9a0324018fb90#heading-42
1 构成
master: SZE-L0149625
node1: SZE-L0149628
在 node1 上启动 httpd。 在 master 上通过 curl 执行请求。
1 | master -------------------- > node1 |
2 环境
master, node1 的 OS 都是 CentOS 7.5。
1 | [root@SZE-L0149625 ~]# cat /etc/system-release |
3 TCP 包的采集方法
3.1 SYN flag(=1) 包的采集方法
1 | --------- |
3.2 只采集 SYN 包 (只有 SYN flag)
1 | 采集★1的数据包 |
3.3 捕获 FIN 包的方法
1 | 捕获★1和★2 |
3.4 其他
根据 man 的描述,下列为 flag 可选项。
tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-act, tcp-urg
1 | 以下为,从man tcpdump抽取的内容。 |
4 显示 MAC address 的方法 (-e)
1 | [root@SZE-L0149628 ~]# tcpdump -e -i eth0 port 80 |
5 展示出 multicast 包
1 | [root@drbd1 ~]# tcpdump -i eth0 -n multicast |
6 表示绝对 sequence 号码而不是相对 sequence 号码 (-S)
1 | [root@server ~]# tcpdump -i eth0 -S port 11111 -nn |
7 以简洁方式表示 (-q)
1 | [root@SZE-L0149628 ~]# tcpdump -i eth0 port 80 -q |
8 指定网卡的方法
8.1 列出可以使用的网卡 (-D)
1 | [root@SZE-L0149628 ~]# tcpdump -D |
8.2 指定所有网卡的方法 (-i any)
如果将网卡指定为 any,则为指定所有的网卡。 any 之际上是 8.1 中显示的 “any (Pseudo-device that captures on all interfaces)”。
1 | 监听端口11111。 |
9 指定端口号
9.1 指定多个端口号 (or)
通过 or 来指定多个端口号。 以下的例子为,捕获接收方为 TCP 端口号 80 以及接收方为 UDP 端口号 123 的包。
1 | ------- |
9.2 指定端口范围的方法 (portrange)
使用 portrange 来指定端口范围。 假如输入 portrange 10000-10010、就可以捕获端口 10000~10010 的包。 man 里面并没有 portrange 的说明。在网上搜索了以下,偶然发现了下面的信息。 tcpdump について知らない可能性のあるトップ 10 Tcpdump usage examples
1 | ------------------------------------------------- |
10 以单位时间来做 logrotate(-G,-z)
10.1 只指定 - G 的时候 (可以切换,但文件会无限增加)
1 | [root@SZE-L0149628 ~]# id |
10.2 -G + -z (通过 shell 脚本,将就文件删除)
用 10.1 的方法的话,会无限新增文件。 如果要抑制磁盘使用率,需要定期删除旧文件。
1 | 写一个shell脚本,在捕获到数据并保存之后执行。 |
11 指定文件大小来做 logrotate(-C,-z)
11.1 只指定 - C(可以切换保存的文件,但文件数会无限增加)
1 | 创建执行tcpdump的工作目录。 |
11.2 -C + -z (执行 shell,将旧文件删除的方法)
使用 11.1 的方法的话,文件将会无限增加。 想要抑制磁盘使用量,需要将旧文件定期删除。
1 | 编写一个脚本,在捕获并保存数据后执行。 |
12 切换 tcpdump 的进程 UID(-Z)
1 | ---------------------------- |
13 限制捕获的包的大小 (-s)
-s128 限制捕获包的大小为 128 byte。 -s0 不限制包的大小。如果是捕获 NFS 服务的数据包,则需要指定 - s0。
14 和时刻相关
##14.1 上显示上一次抓包后经过了多久 (-ttt)
1 | [root@SZE-L0149628 ~]# tcpdump -ttt -i eth0 port 80 |
##14.2 用易读的格式表示时刻 (-tttt)
1 | [root@SZE-L0149628 tcpdump]# tcpdump -tttt -i eth0 port 80 |
14.3 表示从最初抓包之后经过的时间 (-ttttt)
1 | [root@SZE-L0149628 tcpdump]# tcpdump -ttttt -i eth0 port 80 |
15 混杂模式 (-p)
1 | 从master往router执行ping的时候,在node1上抓包(执行tcpdump)。 |
16 只捕获接收 / 发送的数据包 (-P)
16.1 只捕获发送的数据包 (-P out)
1 | 执行ping。 |
16.2 只捕获接收的包 (-P in)
1 | 执行ping。 |
17 用 ASCII 码表示包的内容 (-x,-xx)
17.1 表示包含 IP header 的包的内容的方法 (-x)
1 | 在server侧监听11111端口。 |
17.2 表示包含了 ethernet header 的数据包的内容 (-xx)
1 | 在server端监听11111端口。 |
18 读取保存的 pcap 文件的方法 (-r)
18.1 只采集 SYN 包的方法
1 | [root@admin tcpdump]# tcpdump -r test.cap '(tcp[tcpflags] & tcp-syn)' != 0 and '(tcp[tcpflags] & tcp-ack)' ==0 |
18.2 只采集 SYN,SYN+ACK 包的方法
1 | [root@admin tcpdump]# tcpdump -r test.cap '(tcp[tcpflags] & tcp-syn)' != 0 |
19 捕获经过 Netlink 的流量包
19.1 准备抓包工具软件
1 | 加载kernel的nlmon模块。 |
19.2 查阅抓包软件的方法
使用 Wireshark 来查阅捕获到的数据。 像以下的方式,可以将传输到 Netlink 的数据包表示出来。
19.3 环境清理
删除测试用的设备,以及卸载模块。
1 | 删除设备(nlmon0)。 |
20 将采集到的 tcpdump 数据表示出来的方法 (-r)
1 | 捕获(-w)测试用的tcpdump。 |
21 NFLOG 的使用方法
iptables 中有个叫 NFLOG 的 target。 以下展示如何捕获处于这个 target 的交互的数据包。
21.1 实验结果
1 | 事前准备。接收方TCP端口11111,将会往NFLOG这个target发送。 |
21.2 疑问
可以确认到 nflog 这个 interface 有数据包传输。但是 3 way hand shake 的第二个包捕获不到。这是为什么呢???
1 | |---- SYN ---->| |
99 常用
抓取keepalived 的vrrp包1
tcpdump -i eth0 vrrp -n