UNIX 网络协议的深度分析
https://www.ibm.com/developerworks/cn/aix/library/au-deepprotocolanalysis/index.html?mhq=http%E5%8D%8F%E8%AE%AE&mhsrc=ibmsearch_a
引言
網(wǎng)絡(luò)已經(jīng)是無(wú)處不在,很多時(shí)候我們都會(huì)利用網(wǎng)絡(luò)與不同主機(jī)進(jìn)行通信,包括網(wǎng)絡(luò)內(nèi)部和外部的。大多數(shù)情況下這不會(huì)遇到問(wèn)題,但是有時(shí)您需要仔細(xì)檢查您的網(wǎng)絡(luò)以查明問(wèn)題原因。
仔細(xì)檢查網(wǎng)絡(luò)流量?jī)?nèi)容的原因有很多。其中第一個(gè)原因是您可能正在調(diào)試一個(gè)現(xiàn)有的網(wǎng)絡(luò)應(yīng)用,或者您正在開(kāi)發(fā)一個(gè)應(yīng)用,而您想要監(jiān)控通過(guò)您的網(wǎng)絡(luò)的流量。第二個(gè)原因是需要識(shí)別可能耗盡網(wǎng)絡(luò)帶寬和資源的流量。對(duì)于前一種情況,您可能已經(jīng)知道協(xié)議的內(nèi)容了,但是您希望能夠更深入地了解正在傳輸?shù)膶?shí)際數(shù)據(jù),例如,在使用 Web 服務(wù)時(shí)。對(duì)于后一種情況,確定數(shù)據(jù)包的內(nèi)容需要了解正在使用的協(xié)議的一些擴(kuò)展知識(shí)。
在 TCP/IP 和 UDP/IP 的通信中,最主要的元素是用于確定主機(jī)和端口號(hào)的 IP 地址。端口號(hào)用于提供額外的通信通道,這樣您才能夠在兩個(gè)主機(jī)之間實(shí)現(xiàn)多個(gè)連接。其中端口定義還有一些標(biāo)準(zhǔn)。例如,端口 25 是專用于電子郵件(SMTP)傳輸,而大多數(shù)網(wǎng)站都是運(yùn)行在端口 80(HTTP)上的。這些規(guī)范可以使程序之間通過(guò)一個(gè)熟悉的通道進(jìn)行通信,這與您選擇電話或傳真號(hào)的道理是一樣的。
雖然有這樣一些規(guī)范,但是您實(shí)際想使用哪些端口是沒(méi)有任何限制或約束的。事實(shí)上,大多數(shù)情況下一些破壞性網(wǎng)絡(luò)應(yīng)用和一些安全性方法會(huì)故意使用非標(biāo)準(zhǔn)端口。例如,有些應(yīng)用會(huì)通過(guò)將一個(gè)標(biāo)準(zhǔn)端口用于不同的協(xié)議而隱藏內(nèi)容,如在 端口 25 上使用 HTTP 協(xié)議。此外,有時(shí)某些應(yīng)用也會(huì)使用與標(biāo)準(zhǔn)不同的端口,這樣端口的用途就明顯了(如,將端口 99 用于 HTTP),或者將特定的協(xié)議流量封裝到另一個(gè)協(xié)議中。最后的方法實(shí)際上是網(wǎng)絡(luò)通道和虛擬私有網(wǎng)絡(luò)(VPN)所使用的方法。
不管網(wǎng)絡(luò)流量原因和復(fù)雜性,第一個(gè)步驟都會(huì)開(kāi)始記錄數(shù)據(jù)。
記錄原始數(shù)據(jù)
如果您希望記錄網(wǎng)絡(luò)原始數(shù)據(jù),以便自己檢查這些信息,那么您可以使用許多不同的工具。大多數(shù)的網(wǎng)絡(luò)嗅探器也能夠解碼和解密特定的數(shù)據(jù)包內(nèi)容,這能夠幫助您研究一個(gè)已知協(xié)議的內(nèi)容。
在 Solaris 上,您可以使用 snoop 工具,而在 AIX 上,您可以使用 iptrace 工具。您也可以嘗試使用跨平臺(tái)的 tcpdump 工具,它支持大多數(shù)的 UNIX 和 Linux 操作系統(tǒng)。這些工具能夠幫您捕捉和解碼數(shù)據(jù)包,通常也能為您執(zhí)行大多數(shù)的協(xié)議分析。注意,現(xiàn)代交換機(jī)不會(huì)將 Ethernet 數(shù)據(jù)包發(fā)送到每一個(gè)端口上,這通常會(huì)限制您從當(dāng)前主機(jī)獲取的信息量。許多現(xiàn)代交換機(jī)具有一個(gè)管理端口,它通常帶有與這種監(jiān)控完全相同的所有數(shù)據(jù)包的副本。
解碼網(wǎng)絡(luò)傳輸最復(fù)雜的是網(wǎng)絡(luò)數(shù)據(jù)包中信息的級(jí)別。此外,大部分信息也會(huì)經(jīng)過(guò)二進(jìn)制編碼后再發(fā)送,從網(wǎng)絡(luò)捕捉完全原始的數(shù)據(jù)包需要進(jìn)行大量的操作才能捕捉您需要的數(shù)據(jù)。通過(guò)使用實(shí)現(xiàn)某些處理的工具,您可以簡(jiǎn)化解碼網(wǎng)絡(luò)數(shù)據(jù)的過(guò)程。
例如,在一個(gè) Ethernet 上查看一個(gè)典型的 TCP/IP 協(xié)議,您將會(huì)發(fā)現(xiàn)網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包括:
- Ethernet 數(shù)據(jù)包頭,包括 Ethernet 來(lái)源和目標(biāo)地址,數(shù)據(jù)包大小和 Ethernet 數(shù)據(jù)包類型。
- IP 報(bào)頭,由 IP 尋址(來(lái)源和目標(biāo)),協(xié)議標(biāo)識(shí)和 IP 標(biāo)記。您也會(huì)得到關(guān)于分片和數(shù)據(jù)包順序的信息。
- TCP 報(bào)頭,它包含端口上的信息、隱含的協(xié)議、標(biāo)記和順序編號(hào)。
即使有這些信息,我們?nèi)匀粺o(wú)法了解實(shí)際內(nèi)容。在 TCP(或 UDP)協(xié)議之下還有額外的協(xié)議,標(biāo)準(zhǔn)數(shù)據(jù)協(xié)議(包括 HTTP、SMTP 和 FTP),或者封裝性協(xié)議,如 Remote Procedure Call (RPC) 和 RPC 的子類型,如 NFS。
通常這些工具必須使用協(xié)議和/或端口號(hào)來(lái)確定正在傳輸?shù)膬?nèi)容。所以,如果流量是通過(guò)非標(biāo)準(zhǔn)端口傳輸?shù)?#xff0c;那么這個(gè)些信息可能無(wú)法正確解碼。
基本的網(wǎng)絡(luò)分析
本文之前提到的許多網(wǎng)絡(luò)嗅探工具都提供了不同級(jí)別的協(xié)議解碼,它們是通過(guò)檢查端口和內(nèi)容來(lái)確定所使用的協(xié)議實(shí)現(xiàn)的。
例如,snoop 和 tcpdump 都提供了關(guān)于 UDP 和 TCP 上不同協(xié)議的不同級(jí)別的詳細(xì)信息。例如,在 snoop 中,您可以獲得從頂級(jí)協(xié)議到所傳輸?shù)膯蝹€(gè)數(shù)據(jù)塊的關(guān)于 NFS 操作的詳細(xì)信息。例如,您可以通過(guò)指定監(jiān)控 RPC 使用 NFS 協(xié)議來(lái)實(shí)現(xiàn)對(duì) NFS 流量的監(jiān)控:$ snoop -v rpc nfs。
它能輸出非常詳細(xì)的數(shù)據(jù)包信息,并且它們應(yīng)該進(jìn)行更緊密的觀察。清單 1?提供了 Ethernet 報(bào)頭數(shù)據(jù)。
清單 1. Ethernet 報(bào)頭數(shù)據(jù)
| 1 2 3 4 5 6 7 8 | ETHER:? ----- Ether Header ----- ETHER:? ETHER:? Packet 64 arrived at 16:14:41.79434 ETHER:? Packet size = 238 bytes ETHER:? Destination = 0:1a:ee:1:1:c0, ETHER:? Source????? = 0:21:28:3c:c0:61, ETHER:? Ethertype = 0800 (IP) ETHER: |
這里的輸出表明 Ethernet 數(shù)據(jù)包包含了 IP 數(shù)據(jù)、全部數(shù)據(jù)包大小和時(shí)間,以及數(shù)據(jù)包的目標(biāo)和來(lái)源地址。
清單 2?顯示的是 IP 報(bào)頭。其中除了協(xié)議和來(lái)源/目標(biāo)地址信息,其余許多 IP 數(shù)據(jù)是沒(méi)有用的。
清單 2. IP 報(bào)頭
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | IP:?? ----- IP Header ----- IP:?? IP:?? Version = 4 IP:?? Header length = 20 bytes IP:?? Type of service = 0x00 IP:???????? xxx. .... = 0 (precedence) IP:???????? ...0 .... = normal delay IP:???????? .... 0... = normal throughput IP:???????? .... .0.. = normal reliability IP:???????? .... ..0. = not ECN capable transport IP:???????? .... ...0 = no ECN congestion experienced IP:?? Total length = 224 bytes IP:?? Identification = 27460 IP:?? Flags = 0x4 IP:???????? .1.. .... = do not fragment IP:???????? ..0. .... = last fragment IP:?? Fragment offset = 0 bytes IP:?? Time to live = 64 seconds/hops IP:?? Protocol = 6 (TCP) IP:?? Header checksum = 4d11 IP:?? Source address = 192.168.0.112, tiger.mcslp.pri IP:?? Destination address = 192.168.0.2, bear.mcslp.pri IP:?? No options IP: |
在?清單 3?中,您可以看到 TCP 報(bào)頭。同樣,這些信息中通常只有來(lái)源和目標(biāo)端口號(hào)才是有用的,因?yàn)檫@些信息將可用于確定預(yù)期的協(xié)議,或者提供給您可用于更進(jìn)一步觀察這個(gè)端口所傳輸流量的信息。
清單 3. TCP 報(bào)頭
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | TCP:? ----- TCP Header ----- TCP:? TCP:? Source port = 2049 TCP:? Destination port = 889 (Sun RPC) TCP:? Sequence number = 2834727685 TCP:? Acknowledgement number = 2654368001 TCP:? Data offset = 32 bytes TCP:? Flags = 0x18 TCP:??????? 0... .... = No ECN congestion window reduced TCP:??????? .0.. .... = No ECN echo TCP:??????? ..0. .... = No urgent pointer TCP:??????? ...1 .... = Acknowledgement TCP:??????? .... 1... = Push TCP:??????? .... .0.. = No reset TCP:??????? .... ..0. = No Syn TCP:??????? .... ...0 = No Fin TCP:? Window = 32806 TCP:? Checksum = 0x4852 TCP:? Urgent pointer = 0 TCP:? Options: (12 bytes) TCP:??? - No operation TCP:??? - No operation TCP:??? - TS Val = 34449495, TS Echo = 253458642 TCP: |
清單 4?的倒數(shù)第二部分顯示的是 RPC 報(bào)頭數(shù)據(jù)。
清單 4. RPC 報(bào)頭數(shù)據(jù)
| 1 2 3 4 5 6 7 8 9 10 | RPC:? ----- SUN RPC Header ----- RPC:? RPC:? Record Mark: last fragment, length = 168 RPC:? Transaction id = 3041181596 RPC:? Type = 1 (Reply) RPC:? This is a reply to frame 63 RPC:? Status = 0 (Accepted) RPC:? Verifier?? : Flavor = 0 (None), len = 0 bytes RPC:? Accept status = 0 (Success) RPC: |
最后,清單 5?提供了 NFS 數(shù)據(jù)包內(nèi)容,包括權(quán)限(文件模式)、文件大小、擁有者和其他信息。在這里,這個(gè) NFS 操作請(qǐng)求是進(jìn)行文件系統(tǒng)統(tǒng)計(jì)(這等同于 ls 操作結(jié)果),因此這就是詳細(xì)信息。
清單 5. NFS 數(shù)據(jù)包內(nèi)容
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | NFS:? ----- Sun NFS ----- NFS:? NFS:? Proc = 18 (Get filesystem statistics) NFS:? Status = 0 (OK) NFS:? Post-operation attributes: NFS:??? File type = 2 (Directory) NFS:??? Mode = 0777 NFS:???? Setuid = 0, Setgid = 0, Sticky = 0 NFS:???? Owner's permissions = rwx NFS:???? Group's permissions = rwx NFS:???? Other's permissions = rwx NFS:??? Link count = 24, User ID = 502, Group ID = 10 NFS:??? File size = 29, Used = 2560 NFS:??? Special: Major = 4294967295, Minor = 4294967295 NFS:??? File system id = 781684113418, File id = 4304616 NFS:??? Last access time????? = 28-Feb-10 15:49:51.042953989 GMT NFS:??? Modification time???? = 25-Feb-10 09:39:07.965422590 GMT NFS:??? Attribute change time = 25-Feb-10 09:39:07.965422590 GMT NFS:? NFS:? Total space = 759567510016 bytes NFS:? Available space = 659048374272 bytes NFS:? Available space - this user = 659048374272 bytes NFS:? Total file slots = 1288161604 NFS:? Available file slots = 1287203856 NFS:? Available file slots - this user = 1287203856 NFS:? Invariant time = 0 sec NFS: |
在這里,我們可以看到所查詢的文件事實(shí)上是一個(gè)目錄(見(jiàn)文件類型行)。雖然我們沒(méi)有得到文件的實(shí)際路徑,但是我們可以通過(guò)使用 Find 命令來(lái)查詢 inode 號(hào)對(duì)應(yīng)的文件/路徑來(lái)查找上面提到的目錄(見(jiàn)?清單 6)。
清單 6. 查詢 inode 號(hào)對(duì)應(yīng)的文件
| 1 2 | $ find /scratch -xdev -inum 4304616 /scratch/installed/mysql-6.0.11 |
如果您準(zhǔn)備分辨流量,那么使用這些工具的最佳方法是首先運(yùn)行它們,收集盡可能多的數(shù)據(jù),然后手動(dòng)檢查數(shù)據(jù)內(nèi)容,找出您的網(wǎng)絡(luò)本來(lái)不應(yīng)該出現(xiàn)的數(shù)據(jù)項(xiàng)。
一旦您識(shí)別出了可疑流量,您就可以開(kāi)始在命令行上添加參數(shù)以便關(guān)注于流量細(xì)節(jié)。例如,您可以使用?清單 7?所示的命令之一,規(guī)定只顯示特定主機(jī)的流量。
清單 7. 規(guī)定只顯示一個(gè)特定主機(jī)的流量
| 1 2 | $ snoop host 192.168.0.2 $ tcpdump host 192.168.0.2 |
要進(jìn)一步限制,您可以限制協(xié)議信息的端口:$ snoop host 192.168.0.2 and port 25。
解析原始數(shù)據(jù)以理解數(shù)據(jù)包內(nèi)容
處理來(lái)自 tcpdump 的另一個(gè)方法是將原始網(wǎng)絡(luò)數(shù)據(jù)包數(shù)據(jù)保存到一個(gè)文件中,然后處理這個(gè)文件以便查找和解碼出您想要的信息。
有許多使用不同語(yǔ)言編寫的模塊具有讀取和解碼 tcpdump 和 snoop 捕捉的數(shù)據(jù)的功能。例如,有兩個(gè)用 Perl 編寫的模塊:Net::SnoopLog(針對(duì) snoop)和 Net::TcpDumpLog(針對(duì) tcpdump)。它們將讀取原始數(shù)據(jù)內(nèi)容。這些模塊的基本接口是相同的。
要開(kāi)始處理,您首先需要使用 snoop 或 tcpdump 將數(shù)據(jù)寫到一個(gè)文件,而創(chuàng)建一個(gè)通過(guò)網(wǎng)絡(luò)的數(shù)據(jù)包的二進(jìn)制記錄。對(duì)于本例,我們將使用 tcpdump 和 Net::TcpDumpLog 模塊:$ tcpdump -w packets.raw。
收集網(wǎng)絡(luò)數(shù)據(jù)完成后,您就可以開(kāi)始處理網(wǎng)絡(luò)數(shù)據(jù)內(nèi)容以查找您想要的信息。Net::TcpDumpLog 會(huì)解析 tcpdump 所保存的原始網(wǎng)絡(luò)數(shù)據(jù)。因?yàn)檫@些數(shù)據(jù)是以原始的二進(jìn)制格式保存的,解析這些信息就需要處理這個(gè)二進(jìn)制數(shù)據(jù)。為了方便起見(jiàn),您可以使用另一組模塊 NetPacket::* 來(lái)解碼原始數(shù)據(jù)。
例如,清單 8?顯示的是一個(gè)打印所有數(shù)據(jù)包的 IP 地址信息的簡(jiǎn)單腳本。
清單 8. 打印所有數(shù)據(jù)包的 IP 地址的簡(jiǎn)單腳本
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | use Net::TcpDumpLog; ????? use NetPacket::Ethernet; ????? use NetPacket::IP; ????? my $log = Net::TcpDumpLog->new(); ?? $log->read("packets.raw"); ?? ?? foreach my $index ($log->indexes) ???????? { ????? ????my $packet = $log->data($index); ???????????? ????my $ethernet = NetPacket::Ethernet->decode($packet); ??? ????if ($ethernet->{type} == 0x0800) ???????? ????{ ????? ????????my $ip = NetPacket::IP->decode($ethernet->{data}); ??????????? ????? ????????printf("? %s to %s protocol %s \n", ???????????????$ip->{src_ip},$ip->{dest_ip},$ip->{proto}); ???} } |
第一部分是提取每一個(gè)數(shù)據(jù)包。Net::TcpDumpLog?模塊會(huì)將每一個(gè)數(shù)據(jù)包序列化,這樣我們就能夠通過(guò)數(shù)據(jù)包 ID 讀取每一個(gè)數(shù)據(jù)包。然后?data()?函數(shù)就會(huì)返回整個(gè)數(shù)據(jù)包的原始數(shù)據(jù)。
通過(guò) snoop 的輸出,我們必須從原始網(wǎng)絡(luò)數(shù)據(jù)包信息中提取每一個(gè)數(shù)據(jù)塊。所以在本例中,我們首先需要從原始網(wǎng)絡(luò)數(shù)據(jù)包中提取 Ethernet 數(shù)據(jù)包,包括數(shù)據(jù)有效負(fù)載。而?NetPacket::Ethernet?模塊能夠幫我們執(zhí)行這個(gè)操作。
因?yàn)槲覀儗ふ业氖?IP 數(shù)據(jù)包,所以我們能通過(guò)檢查 Ethernet 數(shù)據(jù)包類型來(lái)檢查 IP 數(shù)據(jù)包。IP 數(shù)據(jù)包的 ID 為 0x0800。
然后,NetPacket::IP?模塊會(huì)被用于從 Ethernet 數(shù)據(jù)包的數(shù)據(jù)負(fù)載中提取出 IP 信息。這個(gè)模塊能提供來(lái)源 IP、目標(biāo) IP 和協(xié)議信息等等,然后我們可以打印出這些信息。
通過(guò)使用這個(gè)基本的框架,您就能夠執(zhí)行不依賴于 tcpdump 或 snoop 的自動(dòng)化解決方案的更復(fù)雜查詢和解碼。例如,如果您懷疑 HTTP 流量是通過(guò)一個(gè)非標(biāo)準(zhǔn)端口傳輸?shù)?#xff08;如,不是端口 80),那么您可以使用?清單 9?中的腳本在懷疑的主機(jī) IP 的非 80 端口上檢查 HTTP 數(shù)據(jù)包。
清單 9. 在非 80 端口上檢查 HTTP 數(shù)據(jù)包
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | use Net::TcpDumpLog; ????? use NetPacket::Ethernet; ????? use NetPacket::IP; ????? use NetPacket::TCP; ????? ????? my $log = Net::TcpDumpLog->new(); ???????? $log->read("packets.raw"); ???????? ????? foreach my $index ($log->indexes) ???????? { ????? ????my $packet = $log->data($index); ???????? ????? ????my $ethernet = NetPacket::Ethernet->decode($packet); ???????? ????? ????if ($ethernet->{type} == 0x0800) ???????? ????{ ????? ????????my $ip = NetPacket::IP->decode($ethernet->{data}); ??????????? ????? ????????if ($ip->{src_ip} eq '192.168.0.2') ???????? ????????{ ????? ????????????if ($ip->{proto} == 6) ???????? ????????????{ ????? ????????????????my $tcp = NetPacket::TCP->decode($ip->{data}); ???????? ????????????????if (($tcp->{src_port} != 80) && ???????????????? ????????????????????($tcp->{data} =~ m/HTTP/)) ???????? ????????????????{ ????? ????????????????????print("Found HTTP traffic on non-port 80\n"); ????? ????????????????????printf("%s (port: %d) to %s (port: %d)\n%s\n", ????? ???????????????????????????$ip->{src_ip}, ???????? ???????????????????????????$tcp->{src_port}, ???????? ???????????????????????????$ip->{dest_ip}, ???????? ???????????????????????????$tcp->{dest_port}, ???????? ???????????????????????????$tcp->{data}); ?? ????????????????} ????? ????????????} ????? ????????} ????? ???} ????? } |
在一個(gè)示例數(shù)據(jù)包集上運(yùn)行上面的腳本會(huì)返回如?清單 10?所示的結(jié)果。
清單 10. 在一個(gè)示例數(shù)據(jù)包集上運(yùn)行這個(gè)腳本
| 1 2 3 4 5 6 7 | $ perl http-non80.pl Found HTTP traffic on non-port 80 192.168.0.2 (port: 39280) to 168.143.162.100 (port: 80) GET /statuses/user_timeline.json HTTP/1.1 Found HTTP traffic on non-port 80 192.168.0.2 (port: 39282) to 168.143.162.100 (port: 80) GET /statuses/friends_timeline.json HTTP/1 |
在這種特定的情況下,我們發(fā)現(xiàn)主機(jī)的流量是通向一個(gè)外部網(wǎng)站(Twitter)。
顯然,在這個(gè)例子中我們處理的是原始數(shù)據(jù),但是您可以使用相同的基本結(jié)構(gòu)進(jìn)行解碼,也可以使用任何公開(kāi)或私有協(xié)議結(jié)構(gòu)的格式的數(shù)據(jù)。如果您正在使用這個(gè)方法使用或開(kāi)發(fā)一個(gè)協(xié)議,并且您知道協(xié)議格式,您就能夠提取和監(jiān)控正在傳輸?shù)臄?shù)據(jù)。
使用一個(gè)協(xié)議分析器
雖然,正如之前提到的,諸如 tcpdump、iptrace 和 snoop 等工具都提供了基本的網(wǎng)絡(luò)分析和解碼功能,但是還有一些基于 GUI 的工具使這個(gè)過(guò)程更簡(jiǎn)單。Wireshark 就是其中一個(gè)工具,它支持大量的網(wǎng)絡(luò)協(xié)議解碼和分析。
Wireshark 的最主要優(yōu)點(diǎn)之一是您可以捕捉一段時(shí)間內(nèi)的數(shù)據(jù)包(如 tcpdump 一樣),然后基于不同的協(xié)議、端口和其他數(shù)據(jù)交互地分析和過(guò)濾內(nèi)容。Wireshark 也支持大量的協(xié)議解碼器,這使您能夠檢查每分鐘內(nèi)數(shù)據(jù)包和會(huì)話的詳細(xì)內(nèi)容。
您可以看到 Wireshark 的簡(jiǎn)單截圖顯示了所有類型的所有數(shù)據(jù)包,如?圖 1?所示。這個(gè)窗口分成三個(gè)主要部分:過(guò)濾的數(shù)據(jù)包列表、解碼的協(xié)議明細(xì)和 HEX/ASCII 格式的原始數(shù)據(jù)包數(shù)據(jù)。
圖 1. Wireshark 界面
作為 Wireshark 工具所提供的一個(gè)級(jí)別的信息和解碼的例子,在撰寫本文時(shí)我注意網(wǎng)絡(luò)中的一個(gè) MySQL 服務(wù)器返回了一些錯(cuò)誤數(shù)據(jù)包。
為了專注于內(nèi)容,我首先對(duì)輸出應(yīng)用了 MySQL 過(guò)濾。您可以通過(guò)在 Filter 輸入框中輸入一個(gè)表達(dá)式(類似于 tcpdump、snoop 或 iptract)。或者,您可以單擊 Expression 按鈕,然后從內(nèi)置的列表的中選擇一種過(guò)濾。您可以在?圖 2?中看到一組示例過(guò)濾。一旦您選擇了某個(gè)過(guò)濾,單擊 Apply 就可以過(guò)濾數(shù)據(jù)包列表。
圖 2. 選擇一個(gè) Wireshark 過(guò)濾
通過(guò)過(guò)濾 MySQL 協(xié)議,我能夠確定錯(cuò)誤的數(shù)據(jù)包。MySQL 協(xié)議會(huì)傳到一個(gè)帶有錯(cuò)誤信息的特殊數(shù)據(jù)包類型。在這里,錯(cuò)誤 1242 表示查詢操作失敗,由于子查詢有問(wèn)題。您可以通過(guò)展開(kāi) Wireshark 窗口的 MySQL 協(xié)議部分查看 MySQL 協(xié)議的內(nèi)容,如?圖 3?所示。
圖 3. 檢查一個(gè) MySQL 錯(cuò)誤數(shù)據(jù)包
在這里我們可以看到錯(cuò)誤的明細(xì)。通過(guò)跟蹤之前的 ‘Request Query’ 數(shù)據(jù)包,我們就可能確定出導(dǎo)致產(chǎn)生錯(cuò)誤響應(yīng)的查詢(圖 4)、
圖 4. 導(dǎo)致產(chǎn)生錯(cuò)誤響應(yīng)的 MySQL 查詢
通過(guò)分析數(shù)據(jù)包,我能夠識(shí)別之前并沒(méi)有注意的錯(cuò)誤代碼,并且能夠指出這個(gè)錯(cuò)誤及導(dǎo)致發(fā)生問(wèn)題的查詢。
Wireshark 支持廣泛的協(xié)議和過(guò)濾器,您可以用它們獲得詳細(xì)的信息。它的另一個(gè)常見(jiàn)用途是監(jiān)控詳細(xì)協(xié)議的確切內(nèi)容,如 Web 服務(wù)。圖 5?顯示了一個(gè)來(lái)自 SOAP 請(qǐng)求用于記錄狀態(tài)信息的詳細(xì)(且結(jié)構(gòu)清晰的)信息。
圖 5. 查看 SOAP Web 服務(wù)請(qǐng)求的詳細(xì)信息
這些詳細(xì)信息在調(diào)試您使用的任何網(wǎng)絡(luò)協(xié)議時(shí)是非常有用的。
Wireshark 的另一個(gè)有用的特性是它能夠處理即時(shí)信息,并且它能夠記錄信息以備將來(lái)過(guò)濾和處理。這表示您可以使用它監(jiān)控某個(gè)時(shí)期的可疑流量,然后您可以在恰當(dāng)?shù)臅r(shí)候分析這些信息,以查明您的網(wǎng)絡(luò)中發(fā)生了什么操作。
結(jié)束語(yǔ)
對(duì)于通過(guò)您的 UNIX 網(wǎng)絡(luò)的信息進(jìn)行協(xié)議分析可能是一個(gè)復(fù)雜的過(guò)程。但是,通過(guò)使用一些簡(jiǎn)單而廣泛使用的工具,您可以解碼和檢查您的流量的詳細(xì)信息,包括來(lái)源和目標(biāo)等基本信息,以及具體的協(xié)議和傳輸?shù)臄?shù)據(jù)。
如本文所述,通過(guò)使用諸如 tcpdump、snoop 或 iptrace 的工具,您可以在命令行上提取大量的數(shù)據(jù)。通過(guò)使用諸如 Wireshark 的工具,您可以更一地步地了解更大范圍的協(xié)議和內(nèi)容的更多詳細(xì)信息。對(duì)于自定義的協(xié)議和結(jié)構(gòu),您可以使用 Perl 提取原始數(shù)據(jù),并獲得您需要的所有信息。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/10660022.html
總結(jié)
以上是生活随笔為你收集整理的UNIX 网络协议的深度分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实时流处理框架Storm、Spark S
- 下一篇: DNS协议详解及报文格式分析