网络 - tcpdump - 入门
-
概述
- tcpdump 入门
-
背景
-
网络我不知道 从哪里开始
-
本来想 先学学 ping/icmp 的
-
最简单的通信场景
- 发起者
- 接收者
- 协议
- 链路
-
我对最简单场景的东西, 好像都 一无所知
-
不了解 发起者 和 接收者
- ip 命令, 我搞不定
- 就会查看个 ip
-
不了解链路
- 链路上有什么, 我不知道
- 链路上的设备做了什么, 我也不知道
-
不了解 协议
- 协议用什么端口, 我不知道
- 协议内容, 我也不知道
-
这么多问题, 我从哪个下手呢
- 简单的场景, 我知道个 ip, 基本够用
- 只要能 ping 通, 链路对我来说, 好像也没什么大问题
- 要么就看看协议, 简单场景没有加密, 抓到了就是抓到了...
- 简单好上手, 容易产生成就感
- 要么就 用工具抓个 ping 吧
-
-
于是, 我费了好大力气, 说服了自己
- 用 抓包工具, 抓一下 ping 过程的包
-
用什么工具呢
- 百度 上搜了半天, 最后决定, 用 tcpdump
- tcpdump 能抓 ping 包吗?
- 这个是没问题的
-
-
环境
-
os
- centos7
-
docker-engine
- 19.03.12
-
docker-compose
- 1.26.2
-
image
- ubuntu
- 19.04
- ubuntu
-
1. 准备
- 概述
- 准备环境
1. 启动 ubuntu 容器
-
compose file
version: "3.8" services: ubuntu: image: ubuntu:19.04 tty: true
-
命令
> docker-compose up -d
-
结果
- 启动成功
-
查看 ip
# 目前没有其他太好的办法 # 能查到 ip > docker inspect <container_name> | grep -e 'IPAddress'
2. ping
-
操作
- ping 之前找到的 ip
-
结果
- 通常是 能通的
-
如果不能通
- 好像我也没啥办法...
-
ping 命令
- 只使用 ping 命令, 目前来看, 已经足够了
- 毕竟这个不是 主角
-
准备了好多
- 终于开始干正事了
2. tcpdump 确认 与 安装
- 概述
- tcpdump 的 确认 与 安装
1. 确认
-
概述
- 确认
-
命令
-
rpm
# 如果 有结果, 则说明安装 > rpm -qa | grep 'tcpdump' tcpdump-4.9.2-4.el7_7.1.x86_64
-
tcpdump
# tcpdump 的关键组件 > tcpdump --version tcp_wrappers-7.6-77.el7.x86_64 tcp_wrappers-libs-7.6-77.el7.x86_64 tcpdump-4.9.2-4.el7_7.1.x86_64
-
-
如果确认没有通过
- 那么就要想办法安装了
2. 安装
-
概述
- 安装
-
命令
> yum install -y tcpdump
-
验证
- 上一步的确认
3. tcpdump 简单使用
- 概述
- tcpdump 简单使用
1. 帮助
-
概述
- tcpdump 的帮助
-
命令
# 简单 > tcpdump --help # 详细 > man tcpdump
2. 初次使用
-
命令
> tcpdump
-
结果
- 直接开始抓包, 并且打印到 屏幕上
-
问题
-
包好像有点多
- 指定包的大小, 肯定是没问题的
-
抓包的结果, 我暂时不讲, 抱歉
-
3. 指定包的大小
-
维度1: 包的数量
> tcpdump -c <num>
-
维度2: 指定包的大小
# 单位是 MB(1000000 B) > tcpdump -C <size>
-
问题
- 我一台机器上, 有好好多连接
- 我就想看 那么几个, 怎么办
- 我一台机器上, 有好好多连接
4. ip 过滤
-
维度1: 源ip
# host 很重要 # 1. host 是 默认值 # 2. 表明, 这是一个 主机 # 3. 还能指定 网络, 端口, 端口范围, 当然这个以后另说 > tcpdump -c 10 host src <IPAddress>
-
维度2: 目的ip
> tcpdump -c 10 host dst <IPAddress>
-
维度3: 源/目的ip
# 如果不写 src 或者 dst, 默认值为 src or dst > tcpdump -c 10 host <IPAddress>
-
疑问
-
为啥我抓不到包
> tcpdump -c 10 host <docker_contain>
-
解答
- tcpdump 如果不指定设备, 则默认会监控 第一个 网卡
- 通常是 eth0 或者 enp0s3 之类
- 所以
- 需要手动指定网卡
- tcpdump 如果不指定设备, 则默认会监控 第一个 网卡
-
5. 指定网卡
-
命令
> tcpdump -c 10 -nn -i <if> host <docker_contain>
-
结果
-
成功抓到包
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on br-7a88d4cc405f, link-type EN10MB (Ethernet), capture size 262144 bytes 21:09:08.628235 IP 172.21.0.1 > 172.21.0.2: ICMP echo request, id 3295, seq 114, length 64 21:09:08.628253 IP 172.21.0.2 > 172.21.0.1: ICMP echo reply, id 3295, seq 114, length 64 21:09:09.628502 IP 172.21.0.1 > 172.21.0.2: ICMP echo request, id 3295, seq 115, length 64 21:09:09.628520 IP 172.21.0.2 > 172.21.0.1: ICMP echo reply, id 3295, seq 115, length 64 21:09:10.630799 IP 172.21.0.1 > 172.21.0.2: ICMP echo request, id 3295, seq 116, length 64 21:09:10.631049 IP 172.21.0.2 > 172.21.0.1: ICMP echo reply, id 3295, seq 116, length 64 21:09:11.633172 IP 172.21.0.1 > 172.21.0.2: ICMP echo request, id 3295, seq 117, length 64 21:09:11.633189 IP 172.21.0.2 > 172.21.0.1: ICMP echo reply, id 3295, seq 117, length 64 21:09:12.651462 IP 172.21.0.1 > 172.21.0.2: ICMP echo request, id 3295, seq 118, length 64 21:09:12.651481 IP 172.21.0.2 > 172.21.0.1: ICMP echo reply, id 3295, seq 118, length 64 10 packets captured 10 packets received by filter
-
4. 后续
-
信息怎么看
- icmp 的协议
- 学会看 tcpdump 信息
- 能不能看看详细信息
-
这个命令, 好像并不是这么简单
- 后面的 host 那块, 甚至可以做运算
-
抓到的东西, 能否做 持久化
-
命令这么麻烦, 能不能以 脚本的形式 保存
ps
- ref
- 抓包工具tcpdump用法说明
- 运维大佬
- 抓包工具tcpdump用法说明
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出