本章將詳細介紹狀態機制。通讀本章,你會對狀態機制是如何工作的有一個全面的了解。我們用一些例子來進行說明狀態機制。實踐出真知嘛。
狀態機制是iptables中特殊的一部分,其實它不應該叫狀態機制,因為它只是一種連接跟蹤機制。但是,很多人都認可狀態機制這個名字。文中我也或多或或少地用這個名字來表示和連接跟蹤相同的意思。這不應該引起什么混亂的。連接跟蹤可以讓Netfilter知道某個特定連接的狀態。運行連接跟蹤的防火墻稱作帶有狀態機制的防火墻,以下簡稱為狀態防火墻。狀態防火墻比非狀態防火墻要安全,因為它允許我們編寫更嚴密的規則。
在iptables里,包是和被跟蹤連接的四種不同狀態有關的。它們是NEW,ESTABLISHED,RELATED和INVALID。后面我們會深入地討論每一個狀態。使用--state匹配操作,我們能很容易地控制 “誰或什么能發起新的會話”。
所有在內核中由Netfilter的特定框架做的連接跟蹤稱作conntrack(譯者注:就是connection tracking 的首字母縮寫)。conntrack可以作為模塊安裝,也可以作為內核的一部分。大部分情況下,我們想要,也需要更詳細的連接跟蹤,這是相比于缺省的conntrack而言。也因為此,conntrack中有許多用來處理TCP, UDP或ICMP協議的部件。這些模塊從數據包中提取詳細的、唯一的信息,因此能保持對每一個數據流的跟蹤。這些信息也告知conntrack流當前的狀態。例如,UDP流一般由他們的目的地址、源地址、目的端口和源端口唯一確定。
在以前的內核里,我們可以打開或關閉重組功能。然而,自從iptables和Netfilter,尤其是連接跟蹤被引入內核,這個選項就被取消了。因為沒有包的重組,連接跟蹤就不能正常工作?,F在重組已經整合入 conntrack,并且在conntrack啟動時自動啟動。不要關閉重組功能,除非你要關閉連接跟蹤。
除了本地產生的包由OUTPUT鏈處理外,所有連接跟蹤都是在PREROUTING鏈里進行處理的,意思就是, iptables會在PREROUTING鏈里從新計算所有的狀態。如果我們發送一個流的初始化包,狀態就會在OUTPUT鏈里被設置為NEW,當我們收到回應的包時,狀態就會在PREROUTING鏈里被設置為ESTABLISHED。如果第一個包不是本地產生的,那就會在PREROUTING鏈里被設置為NEW狀態。綜上,所有狀態的改變和計算都是在nat表中的PREROUTING鏈和OUTPUT鏈里完成的。