深入淺出Netfilter/iptables防火墻框架(基礎篇)
原創【51CTO獨家特稿】Linux系統管理員們都接觸過Netfilter/iptables,這是Linux系統自帶的免費防火墻,功能十分強大。在接下來的這個《深入淺出Netfilter/iptables防火墻框架》系列中,51CTO安全/Linux專家李洋將對Netfilter/iptables進行詳盡的、條理的介紹。本文是基礎篇,先介紹Netfilter/iptables框架的原理。
1、Netfilter/iptables框架簡介
Netfilter/iptables可以對流入和流出的信息進行細化控制,且可以在一臺低配置機器上很好地運行,被認為是Linux中實現包過濾功能的第四代應用程序。Netfilter/iptables包含在Linux 2.4以后的內核中,可以實現防火墻、NAT(網絡地址翻譯)和數據包的分割等功能。netfilter工作在內核內部,而iptables則是讓用戶定義規則集的表結構。Netfilter/iptables從ipchains和ipwadfm(IP防火墻管理)演化而來,功能更加強大。
這里所說的iptables是ipchains的后繼工具,但具有更強的可擴展性。內核模塊可以注冊一個新的規則表(table),并要求數據包流經指定的規則表。這種數據包選擇用于實現數據報過濾(filter表),網絡地址轉換(NAT表)及數據報處理(mangle表)。Linux 2.4內核及其以上版本提供的這三種數據報處理功能都基于netfilter的鉤子函數和IP表,都是相互間獨立的模塊,完美地集成到了由netfilter提供的框架中,如圖1所示。netfilter主要提供了如下三項功能:
- 包過濾:filter表格不會對數據報進行修改,而只對數據報進行過濾。iptables優于ipchains的一個方面就是它更為小巧和快速。它是通過鉤子函數NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。
- NAT:NAT表格監聽三個netfilter鉤子函數:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。NF_IP_PRE_ROUTING實現對需要轉發數據報的源地址進行地址轉換,而NF_IP_POST_ROUTING則對需要轉發的數據報目的地址進行地址轉換。對于本地數據報目的地址的轉換,則由NF_IP_LOCAL_OUT來實現。
- 數據報處理:mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT鉤子中進行注冊。使用mangle表,可以實現對數據報的修改或給數據報附上一些外帶數據。當前mangle表支持修改TOS位及設置skb的nfmard字段。

圖1 Netfilter/Iptables框架結構示意圖
根據實際情況,靈活運用Netfilter/iptables框架,生成相應的防火墻規則可以方便、高效地阻斷部分網絡攻擊以及非法數據報(參見圖2所示的工作原理)。然而,由于配置了防火墻,可能引起諸如FTP、QQ、MSN等協議和軟件無法使用或者某些功能無法正常使用,也有可能引起RPC(遠程過程調用)無法執行,這需要用戶根據實際情況來配置相應的服務代理程序來開啟這些服務。需要特別提醒注意的是,防火墻也可能被內部攻擊,其并不是萬能的,還需要綜合使用其他防護手段。內部人員由于無法通過Telnet瀏覽郵件或使用FTP向外發送信息,個別人會對防火墻不滿進而可能對其進行攻擊和破壞。而且,攻擊的目標常常是防火墻或防火墻運行的操作系統,這極大地危害了防火墻系統甚至是關鍵信息系統的安全。

圖2 Netfilter/Iptables框架工作原理示意
#p#
2、iptables基本原理
通過向防火墻提供有關對來自某個源、到某個目的地或具有特定協議類型的信息包要做些什么的指令,規則控制信息包的過濾。通過使用Netfilter/iptables系統提供的特殊命令iptables,建立這些規則,并將其添加到內核空間的特定信息包過濾表內的鏈中。關于添加/除去/編輯規則的命令的一般語法如下:
iptables [-t table] command [match] [target]
不難看出,一條iptables規則包含如下4個基本元素:
- 表
- 命令
- 匹配
- 目標
1) 表(table)
[-t table]選項允許使用標準表之外的任何表。表是包含僅處理特定類型信息包的規則和鏈的信息包過濾表。有三種可用的表選項:filter、nat和mangle。該選項不是必需的,如果未指定,則filter用作默認表。filter表用于一般的信息包過濾,包含INPUT、OUTPUT和FORWAR鏈。nat表用于要轉發的信息包,它包含PREROUTING、OUTPUT和POSTROUTING鏈。如果信息包及其頭內進行了任何更改,則使用mangle表。該表包含一些規則來標記用于高級路由的信息包以及PREROUTING和OUTPUT鏈。
2) 命令(command)
command部分是iptables命令的最重要部分,它告訴iptables命令要做什么,例如,插入規則、將規則添加到鏈的末尾或刪除規則。主要有如表1所示的命令。
表1 iptables常用命令
| 命 令 | 說 明 |
| -A或--append | 該命令將一條規則附加到鏈的末尾 |
| -D或--delete | 通過用-D指定要匹配的規則或者指定規則在鏈中的位置編號,該命令從鏈中刪除該規則 |
| -P或--policy | 該命令設置鏈的默認目標,即策略。所有與鏈中任何規則都不匹配的信息包都將被強制使用此鏈的策略 |
| -N或--new-chain | 用命令中所指定的名稱創建一個新鏈 |
| -F或--flush | 如果指定鏈名,該命令刪除鏈中的所有規則,如果未指定鏈名,該命令刪除所有鏈中的所有規則。此參數用于快速清除 |
| -L或--list | 列出指定鏈中的所有規則 |
| -R或--replace | 替換指定鏈中一條匹配的規則 |
| -X或--delete-chain | 刪除指定用戶的的定義鏈,若沒有指定鏈,則刪除所有的用戶鏈 |
| -C或--check | 檢查數據包是否與指定鏈的規則相匹配 |
| -Z或--zero | 將指定鏈中所有規則的byte計數器清零 |
3) 匹配(match)
iptables命令的可選match部分指定信息包與規則匹配所應具有的特征(如源和目的地地址、協議等)。匹配分為兩大類:通用匹配和特定于協議的匹配。這里,將研究可用于采用任何協議的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其說明,如表2所示。
表2 通用匹配說明
| 通用匹配 | 說 明 |
| -p或--protocol | 該通用協議匹配用于檢查某些特定協議。協議示例有TCP、UDP、ICMP、用逗號分隔的任何這三種協議的組合列表以及ALL(用于所有協議)。ALL是默認匹配。可以使用!符號表示不與該項匹配 |
| -s 或 --source | 該源匹配用于根據信息包的源IP地址來與它們匹配。該匹配還允許對某一范圍內的IP地址進行匹配,可以使用!符號,表示不與該項匹配。默認源匹配與所有IP地址匹配 |
| -d 或 --destination | 該目的地匹配用于根據信息包的目的地IP地址來與它們匹配。該匹配還允許對某一范圍內IP地址進行匹配,可以使用!符號表示不與該項匹配 |
| --sport | 指定匹配規則的源端口或端口范圍 |
| --dport | 指定匹配規則的目的端口或端口范圍 |
| -i | 匹配單獨的網絡接口或某種類型的接口設置過濾規則 |
4) 目標(target)
前面已經講過,目標是由規則指定的操作,對與那些規則匹配的信息包執行這些操作。除了允許用戶定義的目標之外,還有許多可用的目標選項。下面是常用的一些目標及其示例和說明,如表3所示。
表3 目標項說明
| 目 標 項 | 說 明 |
| ACCEPT | 當信息包與具有ACCEPT目標的規則完全匹配時,會被接受(允許它前往目的地) |
| DROP | 當信息包與具有DROP目標的規則完全匹配時,會阻塞該信息包,并且不對它做進一步處理。該目標被指定為-j DROP |
| REJECT | 該目標的工作方式與DROP目標相同,但它比DROP好。和DROP不同,REJECT不會在服務器和客戶機上留下死套接字。另外,REJECT將錯誤消息發回給信息包的發送方。該目標被指定為-j REJECT |
| RETURN | 在規則中設置的RETURN目標讓與該規則匹配的信息包停止遍歷包含該規則的鏈。如果鏈是如INPUT之類的主鏈,則使用該鏈的默認策略處理信息包。它被指定為-jump RETURN |
| LOG | 表示將包的有關信息記錄入日志 |
| TOS | 表示改寫數據包的TOS值 |
下一篇:深入淺出Netfilter/iptables防火墻框架(入門篇)
【編輯推薦】





















