摘要:網絡的安全性日益重要,防火墻技術也越來越受到人們的關注。本文詳細介紹了防火墻的原理,討論了基于iptables/netfilter框架的Linux操作系統防火墻的實現,并結合具體情況說明了iptables命令的使用方法。
關鍵詞:防火墻;linux;iptables;netfilter
中圖法分類號:TP309文獻標識碼:A文章編號:1009-3044(2008)08-10ppp-0c
隨著網絡的開放性、共享性和互連程度擴大,特別是Internet的發展,網絡的重要性和對社會的影響也越來越大。隨著網絡上各種新興業務的興起,比如電子商務、電子現金、數字貨幣網絡銀行等,以及各種專用網的建設,比如金融網等,使得安全問題顯得越來越重要。因此網絡安全成了數據通信領域研究和發展的一個重要方向,對網絡安全技術的研究成了現在計算機和通信領域的一個熱點。而防火墻技術是針對網絡安全特點而建立的防范措施。而LINUX操作系統不僅具有開放源代碼的巨大優勢,而且能適用于多種CPU和硬件平臺,性能穩定,非常適合作為一些嵌入式防火墻設備的操作系統,因此,研究基于LINUX的防火墻技術具有重要的意義。
1 防火墻原理
1.1 防火墻的概念和工作原理
防火墻技術是目前各種網絡安全解決方案中常用的技術,它通過控制和檢測網絡之間的信息交換和訪問行為來實現對網絡的安全管理。防火墻技術作為目前用來實現網絡安全措施的一種主要手段,它主要是用來拒絕未經授權的用戶訪問,阻止未經授權的用戶存取敏感數據,同時允許合法用戶不受阻礙地訪問網絡資源,從總體上看,防火墻應具有以下五大基本功能:
過濾進出網絡的數據包。
管理進出網絡的訪問行為。
封堵某些禁止的訪問行為。
記錄通過防火墻的信息內容和活動。
對網絡攻擊進行檢測和告警。
為實現以上功能,在防火墻產品的開發中,人們要應用網絡拓撲技術、計算機操作系統技術、路由技術、加密技術、訪問控制技術、安全審計技術等成熟或先進的技術手段。其工作原理是:按照事先規定好的配置與規則,監測并過濾通過防火墻的數據流,只允許授權的或者符合規則的數據通過。防火墻應該能夠記錄有關連接的信息、服務器或主機間的數據流量以及任何試圖通過防火墻的非法訪問記錄。同時、防火墻自身也應具備較高的抗攻擊性能。
1.2 防火墻的分類
按照防火墻對內外來往數據的處理方法,大致可以將防火墻分為兩大體系:包過濾防火墻和代理防火墻(應用層網關防火墻)。前者以以色列的Checkpoint防火墻和Cisco公司的PIX防火墻為代表,后者以美國NAI公司的Gauntlet防火墻為代表。
表1 兩種防火墻的比較

包過濾防火墻分為靜態和動態。靜態包過濾防火墻根據定義好的過濾規則審查每個數據包。以便確定其是否與某一條包過濾規則匹配。過濾規則基于數據包的報頭信息進行制b},報頭信息中包括IP源地址、IP目標地址、傳輸協議(TCP, UDP, ICMP等等)、TCP/UDP目標端口, ICMP消息類型等,包過濾類型的防火墻要遵循的一條基本原則是“最小特權原則”,即明確允許那些管理員希望通過的數據包,禁止其他的數據包。動態包過濾防火墻采用動態設置包過濾規則的方法,避免了靜態包過濾所具有的問題。這種技術后來發展成為所謂包狀態監測技術。采用這種技術的防火墻對通過其建立的每一個連接都進行跟蹤,并且根據需要可動態地在過濾規則中增加或更新條目。
代理防火墻也叫應用層網關(Application Gateway)防火墻。這種防火墻通過一種代理(Proxy)技術參與到一個TCP連接的全過程。從內部發出的數據包經過這樣的防火墻處理后,就好像是源于防火墻外部網卡一樣,從而可以達到隱藏內部網結構的作用。這種類型的防火墻被網絡安全專家和媒體公認為是最安全的防火墻。代理類型防火墻的最突出的優點就是安全。由于每一個內外網絡之間的連接都要通過Proxy的介入和轉換,通過專門為特定的服務如Http編寫的安全化的應用程序進行處理,然后由防火墻本身提交請求和應答,沒有給內外網絡的計算機以任何直接會話的機會,從而避免了入侵者使用數據驅動類型的攻擊方式入侵內部網。
自適應代理技術(Adaptive proxy)是最近在商業應用防火墻中實現的一種革命性的技術。它可以結合代理類型防火墻的安全性和包過濾防火墻的高速度等優點,在毫不損失安全性的基礎之上將代理型防火墻的性能提高10倍以上。組成這種類型防火墻的基本要素有兩個:自適應代理服務器 (Adaptive Proxy Server)與動態包過濾器 (Dynamic Packet filter)。
在自適應代理與動態包過濾器之間存在一個控制通道。在對防火墻進行配置時,用戶僅僅將所需要的服務類型、安全級別等信息通過相應Proxy的管理界面進行設置就可以了。然后,自適應代理就可以根據用戶的配置信息,決定是使用代理服務從應用層代理請求還是從網絡層轉發包。如果是后者,它將動態地通知包過濾器增減過濾規則,滿足用戶對速度和安全性的雙重要求。
2 linux防火墻的實現
2.1 linux 防火墻簡介
Linux最初從2.0內核的ipfwadm開始具備了基本的包過濾功能。ipfwadm能透過IP據包頭的分析,分辨出數據包的來源IP與目的地IP、數據包類型、來源端口號與目的端口號、數據包流向、數據包進入防火墻的網卡界面等,并依此分析結果來對比規則進行數據包過濾,同時也支持IP偽裝的功能,利用這個功能可以解決IP不足的問題,但是這些程序缺乏彈性設計,用戶無法自行建立規則組合(rule set)作更精簡的設定,同時也缺乏網址轉換功能,無法應付越來越復雜的網絡環境,已經逐漸被淘汰。隨后取而代之的是ipchains。Ipchains不但指令語法更容易理解,功能也較ipfwadm優越:ipchain允許自訂規則組合(rule set),稱之為user-define chains,可以將彼此相關的規則組合在一起,在需要的時候跳到該組規則進行過濾,有效的將規則數量大幅縮減,克服了以往ipfw僅能進行循序過濾,導致規則過長的缺陷。同時,ipchains能提供網址轉換的能力,從而滿足NAT的完整需求,基本構成一套成熟的防火墻。,
在Linux2.4內核以后,被稱為iptables/netfilter的防火墻以更好的結構重新構造,并實現了許多新功能,如完整的動態NAT(2.2內核實際是多對一的\"地址偽裝\")、基于MAC及用戶的過濾、真正的基于狀態的過濾(不再是簡單的查看tcp的標志位等)、包速率限制等。它比以前任何一個Linux內核的防火墻子系統都要完善和強大。
2.2 iptables/netfilter框架
Netfilter提供了一個抽象的、通用的框架,該框架定義的一個子功能實現的就是包過濾子系統。Netfilter由一系列基于協議棧的鉤子組成,這些鉤子都對應某一具體的協議。當前的Netfilter,已經基于IPv4, IPX, IPv6等協議開發了對應的鉤子函數。
Netfilter是嵌入內核IP協議棧的一系列調用入口,設置在報文處理的路徑上。網絡報文按照來源和去向,可以分為三類:流入的、流經的和流出的。其中流入和流經的報文需要經過路由才能區分,而流經和流出的報文則需要經過投遞,此外,流經的報文還有一個FORWARD的過程,即從一個NIC轉到另一個NIC。 Netfilter就是根據網絡報文的流向,在以下幾個點插入處理過程:
(1)NF_IP_PRE_ROUTING,在報文作路由以前執行;
(2)NF_IP_FORWARD,在報文轉向另一個NIC以前執行;
(3)NF_IP_POST_ROUTING,在報文流出以前執行;
(4)NF_IP_LOCAL_IN,在流入本地的報文作路由以后執行;
(5)NF_IP_LOCAL_OUT,在本地報文做流出路由前執行。
Netfilter框架為多種協議提供了一套類似的鉤子(HOOK),用一個struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS]二維數組結構存儲,一維為協議族,二維為上面提到的各個調用入口。每個希望嵌入Netfilter中的模塊都可以為多個協議族的多個調用點注冊多個鉤子函數(HOOK ),這些鉤子函數將形成一條函數指針鏈,每次協議棧代碼執行到NF HOOK()函數時(有多個時機),都會依次啟動所有這些函數,處理參數所指定的協議棧內容。
每個注冊的鉤子函數經過處理后都將返回下列值之一,告知Neifilter核心代碼處理結果,以便對報文采取相應的動作:
(1)NF_ACCEPT, 繼續正常傳輸數據報;
(2)NF_DROP, 丟棄該數據報,不再傳輸;
(3)NF_STOLEN, 模塊接管該數據報,不要繼續傳輸該數據報;
(4)NF_QUEUE, 對該數據報進行排隊(通常用于將數據報給用戶空間的進程進行處理);
(5)NF_REPEAT, 再次調用該鉤子函數。
如圖1所示,數據報從左邊進入系統,進行IP校驗以后,數據報經過第一個鉤子函數NF_IP_PRE ROUTING進行處理;然后就進入路由代碼,其決定該數據包是需要轉發還是發給本機的;若該數據包是發被本機的,則該數據經過鉤子函數NF_IP_LOCAL_IN處理以后然后傳遞給上層協議;若該數據包應該被轉發則它被NF IP FORWARD處理;經過轉發的數據報經過最后一個鉤子函數NF_IP_POST_ROUTING處理以后,再傳輸到網絡上。本地產生的數據經過鉤子函數NF_IP_LOCAL_OUT處理可以后,進行路由選擇處理,然后經過NF_IP_POST_ROUTING處理以后發送到網絡接口。

Netfilter組件也稱為內核空間(kernel space),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
與之相對應的iptables組件是一種工具,也稱為用戶空間(user space),它使插入、修改和除去信息包過濾表中的規則變得容易。通過使用用戶空間,可以構建自己的定制規則,這些規則存儲在內核空間的信息包過濾表中。這些規則具有目標,它們告訴內核對來自某些源、前往某些目的地或具有某些協議類型的信息包做些什么。如果某個信息包與規則匹配,那么使用日標ACCEPT允許該信息包通過。還可以使用目標DROP或REJECT來阻塞并殺死信息包。
內核模塊提供三個規則表((table),分別是數據報過濾表(filter table),網絡地址轉換表(nat table)及數據報處理表(mangle table)。
數據報過濾表(filter table):
表格不會對數據報進行修改,而只對數據報進行過濾。iptables優于ipchains的一個方面就是它更為小巧和快速。它是通過鉤子函數NF_IP_LOCAL_IN,NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。因此對于任何一個數據報只有一個地方對其進行過濾。這相對ipchains來說是一個巨大的改進,因為在ipchains中一個被轉發的數據報會遍歷三條鏈。
網絡地址轉換表(nat table):
NAT表格監聽三個Netfilter鉤子函數:NF_IP_PRE_ROUTING,NF_IP_POST_ROUTING及NF_ IP_LOCAL_OUT。NF_IP_PRE_ROUTING實現對需要轉發的數據報的源地址進行地址轉換而NF_IP_POST_ROUTING則對需要轉發的數據包的目的地址進行地址轉換。對于本地數據報的目的地址的轉換則由NF_IP_LOCAL_OUT來實現。
NAT表格不同于filter表格,因為只有新連接的第一個數據報將遍歷表格,而隨后的數據報將根據第一個數據報的結果進行同樣的轉換處理。NAT表格被用在源NAT,目的NAT,偽裝(其是源NAT的一個特例)及透明代理(其實是目的NAT的一個特例)。
數據報處理表(mangle table):
mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT鉤子中進行注冊。使用
mangle表,可以實現對數據報的修改或給數據報附上一些帶外數據。當前mangle表支持修改TOS位及設置skb的nfmard字段。
3 iptables的命令配置與應用
Iptables的基本語法是:
iptables [-t table] command [match] [- j target/jump]
其中–t參數用來指定規則表,當未指定規則表時,則默認認為是filter
下面根據實例來詳細解釋下iptables的用法,配置防火墻的基本規則是先拒絕所有的服務,然后根據需要再添加新的規則。在實例中,我們開放了WEB服務器,郵件服務器,FTP服務器等常用的端口,在實際情況中可以根據特定的網絡狀況,特定的安全要求做特別的處理:
iptables –F#刪除已經存在的規則
iptables -P INPUT DROP#配置默認的拒絕規則。
iptables -A INPUT -p tcp --dport 80 -j ACCEPT#打開WEB服務端口的tcp協議
iptables -A INPUT -p tcp --dport 110 -j ACCEPT #打開POP3服務端口的tcp協議
iptables -A INPUT -p tcp --dport 25 -j ACCEPT#打開SMTP服務端口的tcp協議
iptables -A INPUT -p tcp --dport 21 -j ACCEPT#打開FTP服務端口的tcp協議
4 結論
Linux內核防火墻的iptables/netfilter框架設計得非常成功,它將所有對數據包的處理都統一到這個一個框架之下。Netfilter不僅僅有此高效的設計,同時還具備很大的靈活性,這主要表現在iptable/netfilter中的很多部分都是可擴充的,包括Table, Match, Target等。
參考文獻:
[1]毛德操,胡希明.Linux內核源代碼情景分析[M].浙江大學出版.2001,9.
[2]Marcus Goncalves.宋書民,等,譯.防火墻技術指南[M].機械工業出版社,2000,11.
[3]Robert L.Ziegler..余青霓,等,譯.LINUX防火墻[M].人民工業出版社,2000,10.
[4]博嘉科技主編.LINUX防火墻技術探秘[M].國防工業出版社,2002,10.
[5]Stephen T.Satchell,H.B.J Clifford.Linux.劉窿國,等,譯.IP協議棧源代碼分析[M].機械工業出版社,2000,11.
[6]賈明,嚴世賢.LINUX下的C編程[M].人民郵電出版社,2001,11.