linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由
問題/發現:
本人在為一款路由器寫一個統計局域網互傳流量的Linux內核模塊的時候,發現如下問題:
局域網內的一臺設備和該局域網內另一臺設備進行通信時,我在路由器的netfilter鏈表處設下鉤子,以捕獲數據。后來發現這些數據沒有經過netfliter,而是直接投遞到對方網卡上的。
設備物理連接圖如下:
解釋:
看似 個人手機 和 個人PC 這兩臺設備交換數據時 數據包“經由”了路由器,實際上,數據包如下圖所示:
當設備 個人手機 想發送數據到 個人PC時,流程如下:
1. 個人手機 發送數據,數據無線傳輸到路由器 2.4GWiFi
2. 數據向 個人PC 和 路由器br0網卡 各投遞一份
3.1 路由器br0網卡 對比數據包MAC字段,發現該數據包不是發往自己的,丟棄
3.2 個人PC 收到數據包,對比數據包MAC字段,發現和自己MAC匹配,送往內部。
流程如上所述,而我在路由器netfilter鏈設下“埋伏”想捕獲數據的做法無異于海底撈月。
驗證:
抓包分析如下圖所示,個人手機 數據包目的地址直接是 個人PC 的MAC地址,而不是 路由器br0網卡 的MAC地址,所以在路由器端是捕獲不到這些數據包的。
==================================================================================
以下內容為arvik在本篇博客寫出幾日后追加
更改時間:2016/03/14
作者:arvik
最終解決:
經過幾日的思索,arvik最終一步步解決了問題。
解決思路:
局域網設備數據包互傳是不經過路由器的,那怎么才能統計這些流量呢? 由上面的解釋可知,數據包沒有進入路由器br0網卡,所以關鍵問題就是讓這些非本地的數據包能進入網卡。
實際上網卡是有這個功能的!
網卡一般有四種模式:
廣播方式:該模式下的網卡能夠接收網絡中的廣播信息。
組播方式:設置在該模式下的網卡能夠接收組播數據。
直接方式:在這種模式下,只有目的網卡才能接收該數據。
混雜模式:在這種模式下的網卡能夠接收一切通過它的數據,而不管該數據是否
是傳給它的。
將網卡設置為混雜模式即可,如下:
將eth0設置成混雜模式
ifconfig br0 promisc
取消混雜命令如下:
ifconfig br0 -promisc
此時,局域網所有數據包都能進入路由器br0網卡。但是我們在netfilter還是不能統計,需將這些數據包引入netfilter結構,此時就需要稍微更改Linux內核代碼了。更改如下:
在Linux內核源代碼 /net/ipv4/ip_input.c文件中,第383,384行左右,有如下代碼:
if (skb->pkt_type == PACKET_OTHERHOST)
goto drop;
注釋掉,如下:
//if (skb->pkt_type == PACKET_OTHERHOST) //noted by arvik 20160314// goto drop;
重新編譯即可。
此時需要注意了,大量的非本地的數據包也會流經路由器netfilter鏈,我們只是對這些做一些統計,記住:統計完一定要把這些非本地的數據包丟棄掉,否則會給整個系統增加額外的負擔,直接現象就是CPU占用率暴增,網絡卡頓!
且你的netfilter的鉤子函數一定要盡量靠前,最好在pre_routing節點,且優先級比其他鉤子函數優先級都要高,這樣才能盡量減少系統的的額外負擔。
在做完統計后做如下檢測:
if(skb->pkt_type == PACKET_OTHERHOST) //this packet is belong to other host, drop it!
return NF_DROP;
此時在路由器本地也可用netfilter鉤子統計局域網其他設備互訪的流量了! (^_^)
總結
以上是生活随笔為你收集整理的linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为团委出书写:《打造社团品牌:请给我一个
- 下一篇: linux下的c语言控制灯闪烁,C语言实