歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux管理 >> Linux網絡

實現Linux網絡防火牆

防火牆作為一種網絡或系統之間強制實行訪問控制的機制,是確保網絡安全的重要手段。針對不同的需求和應用環境,可以量身定制出不同的防火牆系統。防火牆大到可由若干路由器和堡壘主機構成,也可小到僅僅是網絡操作系統上一個防火牆軟件包所提供的包過濾功能。 在眾多網絡防火牆產品中,Linux操作系統上的防火牆軟件特點顯著。首先是Linux操作系統作為一個類Unix網絡操作系統,在系統的穩定性、健壯性及價格的低廉性方面都獨具優勢。更為重要的是,Linux不但本身的源代碼完全開放,而且系統包含了建立Internet網絡環境所需要的所有服務軟件包,如Apache Web服務器、DNS服務器、Mail服務器、Database服務器等。同樣,基於Linux的防火牆軟件不但具有強大的功能,而且大部分都是開放軟件。 隨著Internet的飛速發展,安全問題越來越重要。利用Linux構建企業網深受中小企業的青睐,而利用Linux構建企業網的防火牆系統也成為眾多中小企業的理想選擇。 Linux內核從1.1版本開始,就已經具備包過濾功能。在2.0內核中,開始采用Ipfwadm來操作內核的包過濾規則。到2.2版本時,Linux內核采用了Ipchains來控制內核的包過濾規則。發展到2.4.x時,Ipchains被一個全新的包過濾管理工具Iptables所替代。新發布的 2.6版內核也在安全方面進行了改進。因此,無論擁有哪個版本的Linux內核,無論選擇哪個版本的Linux來構建自己的企業網,都可以利用現有的系統構建出一個理想實用的防火牆。 防火牆系統可分為包過濾型、應用級網關(也叫代理服務器型防火牆)和電路級網關三種基本類型。Linux提供的防火牆軟件包內置於Linux內核中,是一種基於包過濾型的防火牆實現技術。其中心思想是根據網絡層IP包頭中的源地址、目的地址及包類型等信息來控制包的流向。更徹底的過濾則是檢查包中的源端口、目的端口以及連接狀態等信息。 本文主要介紹Linux提供的IPFW、Ipchains、Iptables這三種非常實用的防火牆和具體實現。 IPFW防火牆 IPFW是比較老的Linux內核版本提供的防火牆軟件包。該軟件包的全稱是Ipfwadm。Ipfwadm程序包提供了建立規則的能力,根據這些規則來確定允許什麼樣的包進出本網絡。簡單說來,防火牆就是一對開關,一個開關允許包通過,另一個開關禁止包通過。現代防火牆系統一般都會附加審計跟蹤、加密認證、地址偽裝和VPN等多種功能。作為一個安全開關,防火牆可定義的安全策略有兩個:(1)一切未被允許的都被禁止;(2)一切未被禁止的都被允許。 顯然,策略1的安全性明顯高於策略2,但它是以犧牲靈活性和可訪問資源為代價來提高安全性的。Ipfwadm系統同樣提供IP封裝,它允許用戶使用Internet上的一個公共IP地址空間。 下面以Red Hat系統為例,說明Linux系統上IPFW防火牆的實現。 在Red Hat系統上(在其它系統上一樣)安裝Ipfwadm防火牆,需要以root用戶登錄,然後執行如下命令:#rpm -ivh /mnt/cdrom/RedHat/RPMS/ Ipfwadm-2.3.0-5.i386.rpm 在安裝好Ipfwadm後,就可以交互方式指定Ipfwadm的包過濾規則。過濾規則對每一個進入系統的IP包進行檢查,從而決定哪些包允許通過防火牆,哪些包則禁止通過。Ipfwadm命令的一般格式為:/sbin/ ipfwadm category commands parameters [options] Ipchains(IP鏈)和IP偽裝 在更新版本的Linux內核中,Ipchains替代Ipfwadm,提供了更為嚴格的包過濾控制機制。Ipchains提供完整的防火牆功能,包括包過濾、地址偽裝、透明代理。 Linux 2.2內核中提供的Ipchains,通過四類防火牆規則列表來提供防火牆規則控制,這些列表稱為防火牆鏈。它們分別是IP input鏈(IP輸入鏈)、IP output鏈(IP輸出鏈)、IP forward鏈(IP轉發鏈)和user defined鏈(用戶定義鏈)。一個鏈實際上就是一個規則表。所謂規則,即當被檢測的包頭符合規則的定義時,就按預先的設定對該包進行某種處理。輸入鏈是指對內連接請求的過濾規則;輸出鏈是對外連接請求的過濾規則;轉發鏈是對內部與外部通信包轉發的過濾規則;用戶定義鏈是用戶自己定義的規則。 當一個數據包進入Linux防火牆系統時,Linux內核使用輸入鏈決定對這個包的操作;如果這個包不被丟棄,內核則使用轉發鏈來決定是否將這個包轉發到某個出口;當這個包到達一個出口被發出前,內核使用輸出鏈最後確定是丟棄該包還是轉發該包。在上面的過程中,如果輸入鏈已經決定處理這個包,則核心需要決定下一步包應該發到什麼地方,即進行路由。假如此時該數據包是發到另一台主機的,則核心就運用轉發鏈;如果沒找到匹配的設置,則這個包就需要進入目標值指定的下一條鏈,此時目標值有可能是一條用戶自定義鏈,也有可能是一個特定的值。例如:ACCEPT 允許通過。DENY 直接丟棄。REJECT 丟棄並通過ICMP回復通知發送者包被丟棄。 MASQ 通知核心將該包偽裝,該值只對轉發鏈和用戶自定義鏈起作用。 REDIRECT 通知核心將包改送到一個本地端口,該值只對輸入鏈和用戶自定義鏈起作用,並且只有UDP和TCP協議才可以使用該值。 RETURE 通知內核將該包跳過所有的規則,直接到達所有鏈的鏈尾。 在Linux系統IP鏈的轉發鏈上可以配置IP偽裝。實際上,IP偽裝是一個比包過濾策略更安全的解決方案,它不僅能夠提供一種安全機制,還同時解決了 Internet中IP地址資源不足的問題。IP偽裝使一台計算機在訪問Internet時,能夠將本台機器的真正IP地址偽裝成其它地址。如果連接到 Internet上的一台主機具有IP偽裝功能,則這台機器不管是通過局域網,還是PPP撥號都可以與Internet連接。盡管在使用PPP時,這樣的主機根本沒有自己正式的IP地址。這說明可以將一台主機隱藏在一個網關後面來訪問Internet,使得這台主機既實現了對Internet的訪問,又實現了其訪問對外界的不可見性(即隱藏性)。顯然,這種隱藏性使得系統非常安全,因為外界根本意識不到主機的存在,也就不可能對主機實施存取操作,更不能入侵和破解。通常情況下,使用IANA保留的私有地址來進行偽裝。 在防火牆轉發鏈配置IP偽裝後,內部網絡上的主機向Internet發送訪問IP包時,內核將源IP地址換成網關的IP地址,並記錄被偽裝的IP地址後再轉發該IP包。當這個包的Internet應答包從Internet進入網關時,內核執行去除IP偽裝的操作,即將目的地址替換成內部地址。 通過適當的設置,IP偽裝可以在某個網段、某台主機、某個接口、某個協議甚至是某個協議的某些端口上實現,非常靈活。IP偽裝可以將內部網絡的細節對外部網絡屏蔽掉,因此,IP偽裝提供了很好的安全性。 一般來說,安裝相應版本的Linux系統時,系統會自動將Ipchains安裝上。如果系統沒有安裝IP鏈軟件包,可以通過光盤或從網上下載軟件包來安裝。 如果是rpm包,使用如下命令安裝:#rpm -ivh *.rpm 如果是.tar.gz包,則先需要將壓縮包解壓: #tar xvfz *.tar.gz 然後再到解壓後所在目錄執行如下命令完成安裝:#./configure#make#make install 這樣就將IP鏈防火牆成功安裝在系統中。成功安裝Ipchains後,接下來就是啟動並配置包過濾規則。啟用Ipchains需要完成如下操作:◆ 手工修改/proc/sys/net/ipv4/ipforward文件,將其內容置為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也是基於配置策略進行包過濾的。使用的策略方式也是兩種:(1)首先允許所有的包都可通過,然後禁止有危險的包;(2)首先禁止所有的包,然後再根據所需要的服務允許特定的包通過。 Iptables Iptables是一個管理內核包過濾的工具,可以加入、插入或刪除核心包過濾表格中的規則。實際上真正來執行這些過濾規則的是Netfilter 。Netfilter是Linux核心中一個通用架構,它提供一系列的表(tables),每個表由若干鏈(chains)組成,而每條鏈中可以由一條或數條規則(rule)組成。

圖 Netfilter的總體結構 相對於2.2內核提供的IP鏈來說,2.4內核提供了更好的靈活性和可擴展性。2.4內核中的防火牆並不是2.2內核的簡單增強,而是一次完全的重新實現,2.4內核提供的防火牆軟件包在結構上發生了非常大的變化。與IP鏈相比,2.4內核提供的Iptables的檢測點變成了5個,並在每個檢測點上登記需要處理的函數,登記通過nf-register-hook()函數保存在全局變量nf-hook中來實現。當包到達此檢測點時,實現登記的函數按照事先定義好的優先級別來執行。相對於2.2內核提供的IP鏈來說,Iptables實現的不僅僅是包過濾功能,而是通過Netfilter實現一整套框架結構,在這個框架之上實現包過濾、NAT等模塊功能,從而提供更好的可擴展性和靈活性。 系統缺省的表為filter,該表包含了INPUT鏈(輸入鏈)、FORWARD鏈(轉發鏈)和OUTPUT鏈(輸出鏈)。每一條鏈中可以定義一條或數條規則,每一條規則都以如下格式定義:條件/處理方式。 當一個數據包到達一個鏈時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件。如果滿足,系統將根據該條規則所定義的方法處理該數據包;如果不滿足,則繼續檢查下一條規則。如果該數據包不符合該鏈中任一條規則,系統則會根據該鏈預先定義的策略(policy)來處理該數據包。 和前面介紹的兩個軟件包一樣,Iptables及Netfilter也是內置在Linux內核中,可以將相應的軟件包編譯到內核中,從而完成 Iptables防火牆的安裝。Netfilter框架能夠在內核2.3.5及以上版本實現。在將軟件包重新編譯進內核時,要求選擇和Netfilter 相關的項目。這些項目通常都是位於“Networking options”子項下。以2.4.0內核為例,應該選中的項目有:

[*] Kernel/User netlink socket [ ] Routing messages <*> Netlink device emulation [*] Network packet filtering (replaces ipchains) 在“IP: Netfilter Configuration ---->”選中如下選項: <M> Connection tracking (required for masq/NAT) <M> FTP protocol support <M> IP tables support (required for filtering/masq/NAT) <M > limit match support <M> MAC address match support <M> Netfilter MARK match support <M> Multiple port match support <M> TOS match support <M> Connection state match support <M> Packet filtering <M> REJECT target support <M> Full NAT <M> MASQUERADE target support <M> REDIRECT target support <M> Packet mangling <M> TOS target support <M> MARK target support <M> LOG target support <M> ipchains (2.2-style) support <M> ipfwadm (2.0-style) support上面最後兩個項目可以不選,如果將其選中,則可以在2.4內核中使用Ipchains或Ipfwadm。需要注意的是,Iptables和 Ipchains/Ipfwadm是相對立的,在使用Iptables時就不能同時使用Ipchains/Ipfwadm。選擇完所需選項後,就可以執行編譯操作了。編譯成功後,這些模塊文件都位於目錄/lib/modules/2.4.0/kernel/net/ipv4/netfilter中。 編譯2.4.0新內核時還應該注意,要在“Processor type and features”中選擇與所用CPU相對應的、正確的CPU選項,否則新內核可能無法正常工作。 成功安裝Iptables後,不能直接使用Iptables,還必須載入相關模塊。使用以下命令載入相關模塊:#modprobe iptable_tables modprobe命令會自動載入指定模塊及其相關模塊。iptables_filter模塊會在運行時自動載入。 Iptables實際上是一個操作過濾規則的工具。利用Iptables工具,可以對Netfilter中的鏈和規則進行操作。Iptables使用與 IP鏈基本相同的語法和命令格式。除了對鏈和規則進行操作外,Iptables還提供其它一些操作。如通過--source/--src/-s指定源地址;通過--destination/--dst/-s指定目的地址;通過--protocol/-p選項指定協議,比如-p tcp;使用--in-interface/-i或--out-interface/-o)指定網絡接口;指定IP碎片等。這裡不一一介紹相關語法。讀者可以從HOWTO文檔獲得相關內容。




Copyright © Linux教程網 All Rights Reserved