使用netfilter/iptables配置防火牆(轉)

post0發表於2007-08-10
使用netfilter/iptables配置防火牆(轉)[@more@]

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. 資訊包過濾過程

http://www-900.ibm.com/developerWorks/cn/linux/network/s-netip/diagram1.jpg

安裝 netfilter/iptables 系統

因為 netfilter/iptables 的 netfilter 元件是與核心 2.4.x 整合在一起的,所以只需要下載並安裝 iptables 使用者空間工具。

需求

下面是安裝 netfilter/iptables 系統的需求:

硬體:要使用 netfilter/iptables,需要有一個執行 Linux OS 並連線到因特網、LAN 或 WAN 的系統。

軟體:帶有核心 2.4 或更高版本的任何版本的 Linux OS。可以從 下載最新版本的核心。還需要從 下載 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 技術的技術性文章。可以透過 vmugdha@indiatimes.com 與 Mugdha 聯絡

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-940805/,如需轉載,請註明出處,否則將追究法律責任。

相關文章