linux下網絡調試工具,主要包括tcpdump、netstat和lsof工具。
1. tcpdump (dump traffic on a network)
tcpdump打印指定網絡接口中與布爾表達式匹配的報頭信息。
tcpdump的表達式是一個正則表達式,tcpdump利用它作爲過濾報文的條件,如果一個報文滿足表達式的條件,則這個報文將被捕獲。如果沒有給出任何條件,則網絡上的所有的信息包將會被截獲。
表達式中一般有如下幾個類型的關鍵字。
(1) 關於類型的關鍵字,主要包括host、net、port,例如:
host 210.27.48.2 //指明210.27.48.2主機
net 202.0.0.0 //指明網絡地址202.0.0.0
port 23 //指明端口號爲23
如果沒有指定類型,默認的類型是host。
(2) 確定傳輸方向的關鍵字,主要包括src、dst、dst or src、dst and src,
src 210.27.48.2 //指明IP包源地址爲210.27.48.2
dst net 202.0.0.0 //指明目的網絡地址爲202.0.0.0
如果沒有指明方向關鍵字,則默認是src或dst關鍵字。
(3) 協議關鍵字,主要包括fddi、ip、arp、rarp、tcp、udp等類型。指明瞭監聽的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的信息包。
除了這3類型的關鍵字,重要的關鍵字還有gateway、broadcast、less、greater。另外還有3中邏輯運算:
‘not’或’!’ //非運算
‘and’或’&&’ //與
‘or’或’||’ //或
應用示例:
(1) 想要截獲所有210.27.48.1的主機收到和發出的所有數據包
$tcpdump host 210.27.48.1
(2) 想要截獲210.27.48.1和主機210.27.48.2和210.27.48.3的通信,使用命令
(在命令行中使用括號時,一定要\):
$tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)
(3) 如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外的所有主機通信的ip包
$tcpdump ip host 210.27.48.1 and !210.27.28.2
(4) 如果要獲取主機210.27.48.1接受或發出的telnet包,使用如下命令:
$tcpdump tcp port 23 host 210.27.48.1
TCP包的輸出信息:
使用tcpdump捕獲的tcp包的一般輸出信息格式是:
src.port > dst.port: flags data-seqno ack window urgent options
內容分析如下:
l src.port >dst.port:源到目的地,剛好標識一對連接
l flags是tcp包中的標誌信息:S是SYN標誌,F(FIN)、P(PUSH)、R(RST)、“.”(沒有標誌)。
l data-seqno數據包中的數據的順序號
l ack是下一次期望的順序號
l win是接收緩存的窗口大小
l urgent表明數據包中是否有緊急指針
l options是選項
tcpdump常用選項:
l -a:將網絡地址和廣播地址轉變成名字
l -d:將匹配信息包的代碼以能夠理解的彙編格式給出
l -dd:將匹配信息包的代碼以C語言程序段的格式給出
l -ddd:將匹配信息包的代碼以十進制的形式給出
l -e:在輸出行打印出數據鏈路層的頭部信息
l -f:將外部地址以數字的形式打印出來
l -l:使標準輸出變爲緩衝形式
l -n:不把網絡地址轉換成名字
l -t:在輸出行的每一行不打印時間戳
l -v:輸出一個稍微詳細的信息
l -vv:輸出詳細的報文信息
l -c:在收到指定數目的數據包後,tcpdump就會停止
l -F:從指定的文件中讀取表達式,忽略其他的表達式
l -i:指定監聽的網絡接口
l -r:從指定的文件中讀取包(這些包一般通過-w選項產生)
l -w:直接將包寫入文件中,並不分析和打印出來
l -T:將監聽到的包直接解釋爲指定的類型的報文,常見的類型有rpc和snmp
tcpdump能抓取網絡包,並分析。
這裏,我直接用tcpdump抓到包並保存在文件中(syn.log),找到相應字段的bit區域,通過查tcp/ip協議個字段,反向解包。並與tcpdump的分析結果對比。
tcp服務器:192.168.0.50:48500
tcp客戶端:192.168.0.100:59684
IPv4
先啓動服務器,然後打開tcpdump監聽,將抓包指定保存到文件syn.log。然後,客戶端主動連接上來,這樣,最開始抓到的爲tcp的三次握手。
使用od將數據以16進制顯示,以一個字節爲單位(8bits)。
除了網絡數據包之外,產生的文件中還有些數據是tcpdump文件特用的數據,例如最開始的d4c3 b2a1表示該文件是tcpdump產生的文件,具體tcpdump文件格式,網上搜的到,這裏我只圈出三次握手的網絡數據包,如圖。將上圖中的輸出,重定向到另外文件中,爲了方便閱讀,將其重新排列(但不改變字節序)。
這裏,我拿第一個SYN包來反解
目的MAC:08:90:00:a0:02:10
源MAC:3c:97:0e:8f:c8:be
協議類型:0800(IP協議包)
IP頭:
版本:0x4(IPv4),對於IPv6,該值爲6
首部長度:0x5,這個長度以字爲單位。(5*4=20字節)
服務類型(TOS):0x00
總長度:0x003c(60)
標識:0x41bf(16831)
標誌:0x2
偏移:0
生存時間:0x40(64)
協議:0x06(TCP協議包)
首部校檢和:0x7716(30486)
源IP地址:c0(192).a8(168).00(0).64(100)
目的IP地址:c0(192).a8(168).00(0).32(50)
TCP頭:
源端口號:0xe924(59684)
目的端口號:0xbd74(48500)
序號:0xcab64ff2(3400945650)
確認序號:0(第一個SYN,沒有需要回應的序號)
首部長度:0xa(10字)(10*4=40字節,從後面可以看到選項暫用了20字節)
保留位:0
URG(0),ACK(0),PSH(0),RST(0),SYN(1),FIN(0)
窗口大小:0x3908(14600)
校檢和:0x8215
緊急指針:0
選項:
02 04 05 b4:MSS爲1460
04 02:SACK
08 0a 00 02 0e 4d 00 00 00 00:時間戳 TS val:0x00020e4d(134733),Tsecr:0
01:nop
03 03 07:窗口擴大因子wscale:7
使用tcpdump分析:
對比,結果一致
2. netstat工具使用
netstat命令的功能是顯示網絡連接、路由表和網絡接口信息,可以讓用戶得知哪些網絡連接正在工作,及其工作狀態。
$man netstat
print network connections,routing tables, interface statistics, masquerade connections, and multicastmemberships
該命令一般格式爲:
netstat [-a] [-e] [-n] [-o] [-p Protocol] [-r] [-s] [Interval]
從整體上看,netstat的輸出結果可以分爲兩個部分:
一個是Active internet connections,其中Recv-Q和Send-Q指接收隊列和發送隊列。這些數字一般都應該是0。如果不是則表示軟件包正在隊列中堆積。
另一個是Active UNIX domain sockets,(unix域套接字,和網絡套接字一樣,但只能用於本機通信,性能可以提高一倍)。
Proto顯示連接使用的協議,RefCnt表示連接到本套接口上的進程號,Types顯示套接口的類型,State顯示套接口當前的狀態,Path表示連接到套接口的其他進程使用的路徑名。
常見參數:
-a (all)顯示所有選項,默認不顯示Listening相關、udp相關
-t (tcp)僅僅顯示tcp相關選項
-u (udp)僅僅顯示udp相關選,結合-a使用
-n (numeric)拒絕顯示別名,能顯示數字的全部轉化成數字
-l (listening)僅僅列出Listening狀態的服務
-p (program)顯示套接字所述的進程名及其PID
-r (route)顯示路由信息,路由表
-e (extend)顯示擴展信息,例如uid等
-s 按各協議進行統計
-c (continuous)每隔一個固定時間,執行該netstat命令
LISTEN和LISTENING的狀態只有用-a或者-l才能看到
列出所有端口:(包括監聽狀態的)
$netstat –a
列出所有tcp端口:
$netstat –at
列出所有udp端口:
$netstat –au
列出所有udp端口,並顯示所屬進程(僅顯示該用戶的,要看所有用戶需要root):
$netstat –aup
只顯示監聽端口:
$netstat –l
顯示系統不支持的地址族:
$netstat --verbose
顯示內核IP路由表:
$netstat –r
3. lsof工具使用
lsof全名爲list opened files,即列出系統中已經被打開的文件。
查看套接字:
$lsof –i