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