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機制,瞭解防火牆的規則是必不可少的。
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的策略
防火牆策略一般分為兩種,一種叫“通”策略,一種叫“堵”策略,通策略,預設門是關著的,必須要定義誰能進。堵策略則是,大門是洞開的,但是你必須有身份認證,否則不能進。
剛剛我們所說的規則僅僅是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種狀態