亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關注微信公眾號

利用WinSock2 SPI進行網絡內容訪問控制
2009-01-11   

編者按:與傳統的包過濾防火墻技術不同,本文從應用層網關技術入手,深入探討了利用WinSock2 SPI進行網絡內容訪問控制的問題。這是網絡安全的一項新內容,或者說,它為網絡安全技術的愛好者和研發人員提供了一個新的思路。
 
防火墻可以實施和執行網絡訪問策略,但是,傳統的防火墻技術集中于如何防范外部網絡對內部網絡的入侵和攻擊上,而對于如何控制內部用戶對外部網絡的訪問問題研究不夠深入,相關的控制技術也不多。據權威資料顯示,全球現有大約25萬色情網站,單純依靠傳統的包過濾等防火墻技術,勢必會嚴重影響網絡性能。針對這一問題,我們從應用層網關技術入手,利用WinSock2 SPI技術,進行了研究和探討。

Winsock2 SPI原理圖
Winsock2 SPI(Service Provider Interface)服務提供者接口建立在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過濾服務中發揮了巨大的作用,基本實現了對內部用戶訪問外部網絡的訪問控制,為用戶提供了對互聯網的健康性的訪問服務。(責任編輯:liucl)

熱詞搜索:

上一篇:路由器的安全與可靠的問題
下一篇:用訪問控制列表實現網絡單向訪問

分享到: 收藏