1. 程式人生 > >Centos6.5 iptables的Filter詳解

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種狀態