linux下抓包實現原理

2021-07-02 04:06:53 字數 3038 閱讀 5619

一、tcpdump

對於本機中程序的系統行為呼叫跟蹤,strace是乙個很好的工具,而在網路問題的除錯中,tcpdump應該說是乙個必不可少的工具,和大部分linux下優秀工具一樣,它的特點就是簡單而強大。

二、linux下抓包原理

linux下的抓包是通過註冊一種虛擬的底層網路協議來完成對網路報文(準確的說是網路裝置)訊息的處理權。當網絡卡接收到乙個網路報文之後,它會遍歷系統中所有已經註冊的網路協議,例如乙太網協議、x25協議處理模組來嘗試進行報文的解析處理,這一點和一些檔案系統的掛載相似,就是讓系統中所有的已經註冊的檔案系統來進行嘗試掛載,如果哪乙個認為自己可以處理,那麼就完成掛載。

當抓包模組把自己偽裝成乙個網路協議的時候,系統在收到報文的時候就會給這個偽協議一次機會,讓它來對網絡卡收到的報文進行一次處理,此時該模組就會趁機對報文進行窺探,也就是把這個報文完完整整的複製乙份,假裝是自己接收到的報文,匯報給抓包模組。

先看一下網路層對於接收到的報文的處理方法

static int process_backlog(struct net_device *backlog_dev, int *budget)---netif_receive_skb

list_for_each_entry_rcu(ptype, &

ptype_all, list)  }

三、協議族的註冊

對於這種協議,也只有在需要的時候才註冊,因為它畢竟增加了系統報文的處理速度並且會消耗大量的系統skb。當抓包開始的時候,它會建立乙個對應的網路套介面,這種套介面的型別就是af_packet型別。相關實現為

linux-2.6.21\net\packet\af_packet.c

static int packet_create(struct socket *sock, int protocol)

sk->sk_family = pf_packet;

po->num =

proto; ……

po->prot_hook.func = 

packet_rcv; ……

if (proto)

當乙個網絡卡上真正有報文到來的時候,它就會呼叫這裡註冊的packet_rcv函式 ……

res = 

run_filter(skb, sk, snaplen);

如果說filter過濾失敗,說明是抓包不關心的報文,直接放行,返回值非零表示不關心。

if (!res)

goto drop_n_restore; ……

if (skb_shared(skb))

kfree_skb(skb);

skb = nskb;  }

四、filter的執行

run_filter--->>sk_run_filter ……

for (pc = 0; pc < flen; pc++)

這個函式是執行了乙個自己定義的指令集和。使用者通過sockopt來註冊這段指令,核心在核心態執行這些指令,完成匹配,其中包含了報文某些欄位的載入,條件跳轉、加減乘除以及返回等指令。當轉包套介面接收到報文之後,對這個報文執行這段虛擬程式,直到遇到ret指令作為自己的返回值。通過tcpdump -d 可以顯示出編譯之後生成的指令,下面是乙個測試輸出

[root@harry bash-4.1]# tcpdump -d host 1.2.3.4

tcpdump: warning: eth0: no ipv4 address assigned

(000) ldh 

[12]

(001) jeq 

#0x800 

jt 2 

jf 6

(002) ld 

[26] 

載入接收到報文的第26個位元組開始的乙個int型別,

(003) 

jeq 

#0x1020304 

jt 12 

jf 4

如果和0x1234相等,跳轉到12跳指令,不等繼續第四條指令。 

(004) ld 

[30]

(005) jeq 

#0x1020304 

jt 12 

jf 13

(006) jeq 

#0x806 

jt 8 

jf 7

(007) jeq 

#0x8035 

jt 8 

jf 13

(008) ld 

[28]

(009) jeq 

#0x1020304 

jt 12 

jf 10

(010) ld 

[38]

(011) jeq 

#0x1020304 

jt 12 

jf 13

(012) ret 

#65535

(013) ret 

#0[root@harry bash-4.1]# 

五、tcpdump的處理

對於tcpdump來說,命令列輸入中除了選項之外的引數都將作為乙個語法檔案來處理。libcap中定義了自己的詞法分析器和語法分析器。其詞法分析器為scanner.l,語法分析檔案為scanner.l,可見該語言的定義使用了通用的bison和flex的幫助。但是如果使用了這些工具,就意味著乙個配置檔案就可以寫的很複雜,例如syslog-ng配置、ld連線配置指令碼、bash指令碼等各種語法。

這個語法檔案如果感興趣可以看看說明文件即可。

其中pcap庫中沒有對網絡卡的配置,而且tcpdump的命令處理對於-i是覆蓋的,所以一次tcpdump只能偵聽乙個埠。如果命令列沒有指定網路裝置,pcap會列舉系統中所有的網路裝置,然後取出第乙個裝置(這個順序在不通的系統有不同排列順序,看一下tcpdump的輸出即可確定是在那個埠)

六、本地報文處理

if (res.type == 

rtn_local)

struct net_device loopback_dev = {

.name 

= "lo",

linux下的抓包

1.檢視網絡卡名字 cat proc net dev 2.抓取外網進來的包 tcpdump i eth0 port 8081 s 4096 w 2.pcap 3.抓取自己伺服器上的兩個程式之間訪問的資料 換成 lo這個網絡卡 4.抓取http資料 tcpdump i lo a s 0 tcp por...

Linux下抓包並分析

1.首先獲取程序的pid 方法1 可以直接在系統監視器裡直接看到每個程序的pid 方法2 見這篇部落格 2.查到pid後使用netstat命令檢視該程序占用的埠 netstat nap grep pid 3.獲取到埠號後即可使用tcpdump命令抓包 1 抓包後直接在螢幕上顯示,如 tcpdump ...

linux下tcpdump的抓包

tcpdump中最常見的幾個引數 首先檢視網絡卡名稱 ifconfig 最常用的配置和檢視網路介面資訊的命令 i 指定要抓取資料報的網絡卡名稱 tcpdump i eth0 c 10 抓取eth0網絡卡的資料報 不設數量10,會一直監聽下去 w 把抓取到的資料存放到檔案中使用wireshark檢視,...