Linux網(wǎng)絡(luò)防火墻的實現(xiàn)并不難!
以下的文章描述的是正確實現(xiàn)Linux網(wǎng)絡(luò)防火墻,如果你對實現(xiàn)Linux網(wǎng)絡(luò)防火墻的技術(shù),心存好奇的話,以下的文章將會給你更為詳細(xì)的介紹。大家都知道防火墻作為一種網(wǎng)絡(luò)或是系統(tǒng)之間強制實行訪問控制的一種機(jī)制,是確保網(wǎng)絡(luò)安全的重要手段。
針對不同的需求和應(yīng)用環(huán)境,可以量身定制出不同的防火墻系統(tǒng)。
實現(xiàn)Linux網(wǎng)絡(luò)防火墻
防火墻作為一種網(wǎng)絡(luò)或系統(tǒng)之間強制實行訪問控制的機(jī)制,是確保網(wǎng)絡(luò)安全的重要手段。針對不同的需求和應(yīng)用環(huán)境,可以量身定制出不同的防火墻系統(tǒng)。
防火墻大到可由若干路由器和堡壘主機(jī)構(gòu)成,也可小到僅僅是網(wǎng)絡(luò)操作系統(tǒng)上一個防火墻軟件包所提供的包過濾功能。
在眾多網(wǎng)絡(luò)防火墻產(chǎn)品中,Linux操作系統(tǒng)上的防火墻軟件特點顯著。首先是Linux操作系統(tǒng)作為一個類Unix網(wǎng)絡(luò)操作系統(tǒng),在系統(tǒng)的穩(wěn)定性、健壯性及價格的低廉性方面都獨具優(yōu)勢。更為重要的是,Linux不但本身的源代碼完全開放,而且系統(tǒng)包含了建立Internet網(wǎng)絡(luò)環(huán)境所需要的所有服務(wù)軟件包,如ApacheWeb服務(wù)器、DNS服務(wù)器、Mail服務(wù)器、Database服務(wù)器等。同樣,基于Linux的防火墻軟件不但具有強大的功能,而且大部分都是開放軟件。
隨著Internet的飛速發(fā)展,安全問題越來越重要。利用Linux構(gòu)建企業(yè)網(wǎng)深受中小企業(yè)的青睞,而利用Linux構(gòu)建企業(yè)網(wǎng)的防火墻系統(tǒng)也成為眾多中小企業(yè)的理想選擇。
Linux內(nèi)核從1.1版本開始,就已經(jīng)具備包過濾功能。在2.0內(nèi)核中,開始采用Ipfwadm來操作內(nèi)核的包過濾規(guī)則。到2.2版本時,Linux內(nèi)核采用了Ipchains來控制內(nèi)核的包過濾規(guī)則。發(fā)展到2.4.x時,Ipchains被一個全新的包過濾管理工具Iptables所替代。新發(fā)布的 2.6版內(nèi)核也在安全方面進(jìn)行了改進(jìn)。因此,無論擁有哪個版本的Linux內(nèi)核,無論選擇哪個版本的Linux來構(gòu)建自己的企業(yè)網(wǎng),都可以利用現(xiàn)有的系統(tǒng)構(gòu)建出一個理想實用的防火墻。
防火墻系統(tǒng)可分為包過濾型、應(yīng)用級網(wǎng)關(guān)(也叫代理服務(wù)器型防火墻)和電路級網(wǎng)關(guān)三種基本類型。Linux提供的防火墻軟件包內(nèi)置于Linux內(nèi)核中,是一種基于包過濾型的防火墻實現(xiàn)技術(shù)。其中心思想是根據(jù)網(wǎng)絡(luò)層IP包頭中的源地址、目的地址及包類型等信息來控制包的流向。更徹底的過濾則是檢查包中的源端口、目的端口以及連接狀態(tài)等信息。
本文主要介紹Linux提供的IPFW、Ipchains、Iptables這三種非常實用的防火墻和具體實現(xiàn)。
IPFW防火墻
IPFW是比較老的Linux內(nèi)核版本提供的防火墻軟件包。該軟件包的全稱是Ipfwadm。Ipfwadm程序包提供了建立規(guī)則的能力,根據(jù)這些規(guī)則來確定允許什么樣的包進(jìn)出本網(wǎng)絡(luò)。簡單說來,防火墻就是一對開關(guān),一個開關(guān)允許包通過,另一個開關(guān)禁止包通過。現(xiàn)代防火墻系統(tǒng)一般都會附加審計跟蹤、加密認(rèn)證、地址偽裝和VPN等多種功能。作為一個安全開關(guān),防火墻可定義的安全策略有兩個:
(1)一切未被允許的都被禁止;
(2)一切未被禁止的都被允許。
顯然,策略1的安全性明顯高于策略2,但它是以犧牲靈活性和可訪問資源為代價來提高安全性的。Ipfwadm系統(tǒng)同樣提供IP封裝,它允許用戶使用Internet上的一個公共IP地址空間。
下面以Red Hat系統(tǒng)為例,說明Linux系統(tǒng)上IPFW防火墻的實現(xiàn)。
在Red Hat系統(tǒng)上(在其它系統(tǒng)上一樣)安裝Ipfwadm防火墻,需要以root用戶登錄,然后執(zhí)行如下命令:
#rpm -ivh /mnt/cdrom/RedHat/RPMS/ Ipfwadm-2.3.0-5.i386.rpm
在安裝好Ipfwadm后,就可以交互方式指定Ipfwadm的包過濾規(guī)則。過濾規(guī)則對每一個進(jìn)入系統(tǒng)的IP包進(jìn)行檢查,從而決定哪些包允許通過防火墻,哪些包則禁止通過。Ipfwadm命令的一般格式為:
/sbin/ ipfwadm category commands parameters [options]
Ipchains(IP鏈)和IP偽裝
在更新版本的Linux內(nèi)核中,Ipchains替代Ipfwadm,提供了更為嚴(yán)格的包過濾控制機(jī)制。Ipchains提供完整的防火墻功能,包括包過濾、地址偽裝、透明代理。
Linux 2.2內(nèi)核中提供的Ipchains,通過四類防火墻規(guī)則列表來提供防火墻規(guī)則控制,這些列表稱為防火墻鏈。它們分別是IP input鏈(IP輸入鏈)、IP output鏈(IP輸出鏈)、IP forward鏈(IP轉(zhuǎn)發(fā)鏈)和user defined鏈(用戶定義鏈)。一個鏈實際上就是一個規(guī)則表。所謂規(guī)則,即當(dāng)被檢測的包頭符合規(guī)則的定義時,就按預(yù)先的設(shè)定對該包進(jìn)行某種處理。輸入鏈?zhǔn)侵笇?nèi)連接請求的過濾規(guī)則;輸出鏈?zhǔn)菍ν膺B接請求的過濾規(guī)則;轉(zhuǎn)發(fā)鏈?zhǔn)菍?nèi)部與外部通信包轉(zhuǎn)發(fā)的過濾規(guī)則;用戶定義鏈?zhǔn)怯脩糇约憾x的規(guī)則。
當(dāng)一個數(shù)據(jù)包進(jìn)入Linux防火墻系統(tǒng)時,Linux內(nèi)核使用輸入鏈決定對這個包的操作;如果這個包不被丟棄,內(nèi)核則使用轉(zhuǎn)發(fā)鏈來決定是否將這個包轉(zhuǎn)發(fā)到某個出口;當(dāng)這個包到達(dá)一個出口被發(fā)出前,內(nèi)核使用輸出鏈最后確定是丟棄該包還是轉(zhuǎn)發(fā)該包。在上面的過程中,如果輸入鏈已經(jīng)決定處理這個包,則核心需要決定下一步包應(yīng)該發(fā)到什么地方,即進(jìn)行路由。假如此時該數(shù)據(jù)包是發(fā)到另一臺主機(jī)的,則核心就運用轉(zhuǎn)發(fā)鏈;如果沒找到匹配的設(shè)置,則這個包就需要進(jìn)入目標(biāo)值指定的下一條鏈,此時目標(biāo)值有可能是一條用戶自定義鏈,也有可能是一個特定的值。例如:
ACCEPT 允許通過。
DENY 直接丟棄。
REJECT 丟棄并通過ICMP回復(fù)通知發(fā)送者包被丟棄。
MASQ 通知核心將該包偽裝,該值只對轉(zhuǎn)發(fā)鏈和用戶自定義鏈起作用。
REDIRECT 通知核心將包改送到一個本地端口,該值只對輸入鏈和用戶自定義鏈起作用,并且只有UDP和TCP協(xié)議才可以使用該值。 RETURE 通知內(nèi)核將該包跳過所有的規(guī)則,直接到達(dá)所有鏈的鏈尾。
在Linux系統(tǒng)IP鏈的轉(zhuǎn)發(fā)鏈上可以配置IP偽裝。實際上,IP偽裝是一個比包過濾策略更安全的解決方案,它不僅能夠提供一種安全機(jī)制,還同時解決了 Internet中IP地址資源不足的問題。IP偽裝使一臺計算機(jī)在訪問Internet時,能夠?qū)⒈九_機(jī)器的真正IP地址偽裝成其它地址。如果連接到 Internet上的一臺主機(jī)具有IP偽裝功能,則這臺機(jī)器不管是通過局域網(wǎng),還是PPP撥號都可以與Internet連接。盡管在使用PPP時,這樣的主機(jī)根本沒有自己正式的IP地址。
這說明可以將一臺主機(jī)隱藏在一個網(wǎng)關(guān)后面來訪問Internet,使得這臺主機(jī)既實現(xiàn)了對Internet的訪問,又實現(xiàn)了其訪問對外界的不可見性(即隱藏性)。顯然,這種隱藏性使得系統(tǒng)非常安全,因為外界根本意識不到主機(jī)的存在,也就不可能對主機(jī)實施存取操作,更不能入侵和破解。通常情況下,使用IANA保留的私有地址來進(jìn)行偽裝。
在防火墻轉(zhuǎn)發(fā)鏈配置IP偽裝后,內(nèi)部網(wǎng)絡(luò)上的主機(jī)向Internet發(fā)送訪問IP包時,內(nèi)核將源IP地址換成網(wǎng)關(guān)的IP地址,并記錄被偽裝的IP地址后再轉(zhuǎn)發(fā)該IP包。當(dāng)這個包的Internet應(yīng)答包從Internet進(jìn)入網(wǎng)關(guān)時,內(nèi)核執(zhí)行去除IP偽裝的操作,即將目的地址替換成內(nèi)部地址。
通過適當(dāng)?shù)脑O(shè)置,IP偽裝可以在某個網(wǎng)段、某臺主機(jī)、某個接口、某個協(xié)議甚至是某個協(xié)議的某些端口上實現(xiàn),非常靈活。IP偽裝可以將內(nèi)部網(wǎng)絡(luò)的細(xì)節(jié)對外部網(wǎng)絡(luò)屏蔽掉,因此,IP偽裝提供了很好的安全性。
一般來說,安裝相應(yīng)版本的Linux系統(tǒng)時,系統(tǒng)會自動將Ipchains安裝上。如果系統(tǒng)沒有安裝IP鏈軟件包,可以通過光盤或從網(wǎng)上下載軟件包來安裝。
如果是rpm包,使用如下命令安裝:
#rpm -ivh *.rpm
如果是.tar.gz包,則先需要將壓縮包解壓:
#tar xvfz *.tar.gz
然后再到解壓后所在目錄執(zhí)行如下命令完成安裝:
#./configure
#make
#make install
這樣就將IP鏈Linux網(wǎng)絡(luò)防火墻成功安裝在系統(tǒng)中。成功安裝Ipchains后,接下來就是啟動并配置包過濾規(guī)則。啟用Ipchains需要完成如下操作:
手工修改/proc/sys/net/ipv4/ipforward文件,將其內(nèi)容置為1。
在/etc/rc.d/目錄下用touch命令建立rc.ipfwadm文件。
在/etc/rc.d目錄下的rc.local文件中加上下面這段代碼:
if [-f /etc/rc.ipfwadm];then /etc/rc.d/rc.ipfwadm;fi;
這使得以后所有Ipchains的配置命令都將在rc.ipfwadm文件里修改。
和IPFW一樣,Ipchains也是基于配置策略進(jìn)行包過濾的。使用的策略方式也是兩種:
(1)首先允許所有的包都可通過,然后禁止有危險的包;
(2)首先禁止所有的包,然后再根據(jù)所需要的服務(wù)允許特定的包通過。#p#
Iptables
Iptables是一個管理內(nèi)核包過濾的工具,可以加入、插入或刪除核心包過濾表格中的規(guī)則。實際上真正來執(zhí)行這些過濾規(guī)則的是Netfilter 。Netfilter是Linux核心中一個通用架構(gòu),它提供一系列的表(tables),每個表由若干鏈(chains)組成,而每條鏈中可以由一條或數(shù)條規(guī)則(rule)組成。
圖 Netfilter的總體結(jié)構(gòu)
相對于2.2內(nèi)核提供的IP鏈來說,2.4內(nèi)核提供了更好的靈活性和可擴(kuò)展性。2.4內(nèi)核中的防火墻并不是2.2內(nèi)核的簡單增強,而是一次完全的重新實現(xiàn),2.4內(nèi)核提供的防火墻軟件包在結(jié)構(gòu)上發(fā)生了非常大的變化。與IP鏈相比,2.4內(nèi)核提供的Iptables的檢測點變成了5個,并在每個檢測點上登記需要處理的函數(shù),登記通過nf-register-hook()函數(shù)保存在全局變量nf-hook中來實現(xiàn)。
當(dāng)包到達(dá)此檢測點時,實現(xiàn)登記的函數(shù)按照事先定義好的優(yōu)先級別來執(zhí)行。相對于2.2內(nèi)核提供的IP鏈來說,Iptables實現(xiàn)的不僅僅是包過濾功能,而是通過Netfilter實現(xiàn)一整套框架結(jié)構(gòu),在這個框架之上實現(xiàn)包過濾、NAT等模塊功能,從而提供更好的可擴(kuò)展性和靈活性。
系統(tǒng)缺省的表為filter,該表包含了INPUT鏈(輸入鏈)、FORWARD鏈(轉(zhuǎn)發(fā)鏈)和OUTPUT鏈(輸出鏈)。每一條鏈中可以定義一條或數(shù)條規(guī)則,每一條規(guī)則都以如下格式定義:條件/處理方式。
當(dāng)一個數(shù)據(jù)包到達(dá)一個鏈時,系統(tǒng)就會從第一條規(guī)則開始檢查,看是否符合該規(guī)則所定義的條件。如果滿足,系統(tǒng)將根據(jù)該條規(guī)則所定義的方法處理該數(shù)據(jù)包;如果不滿足,則繼續(xù)檢查下一條規(guī)則。如果該數(shù)據(jù)包不符合該鏈中任一條規(guī)則,系統(tǒng)則會根據(jù)該鏈預(yù)先定義的策略(policy)來處理該數(shù)據(jù)包。
和前面介紹的兩個軟件包一樣,Iptables及Netfilter也是內(nèi)置在Linux內(nèi)核中,可以將相應(yīng)的軟件包編譯到內(nèi)核中,從而完成 Iptables防火墻的安裝。Netfilter框架能夠在內(nèi)核2.3.5及以上版本實現(xiàn)。在將軟件包重新編譯進(jìn)內(nèi)核時,要求選擇和Netfilter 相關(guān)的項目。這些項目通常都是位于“Networkingoptions”子項下。以2.4.0內(nèi)核為例,應(yīng)該選中的項目有:
[*] Kernel/User netlink socket
[ ] Routing messages
<*>Netlink device emulation
[*] Network packet filtering (replaces ipchains)
在“IP: Netfilter Configuration ---->”選中如下選項:
Connection tracking (required for masq/NAT)
FTPprotocol support
IP tables support (required for filtering/masq/NAT)
limit match support
MAC address match support
Netfilter MARK match support
Multiple port match support
TOS match support
Connection state match support
Packet filtering
REJECT target support
Full NAT
MASQUERADE target support
REDIRECT target support
Packet mangling
TOS target support
MARK target support
LOG target support
ipchains (2.2-style) support
ipfwadm (2.0-style) support
上面最后兩個項目可以不選,如果將其選中,則可以在2.4內(nèi)核中使用Ipchains或Ipfwadm。需要注意的是,Iptables和 Ipchains/Ipfwadm是相對立的,在使用Iptables時就不能同時使用Ipchains/Ipfwadm。選擇完所需選項后,就可以執(zhí)行編譯操作了。編譯成功后,這些模塊文件都位于目錄/lib/modules/2.4.0/kernel/net/ipv4/netfilter中。
編譯2.4.0新內(nèi)核時還應(yīng)該注意,要在“Processor type and features”中選擇與所用CPU相對應(yīng)的、正確的CPU選項,否則新內(nèi)核可能無法正常工作。
成功安裝Iptables后,不能直接使用Iptables,還必須載入相關(guān)模塊。使用以下命令載入相關(guān)模塊:
#modprobe iptable_tables
modprobe命令會自動載入指定模塊及其相關(guān)模塊。iptables_filter模塊會在運行時自動載入。
Iptables實際上是一個操作過濾規(guī)則的工具。利用Iptables工具,可以對Netfilter中的鏈和規(guī)則進(jìn)行操作。Iptables使用與 IP鏈基本相同的語法和命令格式。除了對鏈和規(guī)則進(jìn)行操作外,Iptables還提供其它一些操作。如通過--source/--src/-s指定源地址;通過--destination/--dst/-s指定目的地址;通過--protocol/-p選項指定協(xié)議,比如-p tcp;使用--in-interface/-i或--out-interface/-o)指定網(wǎng)絡(luò)接口;指定IP碎片等。這里不一一介紹相關(guān)語法。讀者可以從HOWTO文檔獲得相關(guān)內(nèi)容。以上的相關(guān)內(nèi)容就是對實現(xiàn)Linux網(wǎng)絡(luò)防火墻的介紹,望你能有所收獲。
【編輯推薦】