Linux安全性和netfilter/iptables
Linux 因其健壯性、可靠性、靈活性以及好象無限范圍的可定制性而在 IT 業(yè)界變得非常受歡迎。Linux 具有許多內置的能力,使開發(fā)人員可以根據自己的需要定制其工具、行為和外觀,而無需昂貴的第三方工具。如果 Linux 系統(tǒng)連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器,所要用到的一種內置能力就是針對網絡上 Linux 系統(tǒng)的防火墻配置??梢栽?netfilter/iptables IP 信息包過濾系統(tǒng)(它集成在 2.4.x 版本的 Linux 內核中)的幫助下運用這種能力。
在如 ipfwadm和 ipchains 這樣的 Linux 信息包過濾解決方案中,netfilter/iptables IP 信息包過濾系統(tǒng)是***的解決方案,而且也是***個集成到 Linux 內核的解決方案。對于 Linux 系統(tǒng)管理員、網絡管理員以及家庭用戶(他們想要根據自己特定的需求來配置防火墻、在防火墻解決方案上節(jié)省費用和對 IP 信息包過濾具有完全控制權)來說,netfilter/iptables 系統(tǒng)十分理想。
下載鏈接:http://down.51cto.com/data/148129
理解防火墻配置和信息包過濾
對于連接到網絡上的 Linux 系統(tǒng)來說,防火墻是必不可少的防御機制,它只允許合法的網絡流量進出系統(tǒng),而禁止其它任何網絡流量。為了確定網絡流量是否合法,防火墻依靠它所包含的由網絡或系統(tǒng)管理員預定義的一組 規(guī)則。這些規(guī)則告訴防火墻某個流量是否合法以及對于來自某個源、至某個目的地或具有某種協(xié)議類型的網絡流量要做些什么。術語“配置防火墻”是指添加、修改和除去這些規(guī)則。稍后,我將詳細討論這些 規(guī)則。
網絡流量由 IP 信息包(或,簡稱 信息包)— 以流的形式從源系統(tǒng)傳輸到目的地系統(tǒng)的一些小塊數據 — 組成。這些信息包有 頭,即在每個包前面所附帶的一些數據位,它們包含有關信息包的源、目的地和協(xié)議類型的信息。防火墻根據一組規(guī)則檢查這些頭,以確定接受哪個信息包以及拒絕哪個信息包。我們將該過程稱為 信息包過濾。
為什么要配置自己的防火墻?
出于各種因素和原因,需要根據特定需求來配置防火墻?;蛟S,最重要的原因是安全性。
管理員可能想讓他們的防火墻能夠阻止未經授權的源訪問其 Linux 系統(tǒng),例如通過 Telnet。他們可能還想限制進出其系統(tǒng)的網絡流量,以便只有來自可信源的流量才可以進入其系統(tǒng),以及只有授權的流量才可以出去。家庭用戶可能通過允許所有的出站信息包都可以通過,將防火墻配置成較低的安全性級別。
另一個背后的原因是,通過阻塞來自類似廣告站點之類的源的多余流量,可以節(jié)省帶寬。
因而,可以定制防火墻配置來滿足任何特定需求和任何安全性級別需求。這就是 netfilter/iptables 系統(tǒng)的用武之處。#p#
netfilter/iptables 系統(tǒng)是如何工作的?
netfilter/iptables IP 信息包過濾系統(tǒng)是一種功能強大的工具,可用于添加、編輯和除去規(guī)則,這些規(guī)則是在做信息包過濾決定時,防火墻所遵循和組成的規(guī)則。這些規(guī)則存儲在專用的信息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規(guī)則被分組放在我們所謂的 鏈(chain)中。我馬上會詳細討論這些規(guī)則以及如何建立這些規(guī)則并將它們分組在鏈中。
雖然 netfilter/iptables IP 信息包過濾系統(tǒng)被稱為單個實體,但它實際上由兩個組件 netfilter和 iptables 組成。
netfilter 組件也稱為 內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規(guī)則集。
iptables 組件是一種工具,也稱為 用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規(guī)則變得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否則需要從 netfilter.org 下載該工具并安裝使用它。
通過使用用戶空間,可以構建自己的定制規(guī)則,這些規(guī)則存儲在內核空間的信息包過濾表中。這些規(guī)則具有 目標,它們告訴內核對來自某些源、前往某些目的地或具有某些協(xié)議類型的信息包做些什么。如果某個信息包與規(guī)則匹配,那么使用目標 ACCEPT 允許該信息包通過。還可以使用目標 DROP 或 REJECT 來阻塞并殺死信息包。對于可對信息包執(zhí)行的其它操作,還有許多其它目標。
根據規(guī)則所處理的信息包的類型,可以將規(guī)則分組在鏈中。處理入站信息包的規(guī)則被添加到 INPUT 鏈中。處理出站信息包的規(guī)則被添加到 OUTPUT 鏈中。處理正在轉發(fā)的信息包的規(guī)則被添加到 FORWARD 鏈中。這三個鏈是基本信息包過濾表中內置的缺省主鏈。另外,還有其它許多可用的鏈的類型(如 PREROUTING 和 POSTROUTING ),以及提供用戶定義的鏈。每個鏈都可以有一個 策略,它定義“缺省目標”,也就是要執(zhí)行的缺省操作,當信息包與鏈中的任何規(guī)則都不匹配時,執(zhí)行此操作。
建立規(guī)則并將鏈放在適當的位置之后,就可以開始進行真正的信息包過濾工作了。這時內核空間從用戶空間接管工作。當信息包到達防火墻時,內核先檢查信息包的頭信息,尤其是信息包的目的地。我們將這個過程稱為 路由。
如果信息包源自外界并前往系統(tǒng),而且防火墻是打開的,那么內核將它傳遞到內核空間信息包過濾表的 INPUT 鏈。如果信息包源自系統(tǒng)內部或系統(tǒng)所連接的內部網上的其它源,并且此信息包要前往另一個外部系統(tǒng),那么信息包被傳遞到 OUTPUT 鏈。類似的,源自外部系統(tǒng)并前往外部系統(tǒng)的信息包被傳遞到 FORWARD 鏈。
接下來,將信息包的頭信息與它所傳遞到的鏈中的每條規(guī)則進行比較,看它是否與某條規(guī)則完全匹配。如果信息包與某條規(guī)則匹配,那么內核就對該信息包執(zhí)行由該規(guī)則的目標指定的操作。但是,如果信息包與這條規(guī)則不匹配,那么它將與鏈中的下一條規(guī)則進行比較。***,如果信息包與鏈中的任何規(guī)則都不匹配,那么內核將參考該鏈的策略來決定如何處理該信息包。理想的策略應該告訴內核 DROP 該信息包。 圖 1 用圖形說明了這個信息包過濾過程。
圖 1. 信息包過濾過程#p#
安裝 netfilter/iptables 系統(tǒng)
因為 netfilter/iptables 的 netfilter 組件是與內核 2.4.x 集成在一起的,所以只需要下載并安裝 iptables 用戶空間工具。
需求
下面是安裝 netfilter/iptables 系統(tǒng)的需求:
硬件:要使用 netfilter/iptables,需要有一個運行 Linux OS 并連接到因特網、LAN 或 WAN 的系統(tǒng)。
軟件:帶有內核 2.4 或更高版本的任何版本的 Linux OS。可以從 http://www.kernel.org 下載***版本的內核。還需要從 http://www.netfilter.org 下載 iptables 這個用戶空間工具,因為這個工具不是內核的一部分。但對于 RedHat Linux 版本 7.1 或更高版本,不需要下載此工具,因為在版本 7.1 或更高版本中,標準安裝中已經包含了此工具。
用戶:至少對 Linux OS 有中等水平的了解,以及具備配置 Linux 內核的經驗。
安裝前的準備
在開始安裝 iptables 用戶空間工具之前,需要對系統(tǒng)做某些修改。首先,需要使用 make config 命令來配置內核的選項。在配置期間,必須通過將 CONFIG_NETFILTER 和 CONFIG_IP_NF_IPTABLES 選項設置為 Y 來打開它們,因為這是使 netfilter/iptables 工作所必需的。下面是可能要打開的其它選項:
CONFIG_PACKET : 如果要使應用程序和程序直接使用某些網絡設備,那么這個選項是有用的。
CONFIG_IP_NF_MATCH_STATE : 如果要配置 有狀態(tài)的防火墻,那么這個選項非常重要而且很有用。這類防火墻會記得先前關于信息包過濾所做的決定,并根據它們做出新的決定。我將在 netfilter/iptables 系統(tǒng)的優(yōu)點一節(jié)中進一步討論這方面的問題。
CONFIG_IP_NF_FILTER : 這個選項提供一個基本的信息包過濾框架。如果打開這個選項,則會將一個基本過濾表(帶有內置的 INPUT 、 FORWARD 和 OUTPUT 鏈)添加到內核空間。
CONFIG_IP_NF_TARGET_REJECT : 這個選項允許指定:應該發(fā)送 ICMP 錯誤消息來響應已被 DROP 掉的入站信息包,而不是簡單地殺死它們。
現(xiàn)在,可以準備安裝這個用戶空間工具了。#p#
安裝用戶空間工具
在下載 iptables 用戶空間工具的源代碼(它類似于 iptables-1.2.6a.tar.bz2)之后,可以開始安裝。您需要以 root 身份登錄來執(zhí)行安裝。 清單 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 或更高版本,就不需要執(zhí)行這里說明的前兩個步驟。正如我們所知道的,該 Linux 分發(fā)版(distribution)的標準安裝中包含了 iptables 用戶空間工具。但在缺省情況下,這個工具是關閉的。為了使該工具運行,需要執(zhí)行以下步驟( 清單 2):
清單 2. 在 RedHat 7.1 系統(tǒng)上設置用戶空間工具的示例
- 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.
現(xiàn)在,一切都已妥當,并且 netfilter/iptables 系統(tǒng)應該正在運行,接下來,需要建立一些規(guī)則和鏈來過濾信息包。#p#
建立規(guī)則和鏈
通過向防火墻提供有關對來自某個源、到某個目的地或具有特定協(xié)議類型的信息包要做些什么的指令,規(guī)則控制信息包的過濾。通過使用 netfilter/iptables 系統(tǒng)提供的特殊命令 iptables ,建立這些規(guī)則,并將其添加到內核空間的特定信息包過濾表內的鏈中。關于添加/除去/編輯規(guī)則的命令的一般語法如下:
$ iptables [-t table] command [match] [target]
表(table)
[-t table] 選項允許使用標準表之外的任何表。表是包含僅處理特定類型信息包的規(guī)則和鏈的信息包過濾表。有三種可用的表選項: filter 、 nat 和 mangle 。該選項不是必需的,如果未指定,則 filter 用作缺省表。
filter 表用于一般的信息包過濾,它包含 INPUT 、 OUTPUT 和 FORWARD 鏈。nat 表用于要轉發(fā)的信息包,它包含 PREROUTING 、 OUTPUT 和 POSTROUTING 鏈。如果信息包及其頭內進行了任何更改,則使用 mangle 表。該表包含一些規(guī)則來標記用于高級路由的信息包,該表包含 PREROUTING 和 OUTPUT 鏈。
注: PREROUTING 鏈由指定信息包一到達防火墻就改變它們的規(guī)則所組成,而 POSTROUTING 鏈由指定正當信息包打算離開防火墻時改變它們的規(guī)則所組成。
命令(command)
上面這條命令中具有強制性的 command 部分是 iptables 命令的最重要部分。它告訴 iptables 命令要做什么,例如,插入規(guī)則、將規(guī)則添加到鏈的末尾或刪除規(guī)則。以下是最常用的一些命令:
-A 或 --append : 該命令將一條規(guī)則附加到鏈的末尾。
示例:
$ iptables -A INPUT -s 205.168.0.1 -j ACCEPT
該示例命令將一條規(guī)則附加到 INPUT 鏈的末尾,確定來自源地址 205.168.0.1 的信息包可以 ACCEPT 。
-D 或 --delete : 通過用 -D 指定要匹配的規(guī)則或者指定規(guī)則在鏈中的位置編號,該命令從鏈中刪除該規(guī)則。下面的示例顯示了這兩種方法。
示例:
$ iptables -D INPUT --dport 80 -j DROP
$ iptables -D OUTPUT 3
***條命令從 INPUT 鏈刪除規(guī)則,它指定 DROP 前往端口 80 的信息包。第二條命令只是從 OUTPUT 鏈刪除編號為 3 的規(guī)則。
-P 或 --policy : 該命令設置鏈的缺省目標,即策略。所有與鏈中任何規(guī)則都不匹配的信息包都將被強制使用此鏈的策略。
示例:
$ iptables -P INPUT DROP
該命令將 INPUT 鏈的缺省目標指定為 DROP 。這意味著,將丟棄所有與 INPUT 鏈中任何規(guī)則都不匹配的信息包。
-N 或 --new-chain : 用命令中所指定的名稱創(chuàng)建一個新鏈。
示例:
$ iptables -N allowed-chain
-F 或 --flush : 如果指定鏈名,該命令刪除鏈中的所有規(guī)則,如果未指定鏈名,該命令刪除所有鏈中的所有規(guī)則。此參數用于快速清除。
示例:
$ iptables -F FORWARD
$ iptables -F
-L 或 --list : 列出指定鏈中的所有規(guī)則。
示例:
$ iptables -L allowed-chain#p#
匹配(match)
iptables 命令的可選 match 部分指定信息包與規(guī)則匹配所應具有的特征(如源和目的地地址、協(xié)議等)。匹配分為兩大類: 通用匹配和 特定于協(xié)議的匹配。這里,我將研究可用于采用任何協(xié)議的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其示例和說明:
-p 或 --protocol : 該通用協(xié)議匹配用于檢查某些特定協(xié)議。協(xié)議示例有 TCP 、 UDP 、 ICMP 、用逗號分隔的任何這三種協(xié)議的組合列表以及 ALL (用于所有協(xié)議)。 ALL 是缺省匹配??梢允褂?! 符號,它表示不與該項匹配。
示例:
$ iptables -A INPUT -p TCP, UDP
$ iptables -A INPUT -p ! ICMP
在上述示例中,這兩條命令都執(zhí)行同一任務 — 它們指定所有 TCP 和 UDP 信息包都將與該規(guī)則匹配。通過指定 ! ICMP ,我們打算允許所有其它協(xié)議(在這種情況下是 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
第二條命令指定該規(guī)則與所有來自 192.168.0.0 到 192.168.0.24 的 IP 地址范圍的信息包匹配。第三條命令指定該規(guī)則將與除來自源地址 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#p#
目標(target)
我們已經知道,目標是由規(guī)則指定的操作,對與那些規(guī)則匹配的信息包執(zhí)行這些操作。除了允許用戶定義的目標之外,還有許多可用的目標選項。下面是常用的一些目標及其示例和說明:
ACCEPT : 當信息包與具有 ACCEPT 目標的規(guī)則完全匹配時,會被接受(允許它前往目的地),并且它將停止遍歷鏈(雖然該信息包可能遍歷另一個表中的其它鏈,并且有可能在那里被丟棄)。該目標被指定為 -j ACCEPT 。
DROP : 當信息包與具有 DROP 目標的規(guī)則完全匹配時,會阻塞該信息包,并且不對它做進一步處理。該目標被指定為 -j DROP 。
REJECT : 該目標的工作方式與 DROP 目標相同,但它比 DROP 好。和 DROP 不同, REJECT 不會在服務器和客戶機上留下死套接字。另外, REJECT 將錯誤消息發(fā)回給信息包的發(fā)送方。該目標被指定為 -j REJECT 。
示例:
$ iptables -A FORWARD -p TCP --dport 22 -j REJECT
RETURN : 在規(guī)則中設置的 RETURN 目標讓與該規(guī)則匹配的信息包停止遍歷包含該規(guī)則的鏈。如果鏈是如 INPUT 之類的主鏈,則使用該鏈的缺省策略處理信息包。它被指定為 -jump RETURN 。示例:
$ iptables -A FORWARD -d 203.16.1.89 -jump RETURN
還有許多用于建立高級規(guī)則的其它目標,如 LOG 、 REDIRECT 、 MARK 、 MIRROR 和 MASQUERADE 等。
保存規(guī)則
現(xiàn)在,您已經學習了如何建立基本的規(guī)則和鏈以及如何從信息包過濾表中添加或刪除它們。但是,您應該記?。河蒙鲜龇椒ㄋ⒌囊?guī)則會被保存到內核中,當重新引導系統(tǒng)時,會丟失這些規(guī)則。所以,如果您將沒有錯誤的且有效的規(guī)則集添加到信息包過濾表,同時希望在重新引導之后再次使用這些規(guī)則,那么必須將該規(guī)則集保存在文件中??梢允褂?iptables-save命令來做到這一點:
$ iptables-save > iptables-script
現(xiàn)在,信息包過濾表中的所有規(guī)則都被保存在文件 iptables-script 中。無論何時再次引導系統(tǒng),都可以使用 iptables-restore命令將規(guī)則集從該腳本文件恢復到信息包過濾表,如下所示:
$ iptables-restore iptables-script
如果您愿意在每次引導系統(tǒng)時自動恢復該規(guī)則集,則可以將上面指定的這條命令放到任何一個初始化 shell 腳本中。#p#
netfilter/iptables 系統(tǒng)的優(yōu)點
netfilter/iptables 的***優(yōu)點是它可以配置有狀態(tài)的防火墻,這是 ipfwadm 和 ipchains 等以前的工具都無法提供的一種重要功能。有狀態(tài)的防火墻能夠指定并記住為發(fā)送或接收信息包所建立的連接的狀態(tài)。防火墻可以從信息包的連接跟蹤狀態(tài)獲得該信息。在決定新的信息包過濾時,防火墻所使用的這些狀態(tài)信息可以增加其效率和速度。這里有四種有效狀態(tài),名稱分別為 ESTABLISHED 、 INVALID 、 NEW 和 RELATED 。
狀態(tài) ESTABLISHED 指出該信息包屬于已建立的連接,該連接一直用于發(fā)送和接收信息包并且完全有效。 INVALID 狀態(tài)指出該信息包與任何已知的流或連接都不相關聯(lián),它可能包含錯誤的數據或頭。狀態(tài) NEW 意味著該信息包已經或將啟動新的連接,或者它與尚未用于發(fā)送和接收信息包的連接相關聯(lián)。***, RELATED 表示該信息包正在啟動新連接,以及它與已建立的連接相關聯(lián)。
netfilter/iptables 的另一個重要優(yōu)點是,它使用戶可以完全控制防火墻配置和信息包過濾。您可以定制自己的規(guī)則來滿足您的特定需求,從而只允許您想要的網絡流量進入系統(tǒng)。
另外,netfilter/iptables 是免費的,這對于那些想要節(jié)省費用的人來說十分理想,它可以代替昂貴的防火墻解決方案。
結束語
***的 Linux 內核 2.4.x 具有 netfilter/iptables 系統(tǒng)這種內置的 IP 信息包過濾工具,它使配置防火墻和信息包過濾變得便宜且方便。netfilter/iptables 系統(tǒng)使其用戶可以完全控制防火墻配置和信息包過濾。它允許為防火墻建立可定制化的規(guī)則來控制信息包過濾。它還允許配置有狀態(tài)的防火墻。