Linux 内核抓包功能实现基础(五) 常见问题解析
之前在部門產(chǎn)品上開發(fā)了內(nèi)核抓包模塊,基于openwrt平臺(tái),通過netfilter框架實(shí)現(xiàn)相關(guān)功能。核心功能就是在netfilter 的PRE_ROUTING 和 POST_ROUTING鏈上增加兩個(gè)鉤子函數(shù),實(shí)現(xiàn)對(duì)報(bào)文的匹配,復(fù)制和發(fā)送功能。功能已經(jīng)上線三個(gè)月,根據(jù)反饋結(jié)果來看,基本的抓包功能正常,不過也有幾個(gè)問題需要解決一下,之前陸陸續(xù)續(xù)寫了四篇博客介紹相關(guān)功能的開發(fā),在本篇就把產(chǎn)品實(shí)際應(yīng)用中遇到的問題說一下。
1. mac地址缺失問題。
抓包是要抓到報(bào)文的所有數(shù)據(jù),包括mac首部,ip首部,udp首部以及數(shù)據(jù)層。如果是進(jìn)入本機(jī)的報(bào)文,是含有mac地址的,但是對(duì)于本機(jī)出去的報(bào)文,在POST_ROUTING這個(gè)點(diǎn)上,是還沒有填充mac首部的,在第四篇中介紹了如何手動(dòng)查找鄰居緩存來填充mac地址,但是實(shí)際應(yīng)用中仍然會(huì)出現(xiàn)部分報(bào)文沒有mac地址,有時(shí)候看到這樣的報(bào)文還是挺困擾的。沒有查到鄰居緩存,一方面可能是真的還沒有鄰居緩存,另一方面可能是查找方式不對(duì),因?yàn)槿绻莢lan環(huán)境下,還真的查不到!我查找調(diào)用的接口是 ip_route_me_harder函數(shù)。在這種情況下,想了其它一個(gè)方法來work around。既然查找鄰居緩存找不到,那就自己建立一個(gè)mac緩存。方式就是當(dāng)抓包開啟的時(shí)候,在pre_routing鏈上對(duì)每一個(gè)報(bào)文記錄它的來源ip, 來源mac和目的ip,目的mac,然后建立一個(gè)鏈表來緩存,這樣當(dāng)在post_routing上抓包找不到mac的時(shí)候就根據(jù)目的地址查找mac緩存,地址匹配就可以了。實(shí)際測(cè)試功能正常。有一點(diǎn)值得注意,在mac緩存的時(shí)候千萬不要將廣播報(bào)文也緩存下來,這樣只會(huì)浪費(fèi)空間,因?yàn)閺V播報(bào)文mac地址已知沒必要記錄。
2. 報(bào)文發(fā)送帶來內(nèi)核奔潰問題
抓包的發(fā)送接口有兩個(gè),一個(gè)是ip_local_out,另一個(gè)是dev_queue_xmit,后一個(gè)接口需要手動(dòng)填充L2層首部,前不久測(cè)試發(fā)現(xiàn)一個(gè)問題,就是在調(diào)用dev_queue_xmit的時(shí)候,系統(tǒng)很容易重啟,根據(jù)重啟日志發(fā)現(xiàn)是內(nèi)核奔潰,且每次報(bào)的內(nèi)核錯(cuò)誤都不一樣,都是和dma相關(guān),和系統(tǒng)部的工程師討論了一下,發(fā)現(xiàn)是網(wǎng)卡驅(qū)動(dòng)處理大包異常導(dǎo)致,抓包的時(shí)候,如果是tcp報(bào)文,它的報(bào)文往往會(huì)超過mtu值,這樣的報(bào)文是無法在網(wǎng)絡(luò)上傳輸?shù)?#xff0c;需要分片。網(wǎng)卡有個(gè)TSO機(jī)制,就是專門利用硬件處理tcp分片。我們抓包的時(shí)候是封裝在udp里,網(wǎng)卡不支持udp封片,導(dǎo)致收到超大報(bào)文后系統(tǒng)不穩(wěn)定直接掛掉。后來的處理方式是在調(diào)用dev_queue_xmit前判斷報(bào)文大小,如果報(bào)文太大的話就調(diào)用系統(tǒng)接口ip_loca_out,讓協(xié)議棧來處理分片。
?
3. vlan報(bào)文
之前遇到一個(gè)問題,就是開啟抓包后服務(wù)器端沒收到報(bào)文,但是看log發(fā)現(xiàn)抓包模塊的確有發(fā)送出去。使用tcpdump抓包分析才知道在復(fù)制報(bào)文的時(shí)候連同原始報(bào)文vlan標(biāo)簽也復(fù)制過去,導(dǎo)致發(fā)出去的報(bào)文是vlan報(bào)文,這樣服務(wù)器肯定收不到,改了一下流程,抓包的時(shí)候手動(dòng)設(shè)置skb->vlan_tci?= 0;
?
總結(jié)
以上是生活随笔為你收集整理的Linux 内核抓包功能实现基础(五) 常见问题解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10转4股派20元是什么意思?
- 下一篇: Linux开发环境搭建一 ubuntu安