linux命令之tcpdump
網路抓包,我們肯定不會陌生。
常見的(我用過的)抓包工具有:
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 列出哪些網絡卡可以抓包
[[email protected] 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)
-
-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
-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 以十六進位制打印出包內容
-
-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:
這樣觀看是不是感覺特別直觀呢?
總結:
命令選項非常多,但是掌握常用的就可以勝任大部分工作了,不要看見一大堆選項就不想學了。
歡迎補充指正!