使用WinSock2 SPI進行網路控制訪問內容

2021-04-14 06:03:58 字數 3257 閱讀 1856

編者按:與傳統的包過濾防火牆技術不同,本文從應用層閘道器技術入手,深入**了利用winsock2 spi進行網路內容訪問控制的問題。這是網路安全的一項新內容,或者說,它為網路安全技術的愛好者和研發人員提供了乙個新的思路。

防火牆可以實施和執行網路訪問策略,但是,傳統的防火牆技術集中於如何防範外部網路對內部網路的網路和攻擊上,而對於如何控制內部使用者對外部網路的訪問問題研究不夠深入,相關的控制技術也不多。據權威資料顯示,全球現有大約25萬色情**,單純依靠傳統的包過濾等防火牆技術,勢必會嚴重影響網路效能。針對這一問題,我們從應用層閘道器技術入手,利用winsock2 spi技術,進行了研究和**。

winsock2 spi原理圖

winsock2 spi(service provider inte***ce)服務提供者介面建立在windows開放系統架構wosa(windows open system architecture)之上,是winsock系統元件提供的面向系統底層的程式設計介面。winsock系統組 件向上面向使用者應用程式提供乙個標準的api介面;向下在winsock元件和winsock服務提供者(比如tcp/ip協議棧)之間提供乙個標準的 spi介面。各種服務提供者是windows支援的dll,掛靠在winsock2 的ws2_32.dll模組下。對使用者應用程式使用的winsock2 api中定義的許多內部函式來說,這些服務提供者都提供了它們的對應的運作方式(例如api函式wsaconnect有相應的spi函式 wspconnect)。多數情況下,乙個應用程式在呼叫winsock2 api函式時,ws2_32.dll會呼叫相應的winsock2 spi函式,利用特定的服務提供者執行所請求的服務。

winsock2 spi允許開發兩類服務提供者——傳輸服務提供者和名字空間服務提供者。「傳輸提供者」(transport providers, 一般稱作協議堆疊,例如tcp/ip)能夠提供建立通訊、傳輸資料、日常資料流控制和錯誤控制等傳輸功能方面的服務。「名字空間提供者」(name space providers,例如dns名字解析服務)則把乙個網路協議的位址屬性和乙個或多個使用者友好名稱關聯到一起,以便啟用與應用無關的名字解析方案。

winsock2中使用的傳輸服務提供者有兩類:基礎服務提供者和分層服務提供者。基礎服務提供者執行網路傳輸協議(比如tcp/ip)的 具體細節,其中包括在網路上收發資料之類的核心網路協議功能。「分層式」(layered)服務提供者只負責執行高階的自定義通訊功能,並依靠下面的基礎 服務提供者,在網路上進行真正的資料交換。

為了進行內部使用者對外訪問控制,我們需要在現有的基礎提供者tcp/ip提供者上設立乙個分層式的url過濾管理者。通過url過濾管理者我們可以 截獲使用者請求的http資料報中的url位址,繼而可以通過高效的資料檢索演算法(如利用fibonacci雜湊函式的雜湊表),在訪問規則庫(被禁止訪問 的ip集合)中查詢指定的ip,根據結果拒絕或提供訪問服務。

傳輸服務提供者的安裝方式決定了它不僅是乙個分層提供者,還是乙個基礎服務提供者。winsock 2使用系統配 置資料庫配置傳輸服務提供者。配置資料庫讓winsock2得知服務提供者的存在,並定義了提供的服務型別。要在winsock2服務提供者資料庫內成功 安裝和管理服務提供者,需要四個函式:wscenumprotocols、wscinstallprovider、wscwriteprovider order、wscdeinstallprovider。這些函式利用wsaprotocol_infow結構,對服務提供者資料庫進行查詢和操作。要安 裝分層式服務提供者,需要建立兩個wspprotocol_infow目錄條目結構。乙個代表分層提供者(協議鏈長度等於0),另乙個將代表乙個協議鏈 (協議長度大於1),該協議鏈把分層提供者與乙個基礎服務提供者鏈結起來。應該使用現有服務提供者的wsaprotocol_infow目錄條目結構的屬 性來初始化這兩個結構。呼叫wscenumprotocols可以獲得已有的服務提供者的wsaprotocol_infow目錄條目結構。初始化之後, 首先需要使用wscinstallprovider來安裝我們的訪問控制分層服務提供者目錄條目,然後,利用wscenumprotocols列舉出所有 的目錄條目,獲得安裝之後為這個結構分配的目錄id。然後,用這個目錄條目來設定乙個協議鏈目錄條目,通過它,將我們的訪問控**務提供者和另乙個提供者 (tcp基礎提供者)鏈結起來。然後再次呼叫wscinstallprovider來安裝我們的分層鏈式服務提供者。

在用wscinstallprovider安裝乙個服務提供者時,目錄條目自動成為配置資料庫中的最後乙個條目。要實現訪問控制就必須使我 們的url過濾服務提供者成為預設的tcp/ip提供者,必須通過呼叫wscwriteproviderorder函式來完成此項工作,對資料庫中提供者 目錄條目進行重新排序,並把協議鏈目錄條目放在tcp/ip基礎提供者之前。

winsock2傳輸服務提供者隨標準的windows動態鏈結庫模組一起執行。我們必須在我們的服務提供者動態鏈結庫模組中匯入 dllmain函式,同時還必須匯入乙個名為wspstartup的單一函式條目。我們的url過濾服務提供者必須提供對wspstartup函式和其他 30個spi函式的支援。呼叫wsastartup期間,winsock根據wsasocket呼叫的位址家族、套接字型別和協議引數,來決定需要載入哪 個服務提供者。只有在乙個應用程式通過socket或wsasocket api呼叫建立乙個採用位址家族af_inet、套接字型別為sock_stream的套接字時,winsock才會搜尋並載入與之相應的、能夠提供 tcp/ip能力的傳輸服務提供者。wspstartup的引數upcalltable取得ws2_32.dll的spi函式派遣表,我們的訪問控制分層 服務提供者利用這些函式來管理自身和winsock2之間的i/o操作。

我們利用wspconnect函式來實現訪問控制功能。在使用者請求http服務時,需要首先建立與目標站點的連線,連線成功後,在此連線基 礎上傳送http請求資料報。使用者應用程式呼叫connect或wsaconnect函式建立連線時,spi會呼叫對應的wspconnect函式: int wspapi wspconnect(...,const struct sockaddr far *name,...,int far *lperrno)。在sockaddr型別的引數name中包含了使用者將要訪問的目標站點的ip位址資訊。我們將name引數傳遞到ip可訪問性判定例 程ipfilter。如果ipfilter函式返回代表授權訪問的結果,我們採用協議鏈命令路由,呼叫下一層的基礎服務提供者(tcp/ip)來完成連線 請求。如果ipfilter函式返回代表拒絕服務的結果,我們設定lperrno引數為相應的錯誤碼,然後返回,不進行協議鏈下一層服務提供者的呼叫,從 而實現訪問控制。

分層式服務提供者大大發揮了聯網服務的潛能,增強了winsock的應用,在我們的url過濾服務中發揮了巨大的作用,基本實現了對內部使用者訪問外部網路的訪問控制,為使用者提供了對網際網路的健康性的訪問服務。 

使用WinSock2 SPI進行網路控制訪問內容

使用winsock2 spi進行網路控制訪問內容 編者按 與傳統的包過濾防火牆技術不同,本文從應用層閘道器技術入手,深入 了利用winsock2 spi進行網路內容訪問控制的問題。這是網路安全的一項新內容,或者說,它為網路安全技術的愛好者和研發人員提供了乙個新的思路。防火牆可以實施和執行網路訪問策略...

日記 如何在MFC中使用Winsock2

目前使用的visual studio 6.0的mfc4.2使用的是winsock1.1,聽說mfc7.1中使用的也是。最近,為了使用wsaioctl,需要把使用winsock2,不過不能直接在專案中include winsock2.h,因為winsock2.h是winsock.h的乙個超集,直接新增...

I2C和SPI異同及使用注意

1 iic匯流排不是全雙工,2根線scl sda。spi匯流排實現全雙工,4根線sck cs mosi miso 2 iic匯流排是多主機匯流排,通過sda上的位址資訊來鎖定從裝置。spi匯流排只有乙個主裝置,主裝置通過cs片選來確定從裝置 3 iic匯流排傳輸速度在100kbps 4mbps。sp...