IPTables工具及其與netfilter關係介紹
IPTables概述
IPTables是基於Netfilter基本架構實現的一個可擴充套件的資料報高階管理系統或核外配置工具,利用table、chain、rule三級來儲存資料報的各種規則。Netfilter-iptables由兩部分組成,一部分是Netfilter的"鉤子",另一部分則是知道這些鉤子函式如何工作的一套規則--這些規則儲存在被稱為iptables的資料結構之中。鉤子函式通過訪問iptables來判斷應該返回什麼值給Netfilter框架。
系統預定義了三個table:
· filter:資料報過濾表(檔案net/ipv4/netfilter/iptable_filter.c
監聽NF_IP_LOCAL_IN、NF_IP_FORWARD和NF_IP_LOCAL_OUT三個HOOK,作用是在所有資料報傳遞的關鍵點上對其進行過濾。
· nat:網路地址轉換表
監聽NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING和NF_IP_LOCAL_OUT三個HOOK,作用是當新連線的第一個資料報經過時,在nat表中決定對其的轉換操作;而後面的其它資料報都將根據第一個資料報的結果進行相同的轉換處理。該模組以ConnectionTracking模組為基礎,僅對每個連線的第一個報文進行匹配和處理,然後交由ConnectionTracking
· mangle:資料報修改表(位於net/ipv4/netfilter/iptable_mangle.c)
監聽NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT兩個HOOK,作用是修改資料報報頭中的一些值。
核心程式設計人員還可以通過注入模組,呼叫Netfilter的介面函式建立新的iptables。iptables
IPTables的實現
1)表的實現
表的基本資料結構是ipt_table(位於include/Linux/netfilter_ipv4/ip_tables.h,Line413):
struct ipt_table{ struct list_head list; // 一個雙向連結串列 char name[IPT_TABLE_MAXNAMELEN]; //被使用者空間使用的表函式的名字 struct ipt_replace *table; //表初始化的模板,定義一個初始化用的
//該表的所預設的HOOK所包含的規則等資訊, // 使用者通過系統呼叫進行表的替換時也要用 unsigned int valid_hooks; // 表所監聽的HOOK,實質是一個位圖 rwlock_t lock; // 整個表的讀/寫自旋鎖 struct ipt_table_info *private; //表所儲存的資料資訊,也就是實際的資料區, // 僅在處理ipt_table的程式碼內部使用 struct module *me; //如果是模組,那麼取THIS_MODULE,否則取NULL};
上文所提到的filter、nat和mangle表分別是ipt_table這個資料結構的三個例項:packet_filter(位於net/ipv4/netfilter/iptable_filter.c,Line84)、nat_table(位於net/ipv4/netfilter/ip_nat_rule.c,Line104)以及packet_mangler(位於net/ipv4/netfilter/iptable_mangle.c,Line117)。
……
2)規則的實現
一個完整的規則由三個資料結構共同實現,分別是:
a.一個ipt_entry結構,儲存規則的整體資訊;
b.0或多個ipt_entry_match結構,存放各種match,每個結構都可以存放任意的資料,這樣也就擁有了良好的可擴充套件性;
c.1個ipt_entry_target結構,存放規則的target,類似的,每個結構也可以存放任意的資料。
……
IPTables的使用
通過使用iptables系統提供的特殊命令iptables建立這些規則,並將其新增到核心空間特定資訊包過濾表內的鏈中。關於新增、去除、編輯規則的命令,一般指令碼語法如下:
iptables [-t table] command [match][target]
1.表(table)
[-t table]選項允許使用標準表之外的任何表。表是包含僅處理特定型別資訊包的規則和鏈的資訊包過濾表。
2.命令(command)
command部分是iptables命令最重要的部分。它告訴iptables命令要做什麼,例如插入規則、將規則新增到鏈的末尾或刪除規則。表1是最常用的一些命令及例子。
表1 命令的功能和樣例
3.匹配(match)
iptables命令的可選match部分指定資訊包與規則匹配所應具有的特徵(如源地址、目的地址、協議等)。匹配分為通用匹配和特定於協議的匹配兩大類。這裡將介紹可用於採用任何協議的資訊包的通用匹配。表2是一些重要且常用的通用匹配及示例說明。
表2 通用匹配及示例說明
4.目標(target)
目標是由規則指定的操作,對與那些規則匹配的資訊包執行這些操作。除了允許使用者定義的目標之外,還有許多可用的目標選項。表3是常用的一些目標及示例說明。
除表3外,還有許多用於建立高階規則的其它目標,如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。
表3 目標及示例說明
Netfilter與iptables的關係
常聽說linux防火牆叫做“iptables”,其實這樣的稱呼並不是很正確,什麼是iptables呢?在前面提過Netfilter所需要的規則是存放在記憶體中的,但問題是防火牆管理人員該如何將規則存放到記憶體呢?因此,防火牆管理人員會需要一個規則編輯工具,通過這個工具來對記憶體中的規則執行新增、刪除及修改等操作,這個工具就是iptables以及ip6tables,其中iptables是在IPV4網路環境中使用,而ip6tables是在IPV6網路環境中使用,因此,Linux防火牆比較正確的名稱應該是Netfilter/iptables。
此外,對於iptables結構上的問題我們必須加以瞭解,前面曾提到,Netfilter的模組越多,防火牆的功能也就越多,而且我們可以通過升級核心的方式來達到一起升級Netfilter的目的。不過,防火牆的升級不是僅僅升級核心就可以解決的,也並非一味增加Netfilter的模組,就可以無限擴充Netfilter的功能。我們要知道,防火牆管理人員是通過iptables工具,將“規則”寫入到Netfilter的規則資料庫(就是前面所提到的鏈)中,而這些規則有特定的“語法”,例如:“iptables-t filter -A INPUT -p tcp -m state --state ESTABLISHED, RELATED -jACCEPT ”,因此,當我們將規則傳給iptables工具時,iptables工具會先檢查語法是否正確,如果不正確,則iptables工具會顯示語法錯誤的警告資訊;反之,iptables就會把這些規則寫入到規則資料庫中。
事實上,不是隻有Netfilter有模組,iptables工具也有模組,這些模組就存放在/lib/xTables目錄下,該目錄包含了iptables及ip6tables兩個工具的模組。這些模組理應與Netfilter的模組是一一對應的,如/lib/modules/kernel_version/kernel/net/netfilter/目錄中有一個模組稱為xt_string.ko,在/lib/xTables/目錄中就會有一個叫libxt_string.so的模組,也就是說,當我們下達與xt_string.ko相關的語法時,iptables工具會根據libxt_string.so模組的指示去檢查語法是否正確,並將Netfilter的libxt_string.ko模組載入到系統記憶體中,iptables最後將規則寫入到規則資料庫中。
如果iptables工具沒有包含下達規則中所需的模組,那麼iptables會說你所下達的語法不正確,又如果iptables包含了我們所下達語法的模組,但Netfilter沒有對應的模組可用,iptables會告訴我們某個Netfilter的模組不存在,因此,如果升級核心或Netfilter,iptables的軟體也應隨之升級才行。