目录express
本文首发于个人公众号 Linux云计算网络(id: cloud_dev),专一于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」便可领取,欢迎你们关注,二维码文末能够扫。编程
这篇文章我总结得比较详尽,能够当字典查,建议收藏,不过别光顾着收藏,点赞什么的鼓励我一下,这能让我更有动力给你们输出更好的内容。vim
tcpdump 是一款 Linux 平台的抓包工具。它能够抓取涵盖整个 TCP/IP 协议族的数据包,支持针对网络层、协议、主机、端口的过滤,并提供 and、or、not 等逻辑语句来过滤无用的信息。网络
tcpdump 是一个很是复杂的工具,掌握它的方方面面实属不易,也不推荐,可以用它来解决平常工做问题才是关系。tcp
tcpdump 有不少命令选项,想了解全部选项能够 Linux 命令行输入 tcpdump -h
,man tcpdump
查看每一个选项的意思。工具
[root@by ~]# tcpdump -h tcpdump version 4.9.2 libpcap version 1.5.3 OpenSSL 1.0.2k-fips 26 Jan 2017 Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ] [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ] [ -Q|-P in|out|inout ] [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ] [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
下面列举一些经常使用选项:post
-X
一块儿使用,获取 http 能够用 tcpdump -nSA port 80
-i any
显示全部网卡-s 0
的话,会截取所有内容。网络报文是不少的,不少时候咱们在主机上抓包,会抓到不少咱们并不关心的无用包,而后要从这些包里面去找咱们须要的信息,无疑是一件费时费力的事情,tcpdump 提供了灵活的语法能够精确获取咱们关心的数据,这些语法说得专业点就是过滤器。测试
过滤器简单可分为三类:协议(proto)、传输方向(dir)和类型(type)。ui
通常的 表达式格式 为:云计算
测试环境 IP:172.18.82.173
抓取主机 172.18.82.173 上全部收到(DST_IP)和发出(SRC_IP)的全部数据包
tcpdump host 172.18.82.173
抓取通过指定网口 interface ,而且 DST_IP 或 SRC_IP 是 172.18.82.173 的数据包
tcpdump -i eth0 host 172.18.82.173
筛选 SRC_IP,抓取通过 interface 且从 172.18.82.173 发出的包
tcpdump -i eth0 src host 172.18.82.173
筛选 DST_IP,抓取通过 interface 且发送到 172.18.82.173 的包
tcpdump -i eth0 dst host 172.18.82.173
抓取主机 200.200.200.1 和主机 200.200.200.2 或 200.200.200.3 通讯的包
tcpdump host 200.200.200.1 and \(200.200.200.2 or 200.200.200.3\)
抓取主机 200.200.200.1 和除了主机 200.200.200.2 以外全部主机通讯的包
tcpdump ip host 200.200.200.1 and ! 200.200.200.2
抓取全部端口,显示 IP 地址
tcpdump -nS
抓取某端口上的包
tcpdump port 22
抓取通过指定 interface,而且 DST_PORT 或 SRC_PORT 是 22 的数据包
tcpdump -i eth0 port 22
筛选 SRC_PORT
tcpdump -i eth0 src port 22
筛选 DST_PORT
tcpdump -i eth0 dst port 22
好比但愿查看发送到 host 172.18.82.173 的网口 eth0 的 22 号端口的包
[root@by ~]# tcpdump -i eth0 -nnt dst host 172.18.82.173 and port 22 -c 1 -vv tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes IP (tos 0x14, ttl 114, id 27674, offset 0, flags [DF], proto TCP (6), length 40) 113.98.59.61.51830 > 172.18.82.173.22: Flags [.], cksum 0x7fe3 (correct), seq 19775964, ack 1564316089, win 2053, length 0
抓取通过指定 interface,而且 DST_NET 或 SRC_NET 是 172.18.82 的包
tcpdump -i eth0 net 172.18.82
筛选 SRC_NET
tcpdump -i eth0 src net 172.18.82
筛选 DST_NET
tcpdump -i eth0 dst net 172.18.82
tcpdump -i eth0 icmp tcpdump -i eth0 ip tcpdump -i eth0 tcp tcpdump -i eth0 udp tcpdump -i eth0 arp
抓取通过 interface eth0 发送到 host 200.200.200.1 或 200.200.200.2 的 TCP 协议 22 号端口的数据包
tcpdump -i eth0 -nntvv -c 10 '((tcp) and (port 22) and ((dst host 200.200.200.1) or (dst host 200.200.200.2)))'
PS:对于复杂的过滤器表达式,为了逻辑清晰,可使用 ()
,不过默认状况下,tcpdump 会将 ()
当作特殊字符,因此必须使用 ''
来消除歧义。
抓取通过 interface eth0, DST_MAC 或 SRC_MAC 地址是 00:16:3e:12:16:e7 的 ICMP 数据包
tcpdump -i eth0 '((icmp) and ((ether host 00:16:3e:12:16:e7)))' -nnvv
抓取通过 interface eth0,目标网络是 172.18 但目标主机又不是 172.18.82.173 的 TCP 且非 22 号端口号的数据包
tcpdump -i eth0 -nntvv '((dst net 172.18) and (not dst host 172.18.82.173) and (tcp) and (not port 22))'
抓取流入 interface eth0,host 为 172.18.82.173 且协议为 ICMP 的数据包
tcpdump -i eth0 -nntvv -P in host 172.18.82.173 and icmp
抓取流出 interface eth0,host 为 172.18.82.173 且协议为 ICMP 的数据包
tcpdump -i eth0 -nntvv -P out host 172.18.82.173 and icmp
tcpdump 抓包的时候,默认是打印到屏幕输出,若是是抓取包少还好,若是包不少,不少行数据,刷刷刷从眼前一闪而过,根原本不及看清内容。不过,tcpdump 提供了将抓取的数据保存到文件的功能,查看文件就方便分析多了,并且还能与其余图形工具一块儿配合分析,好比 wireshark、Snort 等。
tcpdump -w capture_file.pcap port 80 # 把全部 80 端口的数据导出到文件
tcpdump -nXr capture_file.pcap host host1
PS:.pcap
格式的文件须要用 wireshark、Snort 等工具查看,使用 vim
或 cat
会出现乱码。
tcpdump 的输出格式整体上为:
系统时间 源主机.端口 > 目标主机.端口 数据包参数
好比下面的例子,显示了 TCP 的三次握手过程:
21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64) 192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0 21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44) 124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0 21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40) 192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0
第一条是 SYN
报文,经过 Flags[S]
看出。第二条是 [S.]
,表示 SYN-ACK
报文。常见的 TCP 报文的 Flags 以下:
[S]
: SYN(开始链接)[.]
: 没有 Flag[P]
: PSH(推送数据)[F]
: FIN (结束链接)[R]
: RST(重置链接)本文能够当字典查阅,记住一些经常使用的 tcpdump 抓包案例,其余的用到再经过 man tcpdump
辅助编写。和 wireshark 等图形化工具配合使用,能更加深理解。
后台回复“加群”,带你进入高手如云交流群
参考
https://blog.csdn.net/Jmilk/article/details/86618205?tdsourcetag=s_pctim_aiomsg
https://danielmiessler.com/study/tcpdump/
http://bencane.com/2014/10/13/quick-and-practical-reference-for-tcpdump/
个人公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 便可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎你们关注。