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上面沒有網絡數據包,就可以直接摘掉了。