我轉載的這篇文章對iptables進行了比較深入且清晰的總結。非常值得學習。根據自己需要對本文進行了適當的刪減以更便於閱讀學習。現總結如下:
本文提及了 iptables的主要的內容“三表:FILTER、NAT、MANGLE;五鏈:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING”。其中對規則、鏈、表都進行了比較清楚的定義。
規則:是防火牆用來對數據包進行處理的依據。
鏈:是處理同一種數據包類型的規則的組合,這裏的類型主要是從數據包的走向及處理時機兩個維度來劃分的,如INPUT是流入Linux的數據包、OUTPUT是流出的、FORWARD是本系統需要轉發的、PROROUTING是需要在流入防火牆前處理的、POSTROUTING是在流出防火牆之前處理的<後兩種鏈更注重處理包的時機而非方向>。其中INPUT、OUTPUT、FORWARD爲表內置的缺省主鏈。需要注意的是每個鏈都有一個缺省的規則。可用通過 --policy參數設置。
表:是處理同一類型的鏈及規則組成的集合。這裏的類型主要是對信息報進行怎樣的處理這個角度來劃分的。比如 FILTER表主要是用於對一般信息的過濾(注:這個是在iptables命令中不指定表時的默認表);NAT表主要是用於要轉發的數據包;MANGLE表主要是針對信息包或者頭進行了變更的信息包的處理。
iptables對信息包的處理(操作、target)主要有: ACCEPT、DROP、REJECT,另外還有一個RETURN。其中需要注意的是REJECT會發信息給對端、而DROP不會,而RETURN會執行主鏈(3個)中的缺省規則。
另外,對於iptables的設置在系統重啓之後會丟失、而防止丟失就要用到 iptables-save命令保存到文件中、在丟失的情況下用iptables-restore命令來重新載入。
本文還指出了 iptables是由內核空間的netfilter及用戶空間的iptables共同組成的。完成防火牆工作的是netfilter。
##############以下爲轉載文章,最後有出處##############
netfilter/iptables 簡介
netfilter/iptables是與最新的 2.4.x 版本 Linux 內核集成的 IP 信息包過濾系統。
Linux 安全性和 netfilter/iptables
針對網絡上 Linux 系統的防火牆配置。 可以在 netfilter/iptables IP 信息包過濾系統(它集成在 2.4.x 版本的 Linux 內核中)的幫助下運用這種能力。
在如 ipfwadm和 ipchains 這樣的 Linux 信息包過濾解決方案中,netfilter/iptables IP 信息包過濾系統是最新的解決方案, 而且也是第一個集成到 Linux 內核的解決方案。
理解防火牆配置和信息包過濾
對於連接到網絡上的 Linux 系統來說,防火牆是必不可少的防禦機制, 它只允許合法的網絡流量進出系統,而禁止其它任何網絡流量。爲了確定網絡流量是否合法, 防火牆依靠它所包含的由網絡或系統管理員預定義的一組 規則。 這些規則告訴防火牆某個流量是否合法以及對於來自某個源、至某個目的地或具有某種協議類型的網絡流量要做些什麼。 術語“配置防火牆”是指添加、修改和除去這些規則。稍後,我將詳細討論這些規則。
網絡流量由 IP 信息包(或,簡稱 信息包)— 以流的形式從源系統傳輸到目的地系統的一些小塊數據 — 組成。 這些信息包有 頭,即在每個包前面所附帶的一些數據位,它們包含有關信息包的源、目的地和協議類型的信息。防火牆根據一組規則檢查這些頭,以確定接受哪個信息包以及拒絕哪個信息包。我們將該過程稱爲 信息包過濾。
爲什麼要配置自己的防火牆?
出於各種因素和原因,需要根據特定需求來配置防火牆。 或許,最重要的原因是安全性。
管理員可能想讓他們的防火牆能夠阻止未經授權的源訪問其 Linux 系統,例如通過 Telnet。 他們可能還想限制進出其系統的網絡流量,以便只有來自可信源的流量纔可以進入其系統,以及只有授權的流量纔可以出去。 家庭用戶可能通過允許所有的出站信息包都可以通過,將防火牆配置成較低的安全性級別。
另一個背後的原因是,通過阻塞來自類似廣告站點之類的源的多餘流量,可以節省帶寬。
因而,可以定製防火牆配置來滿足任何特定需求和任何安全性級別需求。 這就是 netfilter/iptables 系統的用武之處。
netfilter/iptables 系統是如何工作的?
netfilter/iptables IP 信息包過濾系統是一種功能強大的工具, 可用於添加、編輯和除去規則,這些規則是在做信息包過濾決定時,防火牆所遵循和組成的規則。這些規則存儲在專用的信息包過濾表中, 而這些表集成在 Linux 內核中。 在信息包過濾表中,規則被分組放在我們所謂的 鏈(chain)中。我馬上會詳細討論這些規則以及如何建立這些規則並將它們分組在鏈中。
雖然 netfilter/iptables IP 信息包過濾系統被稱爲單個實體,但它實際上由兩個組件 netfilter和 iptables 組成。
netfilter 組件也稱爲 內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成, 這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種工具,也稱爲 用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。 除非您正在使用 Red HatLinux 7.1 或更高版本,否則需要從 netfilter.org 下載該工具並安裝使用它。
通過使用用戶空間,可以構建自己的定製規則,這些規則存儲在內核空間的信息包過濾表中。 這些規則具有 目標,它們告訴內核對來自某些源、前往某些目的地或具有某些協議類型的信息包做些什麼。
1)如果某個信息包與規則匹配,那麼使用目標 ACCEPT 允許該信息包通過。
2)還可以使用目標 DROP 或 REJECT 來阻塞並殺死信息包。
對於可對信息包執行的其它操作,還有許多其它目標。
根據規則所處理的信息包的類型,可以將規則分組在鏈中。
1)處理入站信息包的規則被添加到 INPUT 鏈中。
2)處理出站信息包的規則被添加到OUTPUT 鏈中。
3)處理正在轉發的信息包的規則被添加到 FORWARD 鏈中。
這三個鏈是基本信息包過濾表中內置的缺省主鏈。 另外,還有其它許多可用的鏈的類型(如4) PREROUTING 和 5)POSTROUTING ), 以及提供用戶定義的鏈。每個鏈都可以有一個 策略, 它定義“缺省目標”,也就是要執行的缺省操作,當信息包與鏈中的任何規則都不匹配時,執行此操作。
建立規則並將鏈放在適當的位置之後,就可以開始進行真正的信息包過濾工作了。 這時內核空間從用戶空間接管工作。當信息包到達防火牆時,內核先檢查信息包的頭信息,尤其是信息包的目的地。 我們將這個過程稱爲 路由。
如果信息包源自外界並前往系統,而且防火牆是打開的,那麼內核將它傳遞到內核空間信息包過濾表的 INPUT 鏈。如果信息包源自系統內部或系統所連接的內部網上的其它源,並且此信息包要前往另一個外部系統, 那麼信息包被傳遞到 OUTPUT 鏈。類似的,源自外部系統並前往外部系統的信息包被傳遞到 FORWARD 鏈。
接下來,將信息包的頭信息與它所傳遞到的鏈中的每條規則進行比較,看它是否與某條規則完全匹配。 如果信息包與某條規則匹配,那麼內核就對該信息包執行由該規則的目標指定的操作。 但是,如果信息包與這條規則不匹配,那麼它將與鏈中的下一條規則進行比較。 最後,如果信息包與鏈中的任何規則都不匹配,那麼內核將參考該鏈的策略來決定如何處理該信息包。 理想的策略應該告訴內核 DROP 該信息包。 圖1 用圖形說明了這個信息包過濾過程。
圖 1. 信息包過濾過程
建立規則和鏈
通過向防火牆提供有關對來自某個源、到某個目的地或具有特定協議類型的信息包要做些什麼的指令,規則控制信息包的過濾。 通過使用netfilter/iptables 系統提供的特殊命令 iptables ,建立這些規則,並將其添加到內核空間的特定信息包過濾表內的鏈中。關於添加/除去/編輯規則的命令的一般語法如下:
$ iptables [-t table] command [match] [target]
表(table)
[-t table] 選項允許使用標準表之外的任何表。表是包含僅處理特定類型信息包的規則和鏈的信息包過濾表。 有三種可用的表選項: filter、 nat 和 mangle 。該選項不是必需的,如果未指定,則 filter 用作缺省表。
1) filter 表用於一般的信息包過濾,它包含 INPUT 、 OUTPUT 和 FORWARD 鏈。
2) nat 表用於要轉發的信息包,它包含 PREROUTING 、 OUTPUT 和POSTROUTING 鏈。
3) 如果信息包及其頭內進行了任何更改,則使用 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 #這裏的/24不是CIDR中的子網掩碼?待確認
$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 。
1) 狀態 ESTABLISHED 指出該信息包屬於已建立的連接,該連接一直用於發送和接收信息包並且完全有效。
2) INVALID 狀態指出該信息包與任何已知的流或連接都不相關聯,它可能包含錯誤的數據或頭。
3) 狀態 NEW 意味着該信息包已經或將啓動新的連接,或者它與尚未用於發送和接收信息包的連接相關聯。
4) 最後, RELATED 表示該信息包正在啓動新連接,以及它與已建立的連接相關聯。
netfilter/iptables 的另一個重要優點是,它使用戶可以完全控制防火牆配置和信息包過濾。您可以定製自己的規則來滿足您的特定需求,從而只允許您想要的網絡流量進入系統。
另外,netfilter/iptables是免費的,這對於那些想要節省費用的人來說十分理想,它可以代替昂貴的防火牆解決方案。
結束語
Linux 內核 >= 2.4.x 具有netfilter/iptables 系統這種內置的 IP 信息包過濾工具,它使配置防火牆和信息包過濾變得便宜且方便。netfilter/iptables 系統使其用戶可以完全控制防火牆配置和信息包過濾。 它允許爲防火牆建立可定製化的規則來控制信息包過濾。它還允許配置有狀態的防火牆。
源文檔 <https://www.ibm.com/developerworks/cn/linux/network/s-netip/>