歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

用 netfilter/iptables 為 Linux 內核 2.4.x配置防火牆

 

 netfilter/iptables 是與最新的 2.4.x 版本 Linux 內核集成的 IP 信息包過濾系統。如果 Linux 系統連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器,則該系統有利於在 Linux 系統上更好地控制 IP 信息包過濾和防火牆配置。Mugdha Vairagade 將介紹 netfilter/iptables 系統、它是如何工作的、它的優點、安裝和配置以及如何使用它來配置 Linux 系統上的防火牆以過濾 IP 信息包。  注:至少具備 Linux OS 的中級水平知識,以及配置 Linux 內核的經驗,將有助於對本文的理解。    對於本文,我們將使用 iptables 用戶空間工具版本 1.2.6a 和內核版本 2.4.9。    Linux 安全性和 netfilter/iptables  Linux 因其健壯性、可靠性、靈活性以及好象無限范圍的可定制性而在 IT 業界變得非常受歡迎。Linux 具有許多內置的能力,使開發人員可以根據自己的需要定制其工具、行為和外觀,而無需昂貴的第三方工具。如果 Linux 系統連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器,所要用到的一種內置能力就是針對網絡上 Linux 系統的防火牆配置。可以在 netfilter/iptables IP 信息包過濾系統(它集成在 2.4.x 版本的 Linux 內核中)的幫助下運用這種能力。     在如 ipfwadm 和 ipchains 這樣的 Linux 信息包過濾解決方案中,netfilter/iptables IP 信息包過濾系統是最新的解決方案,而且也是第一個集成到 Linux 內核的解決方案。對於 Linux 系統管理員、網絡管理員以及家庭用戶(他們想要根據自己特定的需求來配置防火牆、在防火牆解決方案上節省費用和對 IP 信息包過濾具有完全控制權)來說,netfilter/iptables 系統十分理想。     理解防火牆配置和信息包過濾  對於連接到網絡上的 Linux 系統來說,防火牆是必不可少的防御機制,它只允許合法的網絡流量進出系統,而禁止其它任何網絡流量。為了確定網絡流量是否合法,防火牆依靠它所包含的由網絡或系統管理員預定義的一組規則。這些規則告訴防火牆某個流量是否合法以及對於來自某個源、至某個目的地或具有某種協議類型的網絡流量要做些什麼。術語“配置防火牆”是指添加、修改和除去這些規則。稍後,我將詳細討論這些規則。     網絡流量由 IP 信息包(或,簡稱信息包)— 以流的形式從源系統傳輸到目的地系統的一些小塊數據 — 組成。這些信息包有頭,即在每個包前面所附帶的一些數據位,它們包含有關信息包的源、目的地和協議類型的信息。防火牆根據一組規則檢查這些頭,以確定接受哪個信息包以及拒絕哪個信息包。我們將該過程稱為信息包過濾。     為什麼要配置自己的防火牆?  出於各種因素和原因,需要根據特定需求來配置防火牆。或許,最重要的原因是安全性。     管理員可能想讓他們的防火牆能夠阻止未經授權的源訪問其 Linux 系統,例如通過 Telnet。他們可能還想限制進出其系統的網絡流量,以便只有來自可信源的流量才可以進入其系統,以及只有授權的流量才可以出去。家庭用戶可能通過允許所有的出站信息包都可以通過,將防火牆配置成較低的安全性級別。     另一個背後的原因是,通過阻塞來自類似廣告站點之類的源的多余流量,可以節省帶寬。     因而,可以定制防火牆配置來滿足任何特定需求和任何安全性級別需求。這就是 netfilter/iptables 系統的用武之處。     netfilter/iptables 系統是如何工作的?  netfilter/iptables IP 信息包過濾系統是一種功能強大的工具,可用於添加、編輯和除去規則,這些規則是在做信息包過濾決定時,防火牆所遵循和組成的規則。這些規則存儲在專用的信息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規則被分組放在我們所謂的鏈(chain)中。我馬上會詳細討論這些規則以及如何建立這些規則並將它們分組在鏈中。     雖然 netfilter/iptables IP 信息包過濾系統被稱為單個實體,但它實際上由兩個組件 netfilter 和 iptables 組成。     netfilter 組件也稱為內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。     iptables 組件是一種工具,也稱為用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否則需要從 netfilter.org 下載該工具並安裝使用它。     通過使用用戶空間,可以構建自己的定制規則,這些規則存儲在內核空間的信息包過濾表中。這些規則具有目標,它們告訴內核對來自某些源、前往某些目的地或具有某些協議類型的信息包做些什麼。如果某個信息包與規則匹配,那麼使用目標 ACCEPT 允許該信息包通過。還可以使用目標 DROP 或 REJECT 來阻塞並殺死信息包。對於可對信息包執行的其它操作,還有許多其它目標。     根據規則所處理的信息包的類型,可以將規則分組在鏈中。處理入站信息包的規則被添加到 INPUT 鏈中。處理出站信息包的規則被添加到 OUTPUT 鏈中。處理正在轉發的信息包的規則被添加到 FORWARD 鏈中。這三個鏈是基本信息包過濾表中內置的缺省主鏈。另外,還有其它許多可用的鏈的類型(如 PREROUTING 和 POSTROUTING),以及提供用戶定義的鏈。每個鏈都可以有一個策略,它定義“缺省目標”,也就是要執行的缺省操作,當信息包與鏈中的任何規則都不匹配時,執行此操作。     建立規則並將鏈放在適當的位置之後,就可以開始進行真正的信息包過濾工作了。這時內核空間從用戶空間接管工作。當信息包到達防火牆時,內核先檢查信息包的頭信息,尤其是信息包的目的地。我們將這個過程稱為路由。     如果信息包源自外界並前往系統,而且防火牆是打開的,那麼內核將它傳遞到內核空間信息包過濾表的 INPUT 鏈。如果信息包源自系統內部或系統所連接的內部網上的其它源,並且此信息包要前往另一個外部系統,那麼信息包被傳遞到 OUTPUT 鏈。類似的,源自外部系統並前往外部系統的信息包被傳遞到 FORWARD 鏈。     接下來,將信息包的頭信息與它所傳遞到的鏈中的每條規則進行比較,看它是否與某條規則完全匹配。如果信息包與某條規則匹配,那麼內核就對該信息包執行由該規則的目標指定的操作。但是,如果信息包與這條規則不匹配,那麼它將與鏈中的下一條規則進行比較。最後,如果信息包與鏈中的任何規則都不匹配,那麼內核將參考該鏈的策略來決定如何處理該信息包。理想的策略應該告訴內核 DROP 該信息包。圖 1 用圖形說明了這個信息包過濾過程。     圖 1. 信息包過濾過程     安裝 netfilter/iptables 系統  因為 netfilter/iptables 的 netfilter 組件是與內核 2.4.x 集成在一起的,所以只需要下載並安裝 iptables 用戶空間工具。     需求  下面是安裝 netfilter/iptables 系統的需求:     硬件:要使用 netfilter/iptables,需要有一個運行 Linux OS 並連接到因特網、LAN 或 WAN 的系統。   軟件:帶有內核 2.4 或更高版本的任何版本的 Linux OS。可以從 http://www.kernel.org 下載最新版本的內核。還需要從 http://www.netfilter.org 下載 iptables 這個用戶空間工具,因為這個工具不是內核的一部分。但對於 RedHat Linux 版本 7.1 或更高版本,不需要下載此工具,因為在版本 7.1 或更高版本中,標准安裝中已經包含了此工具。   用戶:至少對 Linux OS 有中等水平的了解,以及具備配置 Linux 內核的經驗。     安裝前的准備  在開始安裝 iptables 用戶空間工具之前,需要對系統做某些修改。首先,需要使用 make config 命令來配置內核的選項。在配置期間,必須通過將 CONFIG_NETFILTER 和 CONFIG_IP_NF_IPTABLES 選項設置為 Y 來打開它們,因為這是使 netfilter/iptables 工作所必需的。下面是可能要打開的其它選項:     CONFIG_PACKET:如果要使應用程序和程序直接使用某些網絡設備,那麼這個選項是有用的。   CONFIG_IP_NF_MATCH_STATE:如果要配置有狀態的防火牆,那麼這個選項非常重要而且很有用。這類防火牆會記得先前關於信息包過濾所做的決定,並根據它們做出新的決定。我將在 netfilter/iptables 系統的優點一節中進一步討論這方面的問題。   CONFIG_IP_NF_FILTER:這個選項提供一個基本的信息包過濾框架。如果打開這個選項,則會將一個基本過濾表(帶有內置的 INPUT、FORWARD 和 OUTPUT 鏈)添加到內核空間。   CONFIG_IP_NF_TARGET_REJECT:這個選項允許指定:應該發送 ICMP 錯誤消息來響應已被 DROP 掉的入站信息包,而不是簡單地殺死它們。   現在,可以准備安裝這個用戶空間工具了。     安裝用戶空間工具  在下載 iptables 用戶空間工具的源代碼(它類似於 iptables-1.2.6a.tar.bz2)之後,可以開始安裝。您需要以 root 身份登錄來執行安裝。清單 1 給出了一個示例,它指出了安裝該工具所需的命令、其必要的次序及其說明。     清單 1. 用戶空間工具安裝的示例  First, unpack the tool package into a Directory:    # bzip2 -d iptables-1.2.6a.tar.bz2  # tar -xvf iptables-1.2.6a.tar    This will unpack the tool source into a directory named iptables-1.2.6a.   Now change to the iptables-1.2.6a directory:    # cd iptables-1.2.6a    The INSTALL file in this directory contains a lot of useful information   on compiling and installing this tool.  Now compile the userspace tool using the following command:    # make KERNEL_DIR=/usr/src/linux/    Here the KERNEL_DIR=/usr/src/linux/ specifies the path to the kernel's   directory. If the directory of kernel happens to be different on some   systems, the appropriate directory path should be substituted for   /usr/src/linux.  Now install the source binaries using the following command:    # make install KERNEL_DIR=/usr/src/linux/    Now the installation is complete.         注:如果您有 RedHat Linux 版本 7.1 或更高版本,就不需要執行這裡說明的前兩個步驟。正如我們所知道的,該 Linux 分發版(distribution)的標准安裝中包含了 iptables 用戶空間工具。但在缺省情況下,這個工具是關閉的。為了使該工具運行,需要執行以下步驟(清單 2):    清單 2. 在 RedHat 7.1 系統上設置用戶空間工具的示例    First you'll have to turn off the old ipchains module (predecessor of   iptables) available in this OS package.  This can be done using the following command:    # chkconfig --level 0123456 ipchains off    Next, to completely stop the ipchains module from running, so that it   doesn't conflict with the iptables tool, you will have to stop the ipchains   service using the following command:    # service ipchains stop    Now if you don't want to keep this old ipchains module on your system,   uninstall it using the following command:    # rpm -e ipchains    Now you can turn on the iptables userspace tool with the following command:    # chkconfig --level 235 iptables on    Finally, you'll have to activate the iptables service to make the userspace   tool work by using this command:    # service iptables start    Now the userspace tool is ready to work on a RedHat 7.1 or higher system.         現在,一切都已妥當,並且 netfilter/iptables 系統應該正在運行,接下來,需要建立一些規則和鏈來過濾信息包。    建立規則和鏈  通過向防火牆提供有關對來自某個源、到某個目的地或具有特定協議類型的信息包要做些什麼的指令,規則控制信息包的過濾。通過使用 netfilter/iptables 系統提供的特殊命令 iptables,建立這些規則,並將其添加到內核空間的特定信息包過濾表內的鏈中。關於添加/除去/編輯規則的命令的一般語法如下:    $ iptables [-t table] command [match] [target]     表(table)  [-t table] 選項允許使用標准表之外的任何表。表是包含僅處理特定類型信息包的規則和鏈的信息包過濾表。有三種可用的表選項:filter、nat 和 mangle。該選項不是必需的,如果未指定,則 filter 用作缺省表。     filter 表用於一般的信息包過濾,它包含 INPUT、OUTPUT 和 FORWARD 鏈。nat 表用於要轉發的信息包,它包含 PREROUTING、OUTPUT 和 POSTROUTING 鏈。如果信息包及其頭內進行了任何更改,則使用 mangle 表。該表包含一些規則來標記用於高級路由的信息包,該表包含 PREROUTING 和 OUTPUT 鏈。     注:PREROUTING 鏈由指定信息包一到達防火牆就改變它們的規則所組成,而 POSTROUTING 鏈由指定正當信息包打算離開防火牆時改變它們的規則所組成。     命令(command)  上面這條命令中具有強制性的 command 部分是 iptables 命令的最重要部分。它告訴 iptables 命令要做什麼,例如,插入規則、將規則添加到鏈的末尾或刪除規則。以下是最常用的一些命令:    -A 或 --append:該命令將一條規則附加到鏈的末尾。  示例:  $ iptables -A INPUT -s 205.168.0.1 -j ACCEPT     該示例命令將一條規則附加到 INPUT 鏈的末尾,確定來自源地址 205.168.0.1 的信息包可以 ACCEPT。       -D 或 --delete:通過用 -D 指定要匹配的規則或者指定規則在鏈中的位置編號,該命令從鏈中刪除該規則。下面的示例顯示了這兩種方法。  示例:  $ iptables -D INPUT --dport 80 -j DROP  $ iptables -D OUTPUT 3     第一條命令從 INPUT 鏈刪除規則,它指定 DROP 前往端口 80 的信息包。第二條命令只是從 OUTPUT 鏈刪除編號為 3 的規則。       -P 或 --policy:該命令設置鏈的缺省目標,即策略。所有與鏈中任何規則都不匹配的信息包都將被強制使用此鏈的策略。   示例:  $ iptables -P INPUT DROP     該命令將 INPUT 鏈的缺省目標指定為 DROP。這意味著,將丟棄所有與 INPUT 鏈中任何規則都不匹配的信息包。       -N 或 --new-chain:用命令中所指定的名稱創建一個新鏈。  示例:  $ iptables -N allowed-chain     -F 或 --flush:如果指定鏈名,該命令刪除鏈中的所有規則,如果未指定鏈名,該命令刪除所有鏈中的所有規則。此參數用於快速清除。  示例:  $ iptables -F FORWARD  $ iptables -F     -L 或 --list:列出指定鏈中的所有規則。  示例:  $ iptables -L allowed-chain     匹配(match)  iptables 命令的可選 match 部分指定信息包與規則匹配所應具有的特征(如源和目的地地址、協議等)。匹配分為兩大類:通用匹配和特定於協議的匹配。這裡,我將研究可用於采用任何協議的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其示例和說明:    -p 或 --protocol:該通用協議匹配用於檢查某些特定協議。協議示例有 TCP、UDP、ICMP、用逗號分隔的任何這三種協議的組合列表以及 ALL(用於所有協議)。ALL 是缺省匹配。可以使用 ! 符號,它表示不與該項匹配。  示例:  $ iptables -A INPUT -p TCP, UDP  $ iptables -A INPUT -p ! ICMP     在上述示例中,這兩條命令都執行同一任務 — 它們指定所有 TCP 和 UDP 信息包都將與該規則匹配。通過指定 ! ICMP,我們打算允許所有其它協議(在這種情況下是 TCP 和 UDP),而將 ICMP 排除在外。       -s 或 --source:該源匹配用於根據信息包的源 IP 地址來與它們匹配。該匹配還允許對某一范圍內的 IP 地址進行匹配,可以使用 ! 符號,表示不與該項匹配。缺省源匹配與所有 IP 地址匹配。   示例:  $ iptables -A OUTPUT -s 192.168.1.1  $ iptables -A OUTPUT -s 192.168.0.0/24  $ iptables -A OUTPUT -s ! 203.16.1.89     第二條命令指定該規則與所有來自 192.168.0.0 到 192.168.0.24 的 IP 地址范圍的信息包匹配。第三條命令指定該規則將與除來自源地址 203.16.1.89 外的任何信息包匹配。       -d 或 --destination:該目的地匹配用於根據信息包的目的地 IP 地址來與它們匹配。該匹配還允許對某一范圍內 IP 地址進行匹配,可以使用 ! 符號,表示不與該項匹配。  示例:  $ iptables -A INPUT -d 192.168.1.1  $ iptables -A INPUT -d 192.168.0.0/24  $ iptables -A OUTPUT -d ! 203.16.1.89     目標(target)  我們已經知道,目標是由規則指定的操作,對與那些規則匹配的信息包執行這些操作。除了允許用戶定義的目標之外,還有許多可用的目標選項。下面是常用的一些目標及其示例和說明:    ACCEPT:當信息包與具有 ACCEPT 目標的規則完全匹配時,會被接受(允許它前往目的地),並且它將停止遍歷鏈(雖然該信息包可能遍歷另一個表中的其它鏈,並且有可能在那裡被丟棄)。該目標被指定為 -j ACCEPT。       DROP:當信息包與具有 DROP 目標的規則完全匹配時,會阻塞該信息包,並且不對它做進一步處理。該目標被指定為 -j DROP。       REJECT:該目標的工作方式與 DROP 目標相同,但它比 DROP 好。和 DROP 不同,REJECT 不會在服務器和客戶機上留下死套接字。另外,REJECT 將錯誤消息發回給信息包的發送方。該目標被指定為 -j REJECT。  示例:  $ iptables -A FORWARD -p TCP --dport 22 -j REJECT     RETURN:在規則中設置的 RETURN 目標讓與該規則匹配的信息包停止遍歷包含該規則的鏈。如果鏈是如 INPUT 之類的主鏈,則使用該鏈的缺省策略處理信息包。它被指定為 -jump RETURN。示例:  $ iptables -A FORWARD -d 203.16.1.89 -jump RETURN     還有許多用於建立高級規則的其它目標,如 LOG、REDIRECT、MARK、MIRROR 和 MASQUERADE 等。    保存規則  現在,您已經學習了如何建立基本的規則和鏈以及如何從信息包過濾表中添加或刪除它們。但是,您應該記住:用上述方法所建立的規則會被保存到內核中,當重新引導系統時,會丟失這些規則。所以,如果您將沒有錯誤的且有效的規則集添加到信息包過濾表,同時希望在重新引導之後再次使用這些規則,那麼必須將該規則集保存在文件中。可以使用 iptables-save 命令來做到這一點:     $ iptables-save > iptables-script       現在,信息包過濾表中的所有規則都被保存在文件 iptables-script 中。無論何時再次引導系統,都可以使用 iptables-restore 命令將規則集從該腳本文件恢復到信息包過濾表,如下所示:     $ iptables-restore iptables-script       如果您願意在每次引導系統時自動恢復該規則集,則可以將上面指定的這條命令放到任何一個初始化 shell 腳本中。    netfilter/iptables 系統的優點  netfilter/iptables 的最大優點是它可以配置有狀態的防火牆,這是 ipfwadm 和 ipchains 等以前的工具都無法提供的一種重要功能。有狀態的防火牆能夠指定並記住為發送或接收信息包所建立的連接的狀態。防火牆可以從信息包的連接跟蹤狀態獲得該信息。在決定新的信息包過濾時,防火牆所使用的這些狀態信息可以增加其效率和速度。這裡有四種有效狀態,名稱分別為 ESTABLISHED、INVALID、NEW 和 RELATED。    狀態 ESTABLISHED 指出該信息包屬於已建立的連接,該連接一直用於發送和接收信息包並且完全有效。INVALID 狀態指出該信息包與任何已知的流或連接都不相關聯,它可能包含錯誤的數據或頭。狀態 NEW 意味著該信息包已經或將啟動新的連接,或者它與尚未用於發送和接收信息包的連接相關聯。最後,RELATED 表示該信息包正在啟動新連接,以及它與已建立的連接相關聯。    netfilter/iptables 的另一個重要優點是,它使用戶可以完全控制防火牆配置和信息包過濾。您可以定制自己的規則來滿足您的特定需求,從而只允許您想要的網絡流量進入系統。    另外,netfilter/iptables 是免費的,這對於那些想要節省費用的人來說十分理想,它可以代替昂貴的防火牆解決方案。    結束語  最新的 Linux 內核 2.4.x 具有 netfilter/iptables 系統這種內置的 IP 信息包過濾工具,它使配置防火牆和信息包過濾變得便宜且方便。netfilter/iptables 系統使其用戶可以完全控制防火牆配置和信息包過濾。它允許為防火牆建立可定制化的規則來控制信息包過濾。它還允許配置有狀態的防火牆。    參考資料     從 Netfilter 網站獲取有關 netfilter/iptables 系統的最新信息並下載 iptables 用戶空間工具。       請訪問 Linux 2.4 Packet Filtering HOWTO Web 頁面,以獲取關於 netfilter/iptables 的快速參考。       請參考這篇有關 netfilter/iptables 的詳細教程(Iptables Tutorial 1.1.9)。       請從 netfilter/iptables FAQ 獲取任何有關 netfilter/iptables 問題的答案。     關於作者  Mugdha Vairagade 是一名開發人員,有在多個組織中工作的經驗。在無線應用程序開發方面,她擁有相當豐富的經驗,而且專長於組件體系結構方面的工作。她對開放源碼(Open Source)項目特別感興趣,並且參與了 Linux Documentation Project、Forum Nokia(WAP 開發人員論壇)和 W3C 的工作。她還編寫了有關 Linux 和 XML 技術的技術性文章。可以通過 [email protected] 與 Mugdha 聯系。   




 



Copyright © Linux教程網 All Rights Reserved