linux下網絡調試工具

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章