歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Centos6.5 iptables的Filter詳解

今天一個同學它的騰訊雲服務器出現了個小問題,啟動tomcat服務器後。在服務器本機上使用curl 127.0.0.1:8080訪問沒任何問題。但通過外網ip卻一直訪問不了。然後我Google的一堆解決方法,最多的還是關於防火牆iptables的配置。雖然最後重新裝了一個tomcat後就莫名其妙的正常了。根本不是iptables的問題,但通過解決這個問題查詢了大量iptables方面的知識(雖然當初啃《鳥哥的Linux私房菜》的時候看過相關知識,但畢竟沒有實踐,今天正好借這個機會實際了一把),現在將iptables的一些常用知識總結一下。

1.什麼是iptables

iptable其實是Linux下的數據包過濾軟件,也是目前最新Linux發行版中默認的防火牆。要想深入了解iptables機制,了解防火牆的規則是必不可少的。由於iptables利用的數據包過濾的機制,所以它會分析數據包的報頭數據。根據報頭數據與定義的規則來決定該數據包是進入主機還是丟棄。 也就是說,根據數據包的分析資料”對比”預先定義的規則內容,若數據包數據與規則內容相同則進行動作,否則就繼續下一條規則的比對。重點在比對與分析順序。

2.iptables的簡單工作原理

舉個簡單的例子,當我們的iptables定義了十條防火牆規則,那麼當Internet來了一個數據包想要進入主機前,會先經過iptables的規則。檢查通過則接受(ACCEPT)進入本機取得資源,如果檢查不通過,則可能予以丟棄(DROP).一定要注意一點,iptables定義的規則是有順序,但某個數據包符合Rule1,則會執行Rule1對應的Action1而並不會理會後面所有的Rule。當所有Rule都不匹配,會執行默認操作。
iptables的規則是非常重要的,比如當我們有一台提供WWW的服務的主機,自然我們就要針對port 80端口來啟動通過的數據包規則,但我們發現IP為192.169.155.155總是存在惡意操作,所以我們要禁止該IP來訪問該服務,最後所有非WWW的數據包全部丟棄,我們來看完成這三個功能的規則順序。

Rule1先阻擋192.168.155.155 Rule2再讓請求WWW服務的數據包通過 Rule3將所有的數據包丟棄

現在我們想一下,如果這三條規則的順序變了之後,我們還能完成剛剛的需求麼?

3.iptables的策略

防火牆策略一般分為兩種,一種叫“通”策略,一種叫“堵”策略,通策略,默認門是關著的,必須要定義誰能進。堵策略則是,大門是洞開的,但是你必須有身份認證,否則不能進。所以我們要定義,讓進來的進來,讓出去的出去,所以通,是要全通,而堵,則是要選擇。當我們定義的策略的時候,要分別定義多條功能,其中:定義數據包中允許或者不允許的策略,filter過濾的功能,而定義地址轉換的功能的則是nat選項。為了讓這些功能交替工作,我們制定出了“表”這個定義,來定義、區分各種不同的工作功能和處理方式。

剛剛我們所說的規則僅僅是iptables表格中的一個鏈而已。iptables裡面有多個表格(table),每個表格都定義出自己的默認策略與規則,且每個表格的用途都不相同。

我們現在用的比較多有如下3個:

1.filter(過濾器,默認的table) 定義允許或者不允許的 2.nat(地址轉換) 定義地址轉換的 3.mangle(破壞者)功能:修改報文原數據,加特殊標記。

4.上述表中常見的鏈

與數據包是否進入Linux本機有關的表:Filter

INPUT:主要與想要進入Linux主機的數據包有關 OUTPUT : 主要與Linux本機所要送出的數據包有關 FORWARD : 與Linux本機沒有關系,它可以傳遞數據包到後端的計算機中,與表NAT有關

用來進行來源與目的地的IP或port的轉換(主要於Linux主機後的局域網內的主機有關):NAT

PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT) 。 POSTROUTING :在進行路由判斷之後所有進行的規則(SNAT/MASQUERADE)。 OUTPUT: 與發送出去的數據包有關

與特殊的數據包的路由標志有關:Mangle 上述5個了鏈都可以做

由於Filter是默認的table,並且如果iptables只是用來保護Linux主機本身的話,只用關注Filter表格內的INPUT和OUTPUT這兩條鏈即可。其余的兩個table也不常用,因此我們重點學習Filter。

5.iptables中規則的查看

如果在安裝Linux的時候沒有選擇防火牆,那麼iptables在一開始應該是沒有規則的。如果在安裝的時候選擇自動建立防火牆機制,那麼就有默認的防火牆規則。我們來看查看iptables規則的命令。

iptables [-t table ] [-L] [-nv]
選項與參數:
-t:後面接table。例如 filter或者nat。如果不寫默認是filter
-L:列出目前的table規則
-n:不進行IP與HOSTNAME的反查,使用此參數查詢結果會很快
-v:列出更多信息,包括通過該規則的數據包總位數,相關的網絡接口等。
//我們執行上述命令
hadoop wang # iptables -L -n 
//針對INPUT鏈,且默認策略為可接受
Chain INPUT (policy ACCEPT)
//說明欄
target     prot opt source               destination         
//針對FORWARD鏈,且默認策略為可接受
Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         
//針對OUTPUT鏈,且默認策略為可接受
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

上述每一個chain就是前面提到的每個鏈。Chain那一行括號裡面policy就是默認的策略。下面分析說明欄的五列分別代表的意思:

target:代表進行的操作,ACCEPT是放行,而REJECT則是拒絕,此外,尚有DROP(丟棄)的項目. 代表使用的數據包協議,主要有TCP,UDP及ICMP數據包格式。 opt:額外的選項說明。 source :代表次規則是針對哪個來源IP進行限制 destination: 代表次規則是針對哪個目標IP進行限制

5.iptables中規則的清除

iptables [ -t tables  ] [ -FXZ ]
-F:清楚所有的已定制的規則
-X:清楚所有用戶"自定義"的chain或者tables
-Z:將所有的chain的計數與流量統計都歸零

清楚防火牆的所有規則:
iptables -F
iptables -X
iptables -Z

上述三個命令會將防火牆的規則都清除,但不會改變默認策略(policy)。一般來說,我們重新定義防火牆的時候都會先把規則清除掉。

6.iptables中定義默認策略(policy)

前面提到,當數據包不在我們設置的規則之內時,則該數據包的通過與否,是以Policy的設置為准。在安全性比較高的主機中,Filter內的INPUT鏈定義的比較嚴格,INPUT的Policy定義為DROP

iptables定義規則:

格式:iptables [-t table] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP ]

-p : 定義策略(Policy)。注意:P為大寫
ACCEPT:數據包可接受
DROP:數據包被丟棄,client不知道為何被丟棄。

iptables  -P INPUT DROP  //INPUT默認設置為DROP
iptables  -P OUTPUT DROP  //OUTPUT默認設置為ACCEPT
iptables  -P FORWARD DROP // FORWARD默認設置為ACCEPT  

此時我們執行 iptables-save(不同與iptables -L -n -v的是它會列出完整的防火牆規則)會看到如下信息:

*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
//由於INPUT設置為DROP而又尚未有任何規則,所有顯示如上結果。此時所有數據包均都無法進入

現在我們可以設置默認策略後,現在來看看關於各規則的數據包基礎比對設置。

7.數據包的基礎對比:IP,網絡及接口設備

現在我們來添加防火牆規則的數據包對比設置。從最基礎的IP,網絡及端口開始(即是OSI的第三層談起)再來談談設備(網絡卡)的限制等。

iptables定義規則的格式:
iptables [-AI 鏈名] [-io 網絡接口 ] [ -p 協議 ] [ -s 來源IP/網絡 ] [ -d 目標IP/網絡 ] -j [ACCEPT | DROP|REJECT|LOG]

參數說明:
-A:新增一條規則,該規則在原規則的最後面。
-I:插入一條規則,默認該規則在原第一條規則的前面。即該新規則變為第一條規則。

-io 網絡接口:設置數據包進出的接口規范。
-i:表示輸入。即數據包進入的網絡接口。與INPUT鏈配合
-o : 表示輸出。數據包傳出的網絡接口。與OUTPUT鏈配合

-p 協定: 此規則適應於哪種數據包。如tcp,udp,icmp及all.

-s 來源 IP/網絡:設置次規則之前數據包的來源地,可指定單純的IP或網絡,例如:
IP : 192.168.0.100
網絡 : 192.168.0.0/24或者192.168.0.0/255.255.255.0
如果規則為不允許,則在IP/網絡前加 “!” 即可。
-s ! x.x.x.x

-d 目標 IP/網絡。與-s類似,只是是目標IP或者網絡而已。

-j:後面接操作。如ACCEPT,DROP ,REJECT或者LOG(記錄)

比如:開放lo這個本機的接口以及某個IP來源

//設置io成為受信任的設備,亦即進出lo的數據包都接受
iptables -t filter -A INPUT -i lo  -j REJECT

我們可能會有疑惑,為什麼沒有-s -d等規則,表示不論數據包來自何處或去到哪裡,只要是來自lo這個接口全部接受。

設置來自192.168.100.10的就接受,192.168.100.11的就丟棄。

iptables -A INPUT -i eth0 -s 192.168.100.10 -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.100.11 -j DROP
iptables -I INPUT -i eth0 -s 192.168.100.0/24 -j ACCEPT

此時我們執行iptables-save

*filter
:INPUT ACCEPT [12:976]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9:2186]
-A INPUT -s 192.168.100.0/24 -i eth0 -j ACCEPT
-A INPUT -s 192.168.100.10/32 -i eth0 -j ACCEPT
-A INPUT -s 192.168.100.11/32 -i eth0 -j DROP
COMMIT

此時我們會有一個疑問,既然我們已經放行了192.168.100.0/24。所以丟棄192.168.100.11的規定根本不會被用到了。那麼我們應該怎麼辦在不改變順序的情況下讓這兩個規則都生效。指定-j 為LOG。

iptables -A INPUT -s 192.168.2.200 -j LOG

LOG        all  --    192.168.2.200   0.0.0.0/0            LOG flags 0 level 4

輸出結果最左邊為LOG,只要數據包來自192.168.2.200這個IP時,那麼該數據包的相關信息就會被寫入內核日志文件,即/var/log/messages這個文件當中。然後於下一個規則相比較。

8.TCP,UDP協議的規則對比:針對端口設置

在 -s 參數後面可以增加一個參數 -sport 端口范圍(限制來源端口),如:1024:65535 在-d 參數後面可以增加一個參數 -dport 端口范圍(限制目標端口)

需要特別注意,這兩個參數重點在port上面,並且僅有TCP和UDP數據包具有端口,因此要想使用–dport,–sport時需要加上-p tcp或者 -p udp才會成功。

下面做幾個小測試:

//丟棄所有想要鏈接本機21端口的數據包
iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
//想要鏈接到本機的網上鄰居(UDP port 137,138 tcp 139,445)就放行
iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT
//只要來自192.168.1.0/24的1024:65535端口的數據包,且想要連接的本機的ssh port就阻擋
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65535 --dport ssh -j DROP

iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP

除了制訂端口號之外,TCP數據包還有特殊的標識,比如主動鏈接的SYN標志。iptables支持使用–syn來處理。

iptables -A INPUT -i eth0 -p tcp --sport 1:1023 -dport 1:1023 --syn -j DROP

9.iptables的開啟與關閉

查看運行狀態:

#/etc/init.d/iptables status

關閉防火牆服務:

/etc/init.d/iptables stop
//此方法在主機下次重新啟動還是會開啟

直接禁用防火牆:

chkconfig --level 35 iptables off
 chkconfig --list iptables
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off
//對應啟動的7種狀態 
Copyright © Linux教程網 All Rights Reserved