网络抓包,我们肯定不会陌生。
常见的(我用过的)抓包工具有:
Chrome控制台Network面板, Fiddler, Wireshark.
然而都是windows下的工具, 在服务器上工作, 我们还需要一些命令行的抓包工具, 比如tcpdump.
tcpdump简单来说就是一个命令行抓包工具, 可以指定网卡, 端口, IP等, 功能非常强大.
如果没有安装,可以通过yum install -y tcpdump
执行安装(Redhat系列)
实验环境:
- Linux: CentOS release 6.10 (Final)
IP: 192.168.31.42 - Windows:
IP: 192.168.31.106
在 Linux上的8080端口开了一个http服务,Windows中发起请求
下面是一些常用选项及使用截图.
- -D 列出哪些网卡可以抓包
[root@gerrylon dev-scripts]# tcpdump -D
1.eth0
2.docker0
3.nflog (Linux netfilter log (NFLOG) interface)
4.nfqueue (Linux netfilter queue (NFQUEUE) interface)
5.usbmon1 (USB bus number 1)
6.any (Pseudo-device that captures on all interfaces)
7.lo
- -i xx 抓取经过网卡xx的数据包
如 抓取经过eth0的数据包: - -c num 最多抓取几个包就停止
上面的tcpdump -i eth0
包实在太多了,已经“刷屏”了,加上-c 5
指定最多抓取5个包就停止 - -n Don’t convert host addresses to names. This can be used to avoid DNS lookups.
不把主机地址转换成名字. 就是可以避免DNS查询。 - -nn Don’t convert protocol and port numbers etc. to names either
不会将协议和端口号转换为名字
比如上面有个tcpdump -i eth0 -c 5
, ssh连接端口显示的是ssh, 加上-nn
就会显示成22.
如下图(注意标红位置): - 只抓取指定协议的数据包, 如
tcpdump -i eth0 icmp
只抓取icmp的数据包
icmp最著名的两个应用ping
和traceroute
以traceroute为例子看看:tcpdump -i eth0 icmp
traceroute www.yandex.ru
- port 8080 指定端口
- host 192.168.31.42 指定IP(只抓取和显示与192.168.31.42有关的包)
- port 8080 and host 192.168.31.42 同时指定端口和IP
- src 192.168.31.42 只抓取源IP为192.168.31.42的包
- dst 192.168.31.42 只抓取目标IP为192.168.31.42的包
- 多条件
tcpdump -i eth0 'port 8080 and (src 192.168.31.106 or src 192.168.31.42)'
(注意要加单引号,否则语法有错) - -A Print each packet (minus its link level header) in ASCII. Handy for capturing web pages.
以ACSII形式打印出每一个包,对抓web页面非常方便 - -X 以十六进制打印出包内容
- -t 不要打印时间戳
- -w test.pcap 保存成文件
tcpdump -nn -r test.pcap
(从文件读取, src等过滤规则同样适用)tcpdump -nn -c 5 -r test.pcap port 8080
(port 8080这种表达式要写在后面,写在-r前面会报错)
保存下来的 test.pcap 文件用wiresharek也可以打开观察.
如:
# 抓包将信息存储到test.cap
tcpdump -i eth0 -nn 'port 8080' -w test.cap
在windows请求"http://192.168.31.42:8080/", 也就是linux上的8080端口http服务
Ctrl+C停止tcpdump抓包
用Wireshark打开test.cap:
这样观看是不是感觉特别直观呢?
总结:
命令选项非常多,但是掌握常用的就可以胜任大部分工作了,不要看见一大堆选项就不想学了。