在閱讀這篇文章之前,請確保你已經閱讀了如下文章,如下文章總結了iptables的相關概念,是閱讀這篇文章的基礎。
[圖文并茂理解iptables](http://www.zsythink.net/archives/1199)
如果你是一個新手,在閱讀如下文章時,請堅持讀到最后,讀的過程中可能會有障礙,但是在讀完以后,你會發現你已經明白了。

在進行iptables實驗時,請務必在測試機上進行。
之前在iptables的概念中已經提到過,在實際操作iptables的過程中,是以"表"作為操作入口的,如果你經常操作關系型數據庫,那么當你聽到"表"這個詞的時候,你可能會聯想到另一個詞----"增刪改查",當我們定義iptables規則時,所做的操作其實類似于"增刪改查",那么,我們就先從最簡單的"查"操作入手,開始實際操作iptables。
在之前的文章中,我們已經總結過,iptables為我們預定義了4張表,它們分別是raw表、mangle表、nat表、filter表,不同的表擁有不同的功能。
filter負責過濾功能,比如允許哪些IP地址訪問,拒絕哪些IP地址訪問,允許訪問哪些端口,禁止訪問哪些端口,filter表會根據我們定義的規則進行過濾,filter表應該是我們最常用到的表了,所以此處,我們以filter表為例,開始學習怎樣實際操作iptables。
怎樣查看filter表中的規則呢?使用如下命令即可查看。

上例中,我們使用-t選項,指定要操作的表,使用-L選項,查看-t選項對應的表的規則,-L選項的意思是,列出規則,所以,上述命令的含義為列出filter表的所有規則,注意,上圖中顯示的規則(綠色標注的部分為規則)是Centos6啟動iptables以后默認設置的規則,我們暫且不用在意它們,上圖中,顯示出了3條鏈(藍色標注部分為鏈),INPUT鏈、FORWARD鏈、OUTPUT鏈,每條鏈中都有自己的規則,前文中,我們打過一個比方,把"鏈"比作"關卡",不同的"關卡"擁有不同的能力,所以,從上圖中可以看出,INPUT鏈、FORWARD鏈、OUTPUT鏈都擁有"過濾"的能力,所以,當我們要定義某條"過濾"的規則時,我們會在filter表中定義,但是具體在哪條"鏈"上定義規則呢?這取決于我們的工作場景。比如,我們需要禁止某個IP地址訪問我們的主機,我們則需要在INPUT鏈上定義規則。因為,我們在理論總結中已經提到過,報文發往本機時,會經過PREROUTING鏈與INPUT鏈(如果你沒有明白,請回顧前文),所以,如果我們想要禁止某些報文發往本機,我們只能在PREROUTING鏈和INPUT鏈中定義規則,但是PREROUTING鏈并不存在于filter表中,換句話說就是,PREROUTING關卡天生就沒有過濾的能力,所以,我們只能在INPUT鏈中定義,當然,如果是其他工作場景,可能需要在FORWARD鏈或者OUTPUT鏈中定義過濾規則。
話說回來,我們繼續聊怎樣查看某張表中的規則。
剛才提到,我們可以使用iptables -t filter -L命令列出filter表中的所有規則,那么舉一反三,我們也可以查看其它表中的規則,示例如下。
iptables -t raw -L
iptables -t mangle -L
iptables -t nat -L
其實,我們可以省略-t filter,當沒有使用-t選項指定表時,默認為操作filter表,即iptables -L表示列出filter表中的所有規則。
我們還可以只查看指定表中的指定鏈的規則,比如,我們只查看filter表中INPUT鏈的規則,示例如下(注意大小寫)。

上圖中只顯示了filter表中INPUT鏈中的規則(省略-t選項默認為filter表),當然,你也可以指定只查看其他鏈,其實,我們查看到的信息還不是最詳細的信息,我們可以使用-v選項,查看出更多的、更詳細的信息,示例如下。

可以看到,使用-v選項后,iptables為我們展示的信息更多了,那么,這些字段都是什么意思呢?我們來總結一下,看不懂沒關系,等到實際使用的時候,自然會明白,此處大概了解一下即可。
其實,這些字段就是規則對應的屬性,說白了就是規則的各種信息,那么我們來總結一下這些字段的含義。
**pkts**:對應規則匹配到的報文的個數。
**bytes**:對應匹配到的報文包的大小總和。
**target**:規則對應的target,往往表示規則對應的"動作",即規則匹配成功后需要采取的措施。
**prot**:表示規則對應的協議,是否只針對某些協議應用此規則。
**opt**:表示規則對應的選項。
**in**:表示數據包由哪個接口(網卡)流入,我們可以設置通過哪塊網卡流入的報文需要匹配當前規則。
**out**:表示數據包由哪個接口(網卡)流出,我們可以設置通過哪塊網卡流出的報文需要匹配當前規則。
**source**:表示規則對應的源頭地址,可以是一個IP,也可以是一個網段。
**destination**:表示規則對應的目標地址。可以是一個IP,也可以是一個網段。
細心如你一定發現了,上圖中的源地址與目標地址都為anywhere,看來,iptables默認為我們進行了名稱解析,但是在規則非常多的情況下如果進行名稱解析,效率會比較低,所以,在沒有此需求的情況下,我們可以使用-n選項,表示不對IP地址進行名稱反解,直接顯示IP地址,示例如下。

如上圖所示,規則中的源地址與目標地址已經顯示為IP,而非轉換后的名稱。
當然,我們也可以只查看某個鏈的規則,并且不讓IP進行反解,這樣更清晰一些,比如 iptables -nvL INPUT
如果你習慣了查看有序號的列表,你在查看iptables表中的規則時肯定會很不爽,沒有關系,滿足你,使用--line-numbers即可顯示規則的編號,示例如下。

\--line-numbers選項并沒有對應的短選項,不過我們縮寫成--line時,centos中的iptables也可以識別。
?
?
我知道你目光如炬,你可能早就發現了,表中的每個鏈的后面都有一個括號,括號里面有一些信息,如下圖紅色標注位置,那么這些信息都代表了什么呢?我們來看看。

上圖中INPUT鏈后面的括號中包含policy ACCEPT ,0 packets,0bytes 三部分。
**policy**表示當前鏈的默認策略,policy ACCEPT表示上圖中INPUT的鏈的默認動作為ACCEPT,換句話說就是,默認接受通過INPUT關卡的所有請求,所以我們在配置INPUT鏈的具體規則時,應該將需要拒絕的請求配置到規則中,說白了就是"黑名單"機制,默認所有人都能通過,只有指定的人不能通過,當我們把INPUT鏈默認動作設置為接受(ACCEPT),就表示所有人都能通過這個關卡,此時就應該在具體的規則中指定需要拒絕的請求,就表示只有指定的人不能通過這個關卡,這就是黑名單機制,**但是**,你一定發現了,上圖中所顯示出的規則,大部分都是接受請求(ACCEPT),并不是想象中的拒絕請求(DROP或者REJECT),這與我們所描述的黑名單機制不符啊,按照道理來說,默認動作為接受,就應該在具體的規則中配置需要拒絕的人,但是上圖中并不是這樣的,之所以出現上圖中的情況,是因為IPTABLES的工作機制導致到,上例其實是利用了這些"機制",完成了所謂的"白名單"機制,并不是我們所描述的"黑名單"機制,我們此處暫時不用關注這一點,之后會進行詳細的舉例并解釋,此處我們只要明白policy對應的動作為鏈的默認動作即可,或者換句話說,我們只要理解,policy為鏈的默認策略即可。
**packets**表示當前鏈(上例為INPUT鏈)默認策略匹配到的包的數量,0 packets表示默認策略匹配到0個包。
**bytes**表示當前鏈默認策略匹配到的所有包的大小總和。
其實,我們可以把packets與bytes稱作"計數器",上圖中的計數器記錄了默認策略匹配到的報文數量與總大小,"計數器"只會在使用-v選項時,才會顯示出來。
當被匹配到的包達到一定數量時,計數器會自動將匹配到的包的大小轉換為可讀性較高的單位,如下圖所示。

如果你想要查看精確的計數值,而不是經過可讀性優化過的計數值,那么你可以使用-x選項,表示顯示精確的計數值,示例如下。

每張表中的每條鏈都有自己的計數器,鏈中的每個規則也都有自己的計數器,沒錯,就是每條規則對應的pkts字段與bytes字段的信息。
## 命令小節
好了,我們已經會使用命令簡單的查看iptables表的規則了,為了方便以后回顧,我們將上文中的相關命令總結一下。
Shell
iptables?-t?表名?-L
1iptables -t 表名 -L
查看對應表的所有規則,-t選項指定要操作的表,省略"-t 表名"時,默認表示操作filter表,-L表示列出規則,即查看規則。
Shell
iptables?-t?表名?-L?鏈名
1iptables -t 表名 -L 鏈名
查看指定表的指定鏈中的規則。
Shell
iptables?-t?表名?-v?-L
1iptables -t 表名 -v -L
查看指定表的所有規則,并且顯示更詳細的信息(更多字段),-v表示verbose,表示詳細的,冗長的,當使用-v選項時,會顯示出"計數器"的信息,由于上例中使用的選項都是短選項,所以一般簡寫為iptables -t 表名 -vL
Shell
iptables?-t?表名?-n?-L
1iptables -t 表名 -n -L
表示查看表的所有規則,并且在顯示規則時,不對規則中的IP或者端口進行名稱反解,-n選項表示不解析IP地址。
Shell
iptables?--line-numbers?-t?表名?-L
1iptables --line-numbers -t 表名 -L
表示查看表的所有規則,并且顯示規則的序號,--line-numbers選項表示顯示規則的序號,注意,此選項為長選項,不能與其他短選項合并,不過此選項可以簡寫為--line,注意,簡寫后仍然是兩條橫杠,仍然是長選項。
Shell
iptables?-t?表名?-v?-x?-L
1iptables -t 表名 -v -x -L
表示查看表中的所有規則,并且顯示更詳細的信息(-v選項),不過,計數器中的信息顯示為精確的計數值,而不是顯示為經過可讀優化的計數值,-x選項表示顯示計數器的精確值。
實際使用中,為了方便,往往會將短選項進行合并,所以,如果將上述選項都糅合在一起,可以寫成如下命令,此處以filter表為例。
Shell
iptables?--line?-t?filter?-nvxL
1iptables --line -t filter -nvxL
當然,也可以只查看某張表中的某條鏈,此處以filter表的INPUT鏈為例
Shell
iptables?--line?-t?filter?-nvxL?INPUT
1iptables --line -t filter -nvxL INPUT
好了,怎樣使用iptables命令進行基本的查看操作,就先總結到這里吧,下一篇文章會總結iptables規則的"增、刪、改"操作,直達鏈接如下:
[iptables規則管理](http://www.zsythink.net/archives/1517)
如果你是一個新手,希望這篇文章能對你有所幫助。
快來評論、快來點贊啊~~各位親~~快來收藏~~快來推薦啊~~么么噠~~。

**我的微信公眾號**
關注"實用運維筆記"微信公眾號,當博客中有新文章時,可第一時間得知哦~