Yahoo、eBay、CNN.com、Amazon、Buy.com和E*Trade等著名商業網站連續遭到駭客攻擊,造成了數以十億美元的損失,向世人再一次敲響了網路並不安全的警鐘。防火牆作為一種網路或系統之間強制實行存取控制的機制,是確保網路安全的重要手段。目前社會上各種商業產品的防火牆非常多,功能也大都很強。我們暫且不管這些防火牆產品的價格如何,由於它們在開發設計過程中注重的是產品的通用性、相容性,考慮更多的是市場和利潤,因此對於某些特殊的應用就不一定很合適。如果使用者能根據自己的實際需要,將防火牆設計的一般理論和方法與自己系統的具體實踐相結合,設計一些小而精、精而強的防火牆程式,則往往可以發揮出比花大價錢買來的通用型防火牆更好的作用。
由於篇幅所限,本文不可能對防火牆的一般理論和結構進行深入的討論,因此僅以Linux系統為例,具體說明防火牆程式的設計方法。
一、 從程式設計角度看Linux網路
編寫防火牆程式並不一定要求對Linux網路核心有多麼深刻的理解,只是需要明白在網路核心中有這樣一種機制,那就是核心可以自動調用使用者編寫的防火牆程式,並根據這個防火牆程式返回的結果來決定對網路收發資料報的處理策略。
二、 怎樣將自己編寫的防火牆程式登記到核心中
我們已經知道核心在網路層中自動調用使用者編寫的防火牆程式。但有一個前提條件就是使用者必須正確地將自己編寫的防火牆程式登記到核心中。
核心中提供了防火牆的登記和卸載函數,分別是register_firewall和unregister_firewall,參見firewall.c。
1、 register_firewall
函數原型如下:
int register_firewall(int pf,struct firewall_ops *fw)
傳回值:0代表成功,小於0表示不成功。
參數:
* 協議標誌pf,主要的取值及其代表的協議如下:
2代表Ipv4協議,4代表IPX協議,10代表Ipv6協議等。
* 參數結構fw定義如下:
struct firewall_ops{
struct firewall_ops *next;
int (*fw_forward)(struct firewall_ops *this, int pf,
struct device *dev, void *phdr, void *arg, struct sk_buff **pskb);
int (*fw_input)(struct firewall_ops *this, int pf,
struct device *dev, void *phdr, void *arg, struct sk_buff **pskb);
int (*fw_output)(struct firewall_ops *this, int pf,
struct device *dev, void *phdr, void *arg, struct sk_buff **pskb);