黃金春 梁爽
【摘 要】針對圖書館查詢機在使用過程中出現的普遍問題,結合廣西中醫藥大學圖書館工作人員的工作經驗和多次實驗嘗試,提出一種以自編防火墻程序為核心并結合Windows系統服務來實現系統保護、瀏覽器控制訪問等功能的解決方案,同時詳細闡述該解決方案設計過程中的各個關鍵步驟。
【關鍵詞】防火墻;查詢機;Windows服務
Design the Firewall to Control the Library Inquiry Machine
【Abstract】Library inquiry machine has its special use requirements and several common problems during normal use.Combining the staff experience of GuangXi University of Chinese Medicine Library and their experiments,In this paper, we proposed a new method to control the Library inquiry machine.This paper discusses every step in this design.
【Key words】Firewall; Library inquiry machine; Windows Servers
0 引言
圖書館查詢機是提供給讀者方便地檢索館藏資源、查看或辦理個人圖書借閱情況和續借手續等服務的工具,是圖書館日常活動中最常用的工具之一,并且其數量也隨著圖書館的擴大而增加。在其使用過程中,常常因為數量較大、分布較散、讀者使用中較為隨意、網絡設置較為簡單等原因,時常出現很多問題而損壞,給讀者日常使用和工作人員的維護造成了很大的困擾。
1 目前控制查詢機的常用方法
基于以上的原因,許多管理人員使用到了各種辦法來加強對查詢機的控制,同時又由于圖書館的OPAC系統在使用時用瀏覽器來操作,因此也使用各種辦法加強對瀏覽器的控制。從本質上來看這些控制分為兩大核心控制,一是對操作系統的控制,另一個是對網絡訪問的控制。
1.1 常用控制操作系統的方法
控制操作系統主要是對系統修改,刪除,格式化等破壞性操作進行控制。在控制上有多種方法,(1)通過配置計算機的組策略實現[1]。(2)通過第三方軟件如:360等機器管理軟件[2]。(3)使用無盤工作,使用還原卡,或者自動還原軟件等辦法[3]。這些方法雖然都可以控制系統,但也各有不足,如使用的是第三方軟件實現的辦法,在實際使用中發現許多第三方的軟件都附帶有其它程序,如各種廣告、彈窗等,使用起來不勝其煩。采用組策略的辦法配置較為麻煩,如配置錯誤還會出現其它問題,而采用還原卡的辦法會提高維護成本。因此都不是很好的辦法。
1.2 常用控制網絡訪問的方法
控制網絡訪問的辦法主要有,(1)通過劃分子網,交換機隔離的辦法在機器的ip地址做限制實現。(2)通過設置單計算機的“路由和遠程訪問”的辦法[4]。(3)利用webbrower控件自設計瀏覽器的辦法[5]。(4)使用第三方網絡管理軟件,如美萍電腦安全衛士或超級兔子實現的辦法[6]。這些方法有的需要硬件配合如方法1,有的因為第三方軟件附帶程序而出現其它問題,雖然自設計瀏覽器沒有附帶程序,但是因為使用的控件缺陷而出現功能不足,影響opac查詢系統的使用。
1.3 其他方法
使用影子系統[7]。是基于虛擬機原理的一種保護系統,它可以產生出一個和原來系統一模一樣的虛擬系統(影子),所有的操作都針對這個影子,不會對真實系統產生影響。該方法比較實用但是安裝起來較為麻煩。
2 自寫防火墻方法的原理
2.1 Filter-hook驅動技術
從Windows 2000開始微軟公司在操作系統里提供了一個可以進行ip數據包過濾的驅動就是IP過濾驅動,其對應即是ipfltdrv.sys文件。它擴展了IP過濾驅動(IP Filter Driver)的功能。Filter-Hook 驅動并不是網絡驅動,它是一種內核模式驅動(Kernel Mode Driver),它提供回調函數(callback)。這樣當數據包發送和接收時,允許用戶注冊自己的ip數據報處理函數(鉤子驅動程序)判斷ip數據包的處理方式[8]。為了說明是如何實現的過濾,先看下Windows下IP數據包發送過程,如圖1所示發送過程主要有3個步驟,
圖1 Windows下IP數據包發送過程
1)IP 數據包形成后,系統就會將其傳遞給防火墻掛鉤驅動程序 (Ipnat.sys) 進行處理。
2)系統將數據包傳遞給ip篩選器驅動程序 (Ipfltdrv.sys) 進行處理。
3)系統將該數據包傳遞給 Ipsec.sys 進行處理。
從該過程可以看出,數據包發送的第2步要通過ipfltdrv進行控制。編寫程序自定義過濾規則掛鉤在其上就可實現對ip數據包的過濾處理。
3 自寫防火墻方法的具體實現
3.1 設計鉤子驅動程序
鉤子驅動程序為系統程序,用C++開發,首先必須安裝與windows對應系統DDK開發工具包,然后選擇為標準的sys項目。一個鉤子驅動程序是按照PacketFilterExtensionPtr數據類型定義的函數,這個函數本質上是ip數據包過濾器驅動。然后在系統提供的IP過濾驅動程序(ipfltdry.sys)中注冊該函數的實體指針。當注冊成功后,ip數據包將會被IP過濾驅動程序發送給鉤子驅動程序來進行過濾檢查,以便決定怎樣進一步處理數據包。它的返回值有[8]:
(1)PF-FORWARD表示IP過濾器驅動立即把ip數據包轉發到IP協議棧中,如果該數據包是本機需要的數據包,IP協議將其轉發給上層協議處理,否則,如果路由功能被打開,IP將路由該數據包。
(2)PF-DROP表示IP過濾驅動將立刻向IP協議棧發出丟棄響應,IP協議將丟棄該ip數據包。
(3)PF-PASS表示IP過濾驅動處理該ip數據包,并將結果動作回復給IP協議棧。 IP過濾器驅動如何過濾數據包由它本身和包過濾API接口的設置方式來決定;如果過濾器鉤子認為自己不需要處理該數據包,而是讓IP過濾器驅動過濾包,則應該返回該PF-PASS。
設計該程序實質為設計兩大部分,一為設計按照PacketFilterExtensionPtr數據類型定義的函數,其說明如下:
Type PF_FORWARD_ACTION(*PacketFilterExtensionPtr)
(
usigned char *PacketHeader, //數據包頭指針
usigned char *Packet, //數據包緩沖區指針
usigned int PacketLength, //緩沖區長度
usigned int RecvInterfaceIndex,//接收數據包網卡序號
usigned int SebdInterfaceIndex,//發送數據包網卡序號
IPAddr RecvLinkNextHop, //多網卡使用
IPAddr SendLinkNextHop, //多網卡使用
);
通過如下類似代碼設計過濾函數
PF_FORWARD_ACTION FP(……)
{……
if(某個條件滿足){……
return PF-FORWARD
if() ……
return PF-DROP
if() ……
return PF-PASS
}
}
另一部分設計在系統提供的IP過濾驅動程序(ipfltdry.sys)中注冊該函數的函數指針。通過PF_SET_EXTENSION_HOOK_INFO結構完成,它的定義如下,其中包含回調函數的指針ExtensionPointer:
typedef struct _PF_SET_EXTENSION_HOOK_INFO
{
PacketFilterExtensionPtr ExtensionPointer;
}PF_SET_EXTENSION_HOOK_INFO,*PPF_SET_EXTENSION_
HOOK_INFO;
3.2 設置驅動的I/O命令
前面完成設計是系統程序,沒有控制界面,需要設計應用程序來完成控制。當應用程序要控制驅動程序去操作時,通過使用Windows API的 ioctl函數(ioctl是設備驅動程序中對設備的I/O通道進行管理的函數)來控制驅動的操作功能,并且它們之間的通訊是通過IRP(I/O request package是操作系統內核的一個數據結構)來完成,因此必須分兩步實現:
(1)先設定驅動程序的ioctl自定義操作命令,使用CTL_CODE宏來創建。函數原型如下:
#define CTL_CODE(DeviceType設備類型, Function功能, Method I/O訪問內存使用方式, Access訪問限制);
例如:
#define START_IP_HOOK CTL_CODE(0x3000, 0x900, METHOD_
BUFFERED, FILE_ANY_ACCESS)
(2)使用IoBuildDeviceIoControlRequest函數建立所需的IRP。然后應用程序及可對驅動程序進行控制。
3.3 控制網絡訪問的設置
設計好鉤子驅動程序后,還要設計具體的網絡訪問控制內容,即對數據包的控制內容,如協議號、ip地址、子網掩碼、端口號及對其的處理等等。為了方便操作,可設計一個結構來存儲這些內容。
如:struct IPFilter {
USHORT protocol; // 協議號
ULONG sourceIP; // 源IP地址
ULONG destinationIP; // 目標IP地址
ULONG sourceMask; // 源地址子網掩碼
ULONG destinationMask; // 目的地址子網掩碼
USHORT sourcePort; // 源端口號
USHORT destinationPort; // 目的端口號
BOOLEAN drop; // 包處理
};
如果有多個訪問控制那么就需要填寫多個結構,然后把這些結構串成一個鏈表。在系統工作時,對的數據包和此結構的匹配是從鏈表頭開始比較的。因此如何排列這些結構就非常重要了,正確做法是把允許通過的放在前面,最后一個是拒絕所有的數據包。在此以我校圖書館為例來說明,我校圖書館的查詢機要求可以訪問內網(172.16.0.0/16),還要求可以訪問學校主頁(210.36.99.12),除此之外均不能訪問。
1)允許內網段訪問
pf2.protocol = 6;