windows和linux的协议栈驱动
windows中沒有將loopback當成一個網卡來實現,而是直接在比較高的層次解決了對127.0.0.0網段的訪問,因此使用wiresharck是無法抓取這種loopback包的,pcap工作在非常低的層次,127.0.0.0網段的數據流是不會到這個層次的。因此你必須按照驅動或者自己寫一個驅動去將127.0.0.0網段的數據包抓取,已經比較好的實現有CommView,然而它需要安裝一大堆的驅動程序,而且沒有微軟徽標,很恐怖的,雖然它沒有公布驅動的源碼,然而很顯然,它在比較高的層次截取了127.0.0.0網段的數據流。
???? 本來想安裝microsoft的loopback adapter驅動程序,但是這個adapter還不能指定127.0.0.0網段的地址,只能指定一個別的地址,并且它還不會生成自動路由,也就是本網段的路由通過本adapter,還必須手工添加一條主機路由才能實現抓包,也就是自己到自己的路由:
route add 192.168.40.34 192.168.40.34 mask 255.255.255.255
如果沒有這條路由,那么它的行為和127.0.0.0網段的行為一樣,所不同的是,wiresharck認出了這個loopback網卡,然而還是不能抓取它上面的包,也不知道這個loopback adapter的作用到底是什么?資料上說是為了模擬出一個本地網卡來,可是為何不直接自帶一個呢?內置127.0.0.0網段的ip地址,就像linux那樣。在linux中所有源和目的地都是本地網卡或者127網段的數據都會通過lo這個虛擬網卡發送接收,而且它還能配置別的ip地址:
ifconfig lo 11.22.33.44 netmask 255.255.255.0
唯一覺得不妥的是即使是linux的lo也沒有辦法配置mac地址,不過這無所謂,問題不大,至少在lo上能抓到本地包可以分析,而在windows上卻只能安裝loopback adapter然后還要配置路由,可見如果不配置路由的話,雖然有了一個環回的網卡,數據還是下不去,可能是路由將數據給導入到這個loopback adapter的。
???? 影響linux協議棧數據流的方式有兩個,第一是通過netfilter的用戶態接口配置(有時候還要寫內核模塊),第二就是寫一個協議處理驅動注冊進內核,第一種方式更方便,不使用的時候直接在用戶態清除配置即可,比如iptables -F,而第二種方式只能卸載內核模塊了。然而不是每種需求都適合這兩種方式的,如果你想在5個HOOK點對數據進行影響,那么可以使用第一種方式,如果你想對一個新的協議進行處理,那么使用第二種方式,linux不允許對協議棧進行縱向插入hook,比如在ip層和tcp層中間加一個“過濾層”,linux只能根據數據包的內容進行橫向過濾,要么使用netfilter,要么注冊一個協議和既有協議平行,也就是說linux不運行增加協議棧的高度,然而卻可以增加每一層的寬度。
???? 對于windows而言,由于它的驅動實現方式本身就是分層的,協議棧實現也不例外,和linux正好相反,它在橫向擴展方面很吃力,雖然可以實現類似netfilter的機制,卻很少有人嘗試,這是由于windows的協議棧很容易在任何一個位置而不是僅有的幾個HOOK位置插入一個新的“層”來過濾數據包,ndis的驅動模型十分善于做這個,tdi之上的東西更善于,直到用戶態的lsp還在干這個。因此windows的數據過濾完全是縱向的,協議棧自然可以越來越高。因此在穩定性和配置的靈活性方面,windows遠遠不如linux,然而在windows上很少有人想做配置協議棧之類的工作。
???? 添加了loopback adapter之后,重啟機器,然后發現虛擬機突然就不通了,虛擬機中的網卡使用了bridge模式,不通的原因在于在虛擬機的網絡配置中勾選了“Automatically choose an available physical network adapter to bridge to VMnet0”,并且loopback adapter的本地連接屬性中又勾選了“VMware Bridge Protocol”,這樣由于loopback adapter已經被模擬成了physical network adapter,因此它接管了這個虛擬機的bridge的話,自然就和真實機器的物理網卡不通了,然而此時虛擬機里面卻能ping通外面的loopback adapter上的ip地址,實際上虛擬機的網卡bridge到這個loopback adapter了。解決辦法就是不勾選loopback adapter的bridge選項或者手工指定虛擬機網卡bridge到哪個網卡。由此引出了下面的關于vmnet的預研。
轉載于:https://blog.51cto.com/dog250/1271132
總結
以上是生活随笔為你收集整理的windows和linux的协议栈驱动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多核编程文章汇总[z]
- 下一篇: linux 其他常用命令