摘? 要: 在分析ipchains缺陷的基礎上,著重介紹了Linux2.4版內核防火墻netfilter的結構框架、數(shù)據(jù)包的處理過程及配置工具iptables,并給出在Linux環(huán)境下使用iptables構建防火墻的實例。
關鍵詞: 防火墻? Linux? netfilter
?
近年來,Linux作為高性能的網(wǎng)絡操作系統(tǒng)得到了迅速發(fā)展,而Linux內核中所內嵌的防火墻起著重要作用。在Linux1.1版中使用的防火墻是從BSD UNIX中移植過來的ipfw;在Linux2.0版中則為ipfwadm;在Linux2.2版中為ipchains;而在新的2.4版中則是netfilter。
1?ipchains的缺陷
Linux2.2版內核防火墻ipchains提供了基本的防火墻功能(如包過濾、地址偽裝、透明代理等),得到廣泛的應用。但是,ipchains也存在如下問題。
(1)ipchains處理數(shù)據(jù)包的方式復雜(如IP偽裝和NAT)。NAT和ipchains是作為2個獨立的Linux項目各自開發(fā)的,后來才結合在一起使用,二者配合使用比較復雜。
(2)輸入鏈描述整個進入IP層的規(guī)則,它不區(qū)分數(shù)據(jù)包是以該主機為目的地還是通過該主機中轉,混淆了input鏈和forward鏈。forward鏈只負責處理中轉的數(shù)據(jù)包,但它總跟在input鏈的后面。要區(qū)別進入的數(shù)據(jù)包和中轉的數(shù)據(jù)包,就必須編寫復雜的規(guī)則,效率就會下降。forward鏈和output鏈之間也存在同樣的問題。
(3)ipchains沒有提供傳遞數(shù)據(jù)包到用戶空間的接口,任何對數(shù)據(jù)包進行處理的代碼都必須在內核空間運行,而內核編程復雜,對內核的穩(wěn)定性構成威脅。
(4)透明代理實現(xiàn)復雜,必須查看每個數(shù)據(jù)包判斷是否有專門處理該地址的Socket。
(5)ipchains沒有采用開放型結構,用戶不能直接擴展ipchains的功能。
為了解決這些問題,用戶需要一個開放的、擴展性好的內核防火墻。Linux2.4版提供了netfilter內核防火墻,它采用更完善的框架結構,具有許多新功能,如完整的動態(tài)NAT、基于用戶和MAC地址的過濾、真正基于狀態(tài)的過濾等。netfilter還實現(xiàn)了擴展過濾規(guī)則而不必修改內核。
2?netfilter的工作原理
2.1 netfilter的框架結構
netfilter是Linux2.4內核中實現(xiàn)包過濾、NAT和包處理等的功能模塊,它已在IPv4、IPv6和DECnet等網(wǎng)絡協(xié)議棧中被實現(xiàn)。主要包括以下3部分。
(1)Hook函數(shù):netfilter為每種網(wǎng)絡協(xié)議(如IPv4、IPv6等)提供了一套Hook函數(shù),如IPv4就有5個Hook函數(shù)。每個Hook函數(shù)分別定義了數(shù)據(jù)包進入?yún)f(xié)議棧的檢查點,當數(shù)據(jù)包流過檢查點時,協(xié)議棧將數(shù)據(jù)包和相關的Hook函數(shù)的標號作為參數(shù)來調用netfilter框架。
(2)注冊:內核的任一模塊均可對每種協(xié)議的一個或多個Hook函數(shù)進行注冊,實現(xiàn)鏈接。當數(shù)據(jù)包通過netfilter時,netfilter檢查是否有模塊對該協(xié)議和Hook函數(shù)注冊,若已注冊,則將數(shù)據(jù)包傳給這些模塊處理。這些模塊就可以檢查、修改、丟棄或指示netfilter將該數(shù)據(jù)包傳送至用戶空間的隊列。
(3)用戶空間隊列:傳送至用戶空間隊列的數(shù)據(jù)包是異步處理的,隊列中的數(shù)據(jù)包通過Hook函數(shù)被發(fā)送到用戶空間,在用戶空間中用戶進程可以檢查、修改數(shù)據(jù)包,還可以將該數(shù)據(jù)包通過離開內核的同一Hook函數(shù)重新注入到內核中。這樣,內核中就沒有用戶自編的代碼,有利于內核的穩(wěn)定。
2.2 netfilter的數(shù)據(jù)包處理流程
與ipchains相比,netfilter區(qū)分了數(shù)據(jù)包的類型。netfilter的數(shù)據(jù)包處理過程如圖1所示。數(shù)據(jù)包進入netfilter后,首先進行校驗和、完整性檢查;然后通過路由,確定數(shù)據(jù)包的類型,否則將數(shù)據(jù)包傳給輸入鏈,如果目的地址不是本機,則將數(shù)據(jù)包傳給轉發(fā)鏈;本地進程產(chǎn)生的數(shù)據(jù)包只經(jīng)過輸出鏈,經(jīng)路由轉發(fā)出去。每條鏈中可設1條或數(shù)條規(guī)則。當一個數(shù)據(jù)包到達一條鏈時,系統(tǒng)會從第一條規(guī)則開始檢查。若符合規(guī)則,則按規(guī)則定義的方法處理;若不符合,則繼續(xù)檢查下一條規(guī)則。如果該數(shù)據(jù)包不符合該鏈中任何一條規(guī)則,系統(tǒng)則按該鏈預先定義的策略來處理。
?
?
下面以IPv4為例,說明數(shù)據(jù)包的處理流程及Hook函數(shù)在netfilter中的位置。在IPv4中Hook函數(shù)的位置如圖2所示。
?
?
5個Hook函數(shù)分別是:(1)Hook1,NF_IP_ROUTING。(2)Hook2,NF_IP_LOCAL_IN。(3)Hook3,NF_IP_FORWARD。(4)Hook4,NF_IP_POST_ROUNTING。
(5)Hook5,NF_IP_LOCAL_OUT。
當一個數(shù)據(jù)包進入netfilter時,首先由Hook1進行目的地址轉換;然后經(jīng)路由,將此數(shù)據(jù)包發(fā)往本機進程或轉發(fā)至其他主機。發(fā)往本機進程前,數(shù)據(jù)包要進入Hook2進行輸入包過濾;如果是轉發(fā)至其他主機,則數(shù)據(jù)包要進入Hook3進行轉發(fā)包過濾,再進入Hook4進行源地址轉換,最后發(fā)出本機;如果數(shù)據(jù)包由本地進程產(chǎn)生,則先進入Hook5進行輸出包過濾,然后經(jīng)路由進入Hook4。這5個Hook函數(shù)運行結束后,將返回以下4個結果之一:
(1)NF_DROP,丟棄此數(shù)據(jù)包。(2)NF_ACCEPT,允許此數(shù)據(jù)包繼續(xù)傳遞。(3)NF_STOLEN,Hook函數(shù)接收此數(shù)據(jù)包,不再繼續(xù)傳遞。(4)NF_QUEUE,將此數(shù)據(jù)包放入用戶空間隊列。
2.3 iptables的使用
??? iptables是用來配置netfilter過濾規(guī)則的工具。在使用iptable命令之前必須加載netfilter內核模塊,最簡單的方法是使用mod probe命令:mod probe ip_tables。
利用iptables可以實現(xiàn)數(shù)據(jù)包過濾(Filter表)、數(shù)據(jù)包處理(Mangle表)和網(wǎng)絡地址轉換(NAT表)功能。內核模塊可注冊一個新的規(guī)則表(table),并規(guī)定數(shù)據(jù)包經(jīng)過指定的規(guī)則表,以實現(xiàn)用戶所需的功能。iptables通過插入、刪除和修改規(guī)則鏈中的規(guī)則,可以對所有的IP表進行處理,包括Filter表、Mangle表和NAT表等。它支持插件以匹配新的參數(shù)和目標動作。因此對netfilter的擴展就很簡單,僅需編寫一個完成目標動作的處理模塊和iptables插件(動態(tài)鏈接庫)。以上3種數(shù)據(jù)包的處理功能都是基于netfilter的Hook函數(shù)和IP表,它們是相互獨立的模塊,都被集成到netfilter提供的框架內。
iptables命令基本包括以下5部分:(1)工作在哪個表上(Filter、Mangle、NAT)。(2)使用該表的哪條鏈(input、output、forward)。(3)進行的操作(插入、添加、刪除、修改)。(4)對特定規(guī)則的目標動作。(5)匹配數(shù)據(jù)包的條件。
3?應用舉例
使用iptables工具建立一個簡單的包過濾防火墻。
3.1 物理結構
防火墻主機采用雙宿主機形式,eth0為外部網(wǎng)絡接口,eth1為內部網(wǎng)絡接口,主機操作系統(tǒng)采用RedHat7.1(Linux2.4內核)。防火墻要求:允許內部主機瀏覽外部網(wǎng)頁;允許外部主機瀏覽內部Web服務器;可以阻攔某些非法攻擊?,F(xiàn)假設內部網(wǎng)絡IP為202.206.230.00~25;Web服務器地址為202.206.230.75:80;DNS服務器地址為212.112.20.132。
3.2 防火墻的配置
3.2.1 系統(tǒng)設置
以root用戶身份登錄,在/etc/rc.d/目錄下創(chuàng)建rc.firewall文件,執(zhí)行命令“chmod 700 rc.firewall”。更改文件屬性,防止其他用戶對其訪問。再編輯/etc/rc.d/rc.local文件,在末尾加上sh/etc/rc.d/rc.firewall,這樣在開機時能自動執(zhí)行該腳本。
3.2.2 配置步驟
(1)清除所有鏈的規(guī)則
# !/bin/sh
/sbin/iptables-F
(2)設置防火墻默認規(guī)則
默認規(guī)則就是當數(shù)據(jù)包不匹配鏈上的任何規(guī)則時所采取的策略,此處采用禁止一切的默認策略,即:如果某個數(shù)據(jù)包沒有規(guī)則與之匹配,則該數(shù)據(jù)包將被禁止。
/sbin/iptables-P INPUT DROP
/sbin/iptables-P OUTPUT DROP
/sbin/iptables-P FORWARD DROP
(3)設置服務器的包過濾規(guī)則
由于服務器/客戶機是雙向交互的,所以既要設置數(shù)據(jù)包出去的規(guī)則,又要設置數(shù)據(jù)包進來的規(guī)則。
①允許對內部網(wǎng)服務器訪問。下面的一條規(guī)則是指:允許目的地址是內部網(wǎng)Web服務器且采用TCP協(xié)議的數(shù)據(jù)包通過。
/sbin/iptables-A FORWARD-p tcp - d
202.206.230.75 - -dport 80-i eth0- j ACCEPT
/sbin/iptables-A FORWARD-p tcp - s
202.206.230.75 - -sport80-o eth0- j ACCEPT
②允許域名解析。對外部網(wǎng)服務器訪問應先開放域名解析服務。域名服務器的端口為53,該規(guī)則是:允許目的地址是DNS服務器且采用UDP協(xié)議的數(shù)據(jù)包通過。
/sbin/iptables-A FOREARD-p udp- -dport 53 - d
212.112.20.132 - o eth0-j ACCEPT
/sbin/iptables-A FORWARD-p udp- -sport53 - s
212.112.20.132 - i eth0- j ACCEPT
?、墼试S對外部網(wǎng)服務器訪問。該規(guī)則是:允許目的端口為80、采用TCP協(xié)議,來自內部網(wǎng)地址的數(shù)據(jù)包通過。
/sbin/iptables-A FORWARD-p tcp-s 202.206.230.00
/25- -dport 80- o eth0-j ACCEPT
/sbin/iptables-A FORWARD-p tcp- d 202.206.230.00
/25 - -sport 80 -i eth0-j ACCEPT
(4)阻攔非法攻擊
?、俜乐笽P碎片攻擊:接收所有的IP碎片,但對單位時間內通過的IP碎片數(shù)量進行限制,只允許每秒通過100個IP碎片。
/sbin/iptables-A FORWARD-f-m limit- -limit
100/s- -limit-burst 100-j ACCEPT
?、诜乐筽ing攻擊:ping是基于ICMP協(xié)議的一個常用網(wǎng)絡工具,但黑客常常利用它進行攻擊(如Ping Flooding、Ping of death等),所以必須對它的使用加以限制。允許每秒通過一個ICMP包,默認觸發(fā)條件是5個包。
/sbin/iptables-A FORWARD-p icmp-m limit- -limit1/s - j ACCEPT
通過以上的步驟,可以建立一個較完整的防火墻。只對外開放有限的端口,同時又允許用戶進行網(wǎng)絡訪問,并且還可以阻攔一些非法攻擊。在此基礎上,讀者還可以根據(jù)需要對防火墻進行其他設置,如開放FTP服務和電子郵件服務等。
4? 結束語
netfilter是目前Linux各版本中較完善和強大的防火墻子系統(tǒng),而且它兼容以前的ipfwadm和ipchains,并針對舊版本存在的缺陷進行了改進,使之更簡便、易用。由于Linux的高效、免費的特點,其在服務器領域得到越來越廣泛的應用。因此Linux防火墻子系統(tǒng)netfilter作為一種實現(xiàn)網(wǎng)絡安全的手段,也得到了廣泛的應用。
?
參考文獻
1? Ziegler R.Linux防火墻.北京:人民郵電出版社,2000
2? Rodrigues C.Introduce to Netfilter.http://www.gis.net/~craigr/netfilter,2001
3? Satchell S T,Clifford H B.Linux IP協(xié)議棧源代碼分析.北京:機械工業(yè)出版社,2000
4? Bandel D A.Linux安全開發(fā)工具.北京:電子工業(yè)出版社,2000