Linux命令之tcpdump
- 2020 年 3 月 26 日
- 筆記
//
Linux命令之tcpdump
//
基于MHA+consul的高可用方案上线已经一段时间了,目前比较稳定,之前线上环境使用的是VIP+MHA的高可用方案,这种方案在跨机房之间进行故障切换存在问题,所以现在要将服务器上的VIP(virtual IP address)给摘除掉,要摘除VIP,需要查看当前VIP是否有应用服务进行连接,这里利用到了tcpdump这个Linux命令来查看。
首先我们来看VIP的绑定效果:
[dba_mysql ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:50:56:b7:08:40 brd ff:ff:ff:ff:ff:ff inet 10.xx.xx.47/24 brd 10.30.124.255 scope global eth0 inet 10.xx.xx.227/24 scope global secondary eth0
可以看到,eth0上有两个绑定IP,其中,第二个IP地址即为VIP。
01
tcpdump命令
tcpdump命令翻译过来就是dump the traffic on a network,也就是对网络上的tcp数据包进行截取分析。它支持针对网络层、协议、主机、网络或端口的过滤。该命令经常被用来进行网络分析和问题排查。它的语法比较友好,支持and、or、not等逻辑语句来帮助我们过滤掉无效的信息。不带参数的tcpdump会收集网络中所有的信息包头,数据量巨大,必须过滤
tcpdump命令的参数有很多,我们这里只看比较常用的用法,其他的可以通过man tcpdump的方法去查看操作手册。
在tcpdump的表达式中,主要包含以下关键字:
1、关于类型的
例如host(主机)、net(网络地址)、port(端口),如果没有指定类型,则缺省的类型是host
2、确定传输方向的关键字
包括src(源端),dst(目标端),dst or src,dst and src,这些关键字指明了传输的方向
3、关于协议的关键字
主要包含tcp,udp,ip,arp,rarp,如果没有知名监听的包的协议内容,tcpdump将会监听所有的包内容。
4、比较分析类关键字
例如,gateway (网关),broadcast(广播),less,greater,not,and,or等等
02
常用命令
过滤指定IP
抓取所有经过eth0,目的或源地址是192.168.1.1的网络数据
tcpdump -i eth0 host 192.168.1.1
指定源地址
tcpdump -i eth0 src host 192.168.1.1
指定目的地址
tcpdump -i eth0 dst host 192.168.1.1
过滤指定端口
抓取所有经过eth0,目的或源端口是25的网络数据
tcpdump -i eth0 port 4306
指定源端口
tcpdump -i eth0 src port 4306
指定目的端口
tcpdump -i eth0 dst port 4306
协议过滤
过滤4306端口的tcp协议
tcpdump tcp port 4306
组合过滤
过滤协议、端口、主机名称
tcpdump tcp port 3306 and host 10.30.xxx.xxx
条件过滤
抓取所有经过eth0,目的地址是192.168.1.1或192.168.1.2端口是80的TCP数据
tcpdump -i eth0 '((tcp) and (port 80) and ((dst host 192.168.1.1) or (dst host 192.168.1.2)))'
抓取所有经过eth0,目标MAC地址是00:01:02:03:04:05的ICMP数据
tcpdump -i eth0 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
抓取所有经过eth0,目的网络是192.168,但目的主机不是192.168.1.2的TCP数据
tcpdump -i eth0 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.2)))'
03
如何查询VIP的地址是否有访问?
命令如下:
tcpdump -nnn host 10.xx.xxx.xxx and port 4306
我们可以看到输出结果:
18:08:25.247002 IP 10.xx.xxx.64.54248 > 10.xx.xxx.228.4xx6: Flags [P.], seq 3167226600:3167226621, ack 3751788535, win 65535, length 21 18:08:25.247123 IP 10.xx.xxx.228.4xx6 > 10.xx.xxx.64.54248: Flags [P.], seq 1:12, ack 21, win 65535, length 11 18:08:25.247246 IP 10.xx.xxx.64.54248 > 10.xx.xxx.228.4xx6: Flags [.], ack 12, win 65535, length 0 18:08:25.247365 IP 10.xx.xxx.64.54248 > 10.xx.xxx.228.4xx6: Flags [P.], seq 21:48, ack 12, win 65535, length 27 18:08:25.247441 IP 10.xx.xxx.228.4xx6 > 10.xx.xxx.64.54248: Flags [P.], seq 12:23, ack 48, win 65535, length 11 18:08:25.247593 IP 10.xx.xxx.64.54248 > 10.xx.xxx.228.4xx6: Flags [P.], seq 48:369, ack 23, win 65535, length 321 18:08:25.248232 IP 10.xx.xxx.228.4xx6 > 10.xx.xxx.64.54248: Flags [P.], seq 23:401, ack 369, win 65535, length 378 18:08:25.248407 IP 10.xx.xxx.64.54248 > 10.xx.xxx.228.4xx6: Flags [P.], seq 369:380, ack 401, win 65535, length 11
如果这个命令有输出,则说明这块网卡上有数据访问,有三次握手情况。
如果持续一段时间没有输出,则可以判断这个IP上面没有网络数据包,就可以直接摘掉了。