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