- 論壇徽章:
- 0
|
--------------------------------------------------------------------------------
Linux 的封包過濾機制:iptables
上面談了這麼多,主要還是希望您能瞭解到防火墻是什麼這個議題!而且也希望您知道防火墻并非萬能的。 好了,那麼底下我們終於可以來瞧一瞧,那目前我們的 2.6 版這個 Linux 核心到底使用什麼核心功能來進行防火墻設(shè)定?
--------------------------------------------------------------------------------
不同 Linux 核心版本的防火墻軟體
Linux 的防火墻為什麼功能這麼好?這是因為他本身就是由 Linux kernel 所提供, 由於直接經(jīng)過核心來處理,因此效能非常好!不過,不同核心版本所使用的防火墻軟體是不一樣的! 因為核心支援的防火墻是逐漸演進來的嘛!
Version 2.0:使用 ipfwadm 這個防火墻機制;
Version 2.2:使用的是 ipchains 這個防火墻機制;
Version 2.4 與 2.6 :主要是使用 iptables 這個防火墻機制,不過在某些早期的 Version 2.4 版本的 distributions 當中,亦同時支援 ipchains (編譯成為模組),好讓使用者仍然可以使用來自 2.2 版的 ipchains 的防火墻規(guī)劃。不過,不建議在 2.4 以上的核心版本使用 ipchains 喔!
因為不同的核心使用的防火墻機制不同,且支援的軟體指令與語法也不相同, 所以在 Linux 上頭設(shè)定屬於你自己的防火墻規(guī)則時,要注意啊,先用 uname -r 追蹤一下你的核心版本再說! 如果你是安裝 2004 年以后推出的 distributions ,那就不需要擔心了,因為這些 distributions 幾乎都使用 kernel 2.6 版的核心啊! ^_^
--------------------------------------------------------------------------------
iptables 的表格與封包進入流程
前面的幾個小節(jié)裡面我們一直談到:『防火墻規(guī)則』,咦!啥是規(guī)則。恳驗 iptables 是利用封包過濾的機制, 所以他會分析封包的表頭資料。根據(jù)表頭資料與定義的『規(guī)則』來決定該封包是否可以進入主機或者是被丟棄。 意思就是說:『根據(jù)封包的分析資料 "比對" 你預(yù)先定義的規(guī)則內(nèi)容, 若封包資料與規(guī)則內(nèi)容相同則進行動作,否則就繼續(xù)下一條規(guī)則的比對!』 重點在那個『比對與分析順序』上。
舉個簡單的例子,假設(shè)我預(yù)先定義 10 條防火墻規(guī)則好了,那麼當 Internet 來了一個封包想要進入我的主機, 那麼防火墻是如何分析這個封包的呢?我們以底下的圖示來說明好了:
圖五、封包過濾的規(guī)則動作及分析流程
![]()
當一個網(wǎng)路封包要進入到主機之前,會先經(jīng)由 NetFilter 進行檢查,那就是 iptables 的規(guī)則了。 檢查通過則接受 (ACCEPT) 進入本機取得資源,如果檢查不通過,則可能予以丟棄 (DROP) ! 上圖五主要的目的在告知您:『規(guī)則是有順序的』!例如當網(wǎng)路封包進入 Rule 1 的比對時, 如果比對結(jié)果符合 Rule 1 ,此時這個網(wǎng)路封包就會進行 Action 1 的動作,而不會理會后續(xù)的 Rule 2, Rule 3.... 等規(guī)則的分析了。
而如果這個封包并不符合 Rule 1 的比對,那就會進入 Rule 2 的比對了!如此一個一個規(guī)則去進行比對就是了。 那如果所有的規(guī)則都不符合怎辦?此時就會透過預(yù)設(shè)動作 (封包政策, Policy) 來決定這個封包的去向。 所以啦,當您的規(guī)則順序排列錯誤時,就會產(chǎn)生很嚴重的錯誤了。 怎麼說呢?讓我們看看底下這個例子:
假設(shè)您的 Linux 主機提供了 WWW 的服務(wù),那麼自然就要針對 port 80 來啟用通過的封包規(guī)則,但是您發(fā)現(xiàn) IP 來源為 192.168.100.100 老是惡意的嘗試入侵您的系統(tǒng),所以您想要將該 IP 拒絕往來,最后,所有的非 WWW 的封包都給他丟棄,就這三個規(guī)則來說,您要如何設(shè)定防火墻檢驗順序呢?
Rule 1 先抵擋 192.168.100.100 ;
Rule 2 再讓要求 WWW 服務(wù)的封包通過;
Rule 3 將所有的封包丟棄。
這樣的排列順序就能符合您的需求,不過,萬一您的順序排錯了,變成:
Rule 1 先讓要求 WWW 服務(wù)的封包通過;
Rule 2 再抵擋 192.168.100.100 ;
Rule 3 將所有的封包丟棄。
此時,那個 192.168.100.100 『可以使用您的 WWW 服務(wù)』喔!因為只要他對您的主機送出 WWW 要求封包,就可以使用您的 WWW 主機功能了,因為您的規(guī)則順序定義第一條就會讓他通過, 而不去考慮第二條規(guī)則!這樣可以理解規(guī)則順序的意義了嗎!現(xiàn)在再來想一想,如果 Rule 1 變成了『將所有的封包丟棄』,Rule 2 才設(shè)定『WWW 服務(wù)封包通過』,請問,我的 client 可以使用我的 WWW 服務(wù)嗎?呵呵!答案是『否~』想通了嗎? ^_^
--------------------------------------------------------------------------------
iptables 的表格與鏈 (chain)
事實上,那個圖五所列出的規(guī)則僅是 iptables 眾多表格當中的一個鏈 (chain) 而已。 什麼是鏈呢?這得由 iptables 的名稱說起。為什麼稱為 ip"tables" 呢? 因為這個防火墻軟體裡面有多個表格 (table) ,每個表格都定義出自己的預(yù)設(shè)政策與規(guī)則, 且每個表格都用途都不相同。我們可以使用底下這張圖來稍微瞭解一下:
圖六、iptables 的表格示意圖
![]()
剛剛圖五的規(guī)則內(nèi)容僅只是圖六內(nèi)的某個 chain 而已! 而預(yù)設(shè)的情況下,咱們 Linux 的 iptables 至少就有三個表格,包括管理本機進出的 filter 、管理后端主機 (防火墻內(nèi)部的其他電腦) 的 nat 、 管理特殊旗標使用的 mangle (較少使用) 。更有甚者,我們還可以自訂額外的鏈呢! 真是很神奇吧!每個表格與其中鏈的用途分別是這樣的:
filter:主要跟 Linux 本機有關(guān),這個是預(yù)設(shè)的 table 喔!
INPUT:主要與封包想要進入我們 Linux 本機有關(guān);
OUTPUT:主要與我們 Linux 本機所要送出的封包有關(guān);
FORWARD:這個咚咚與 Linux 本機比較沒有關(guān)係,他可以封包『轉(zhuǎn)遞』到后端的電腦中,與 nat 這個 table 相關(guān)性很高。
nat:這個表格主要在用作來源與目的之 IP 或 port 的轉(zhuǎn)換, 與 Linux 本機較無關(guān),主要與 Linux 主機后的區(qū)域網(wǎng)路內(nèi)的電腦較有相關(guān)。
PREROUTING:在進行路由判斷之前所要進行的規(guī)則(DNAT/REDIRECT)
POSTROUTING:在進行路由判斷之后所要進行的規(guī)則(SNAT/MASQUERADE)
OUTPUT:與發(fā)送出去的封包有關(guān)
mangle:這個表格主要是與特殊的封包的路由旗標有關(guān), 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 鏈。 由於這個表格與特殊旗標相關(guān)性較高,所以像咱們這種單純的環(huán)境當中,較少使用 mangle 這個表格。
那麼各個表格與鏈的相關(guān)性可以使用下圖來表示:
圖七、iptables 內(nèi)建各表格與鏈的相關(guān)性
![]()
上面的圖示很復(fù)雜喔!不過基本上你依舊可以看出來,我們的 iptables 可以控制兩種封包的流向:
如上圖的 A ,封包主要是要讀取我們 Linux 本機內(nèi)的資料,會經(jīng)過 filter 的 INPUT 鏈, 而資料的輸出則是經(jīng)過 filter 的 OUTPUT 鏈;
如上圖的 B ,封包主要是要透過防火墻而去后端,也就是說,該封包的目標并非我們的 Linux 本機。 主要經(jīng)過的鏈是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。
由於 mangle 這個表格很少被使用,如果將圖七的 mangle 拿掉的話,那就容易看的多了:
圖八、iptables 內(nèi)建各表格與鏈的相關(guān)性(簡圖)
![]()
透過圖八你就可以更輕鬆的瞭解到,事實上與本機最有關(guān)的其實是 filter 這個表格內(nèi)的 INPUT 與 OUTPUT 這兩條鏈,如果你的 iptables 只是用來防備 Linux 主機本身的話,那 nat 的規(guī)則根本就不需要理他,直接設(shè)定為開放即可。
不過,如果你的防火墻事實上是用來管制 LAN 內(nèi)的其他主機的話,那麼你就必須要再針對 filter 的 FORWARD 這條鏈,還有 nat 的 PREROUTING, POSTROUTING 以及 OUTPUT 進行額外的規(guī)則訂定才行。 nat 表格的使用需要很清晰的路由概念才能夠設(shè)定的好,建議新手先不要碰! 最多就是先玩一玩最陽春的 nat 功能『IP 分享器的功能』就好了! ^_^! 這部份我們在本章的最后一小節(jié)會介紹的啦!
--------------------------------------------------------------------------------
本機的 iptables 語法
理論上,當你安裝好 Linux 之后,系統(tǒng)應(yīng)該會主動的幫你啟動一個陽春的防火墻規(guī)則才是。 不過如果您是依照鳥哥的建議來安裝 Linux 時,那麼安裝完畢后,你的系統(tǒng)應(yīng)該是沒有防火墻的啦。 另外,某些早期的版本 (例如 Red Hat 9) 本身同時提供 iptables 及 ipchains 這兩個防火墻模組, 不過這兩個模組是無法同時存在的!所以你僅能啟動其中一個,那當然是啟動 iptables 才對! 如果不小心啟動了 ipchains 的話 (新版的 Linux 都不會有這個困擾) ,那請使用 rmmod 來移除吧!
不過,在開始進行底下的練習之前,鳥哥這裡有個很重要的事情要告知一下。 因為 iptables 的指令會將網(wǎng)路封包進行過濾及抵擋的動作,所以 請不要在遠端主機上進行防火墻的練習,因為您很有可能一不小心將自己關(guān)在家門外! 盡量在本機前面登入 tty1-tty6 終端機進行練習,否則常常會發(fā)生悲劇! 鳥哥以前剛剛在玩 iptables 時,就常常因為不小心規(guī)則設(shè)定錯誤,導(dǎo)致常常要請遠端的朋友幫忙重新開機...
剛剛提到咱們的 iptables 至少有三個預(yù)設(shè)的 table (filter, nat, mangle),較常用的是本機的 filter 表格, 這也是預(yù)設(shè)表格啦。另一個則是后端主機的 nat 表格,至於 mangle 較少使用,所以這個章節(jié)我們并不會討論 mangle。 由於不同的 table 他們的鏈不一樣,導(dǎo)致使用的指令語法或多或少都有點差異。 在這個小節(jié)當中,我們主要將針對 filter 這個預(yù)設(shè)表格的三條鏈來做介紹。底下就來玩一玩吧!
Tips:
防火墻的設(shè)定主要使用的就是 iptables 這個指令而已。而防火墻是系統(tǒng)管理員的主要任務(wù)之一, 且對於系統(tǒng)的影響相當?shù)拇,因此『只能?root 使用 iptables 』,不論是設(shè)定還是觀察防火墻規(guī)則喔!
--------------------------------------------------------------------------------
規(guī)則的清除與觀察
如果你在安裝的時候選擇沒有防火墻的話,那麼 iptables 在一開始的時候應(yīng)該是沒有規(guī)則的,不過, 可能因為你在安裝的時候就有選擇系統(tǒng)自動幫您建立防火墻機制,那系統(tǒng)就會有預(yù)設(shè)的防火墻規(guī)則了! 無論如何,我們先來看看目前本機的防火墻規(guī)則是如何吧!
[root@linux ~]# iptables [-t tables] [-L] [-nv]
參數(shù):
-t :后面接 table ,例如 nat 或 filter ,若省略此項目,則使用預(yù)設(shè)的 filter
-L :列出目前的 table 的規(guī)則
-n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快很多!
-v :列出更多的資訊,包括通過該規(guī)則的封包總位元數(shù)、相關(guān)的網(wǎng)路介面等
范例:列出 filter table 三條鏈的規(guī)則
[root@linux ~]# iptables -L -n
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
范例:列出更多的資訊
[root@linux ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 5748 packets, 746K bytes)
pkts bytes target prot opt in out source destination
....底下省略....
仔細看到上面表格的輸出,因為沒有加上 -t 的參數(shù),所以預(yù)設(shè)就是 filter 這個表格內(nèi)的 INPUT, OUTPUT, FORWARD 三條鏈的規(guī)則囉。由於沒有規(guī)則嘛!所以每個鏈內(nèi)部的規(guī)則都是空的。 同時注意一下,在每個 chain 后面括號內(nèi)的 policy 項目,那就是『預(yù)設(shè)動作(政策)』咯!以上面來看, 雖然我們啟動了 iptables ,但是我們沒有設(shè)定規(guī)則,然后政策又是 ACCEPT, 所以是『任何封包都會接受』的意思喔!至於如果加上 -v 的參數(shù)時, 則連同該規(guī)則所通過的封包總位元數(shù)也會被列出來啊。底下則是 nat 表格的規(guī)則項目:
[root@linux ~]# iptables -t nat -L -n
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
瞧!與 fiter 表格一模一樣吧!只是三條鏈的內(nèi)容不同囉!要注意。 ^_^! 以后當你設(shè)定每一條防火墻的規(guī)則時,記得瞧一瞧設(shè)定先!好,那如何清除規(guī)則?這樣做就對了:
[root@linux ~]# iptables [-t tables] [-FXZ]
參數(shù):
-F :清除所有的已訂定的規(guī)則;
-X :殺掉所有使用者 "自訂" 的 chain (應(yīng)該說的是 tables )囉;
-Z :將所有的 chain 的計數(shù)與流量統(tǒng)計都歸零
范例:清除本機防火墻 (filter) 的所有規(guī)則
[root@linux ~]# iptables -F
[root@linux ~]# iptables -X
[root@linux ~]# iptables -Z
由於這三個指令會將本機防火墻的所有規(guī)則都清除,但卻不會改變預(yù)設(shè)政策 (policy) , 所以如果你不是在本機下達這三行指令時,很可能你會被自己擋在家門外 (若 INPUT 設(shè)定為 DROP 時)! 要小心。
一般來說,我們在重新定義防火墻的時候,都會先將規(guī)則給他清除掉。還記得我們前面談到的, 防火墻的『規(guī)則順序』是有特殊意義的,所以囉, 當然先清除掉規(guī)則,然后一條一條來設(shè)定會比較容易一點啦。底下就來談?wù)劧x預(yù)設(shè)政策吧!
--------------------------------------------------------------------------------
定義預(yù)設(shè)政策 (policy)
清除規(guī)則之后,再接下來就是要設(shè)定規(guī)則的政策啦!還記得政策指的是什麼嗎?『 當您的封包不在您設(shè)定的規(guī)則之內(nèi)時,則該封包的通過與否,以 Policy 的設(shè)定為準』,在本機方面的預(yù)設(shè)政策中,假設(shè)您對於內(nèi)部的使用用者有信心的話, 那麼 filter 內(nèi)的 INPUT 鏈方面可以定義的比較嚴格一點,而 FORWARD 與 OUTPUT 則可以訂定的鬆一些!通常鳥哥都是將 INPUT 的 policy 定義為 DROP 啦,其他兩個則定義為 ACCEPT。 至於 nat table 則暫時不理會他。
[root@linux ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
參數(shù):
-P :定義政策( Policy )。注意,這個 P 為大寫!
ACCEPT :該封包可接受
DROP :該封包直接丟棄,不會讓 client 端知道為何被丟棄。
范例:將本機的 INPUT 設(shè)定為 DROP ,其他設(shè)定為 ACCEPT
[root@linux ~]# iptables -P INPUT DROP
[root@linux ~]# iptables -P OUTPUT ACCEPT
[root@linux ~]# iptables -P FORWARD ACCEPT
[root@linux ~]# iptables -L -n
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 由於 INPUT 設(shè)定為 DROP 而又尚未有任何規(guī)則,所以上面的輸出結(jié)果顯示:
# 所有的封包都無法進入你的主機!是不通的防火墻設(shè)定!(網(wǎng)路連線是雙向的)
看到輸出的結(jié)果了吧?INPUT 被修改設(shè)定了喔!其他的 nat table 三條鏈的設(shè)定也是一樣的,例如:『 iptables -t nat -P PREROUTING ACCEPT 』就設(shè)定了 nat table 的 PREROUTING 鏈為可接受的意思!預(yù)設(shè)政策設(shè)定完畢后,來談一談關(guān)於封包的基礎(chǔ)比對設(shè)定吧。
--------------------------------------------------------------------------------
封包的基礎(chǔ)比對 IP/netmask I/O 裝置
開始來進行封包的比對設(shè)定吧!我們先由最基礎(chǔ)的 IP 與網(wǎng)域的特徵談起,再談裝置 (網(wǎng)路卡) 的限制等等。
[root@linux ~]# iptables [-AI 鏈] [-io 網(wǎng)路介面] [-p 協(xié)定] \
> [-s 來源IP/網(wǎng)域] [-d 目標IP/網(wǎng)域] -j [ACCEPT|DROP]
參數(shù):
-AI 鏈:針對某的鏈進行規(guī)則的 "插入" 或 "累加"
-A :新增加一條規(guī)則,該規(guī)則增加在原本規(guī)則的最后面。例如原本已經(jīng)有四條規(guī)則,
使用 -A 就可以加上第五條規(guī)則!
-I :插入一條規(guī)則。如果沒有指定此規(guī)則的順序,預(yù)設(shè)是插入變成第一條規(guī)則。
例如原本有四條規(guī)則,使用 -I 則該規(guī)則變成第一條,而原本四條變成 2~5 號
鏈 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關(guān),請看底下。
-io 網(wǎng)路介面:設(shè)定封包進出的介面規(guī)范
-i :封包所進入的那個網(wǎng)路介面,例如 eth0, lo 等介面。需與 INPUT 鏈配合;
-o :封包所傳出的那個網(wǎng)路介面,需與 OUTPUT 鏈配合;
-p 協(xié)定:設(shè)定此規(guī)則適用於哪種封包格式
主要的封包格式有: tcp, udp, icmp 及 all 。
-s 來源 IP/網(wǎng)域:設(shè)定此規(guī)則之封包的來源項目,可指定單純的 IP 或包括網(wǎng)域,例如:
IP :192.168.0.100
網(wǎng)域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
若規(guī)范為『不許』時,則加上 ! 即可,例如:
-s ! 192.168.100.0/24 表示不許 192.168.100.0/24 之封包來源;
-d 目標 IP/網(wǎng)域:同 -s ,只不過這裡指的是目標的 IP 或網(wǎng)域。
-j :后面接動作,主要的動作有接受 (ACCEPT)、丟棄 (DROP) 及記錄 (LOG)
iptables 的基本參數(shù)就如同上面所示的,僅只談到 IP 、網(wǎng)域與裝置等等的資訊, 至於 TCP, UDP 封包特有的埠口 (port number) 與狀態(tài) (如 SYN 旗標) 則在下小節(jié)才會談到。 好,先讓我們來看看最基礎(chǔ)的幾個規(guī)則,例如開放 lo 這個本機的介面以及某個 IP 來源吧!
范例一:所有的來自 lo 這個介面的封包,都予以接受
[root@linux ~]# iptables -A INPUT -i lo -j ACCEPT
# 仔細看上面并沒有列出 -s, -d 等等的規(guī)則,這表示:不論封包來自何處或去到哪裡,
# 只要是來自 lo 這個介面,就予以接受!這個觀念挺重要的,就是
#『沒有設(shè)定的規(guī)定,則表示該規(guī)定完全接受』的意思!例如這個案例當中,
# 關(guān)於 -s, -d...等等的參數(shù)沒有規(guī)定時
范例二:目標來自 192.168.0.1 這個 IP 的封包都予以接受
[root@linux ~]# iptables -A INPUT -i eth0 -s 192.168.0.1 -j ACCEPT
# 不管什麼封包格式,只要來自 192.168.0.1 就予以接受。
范例三:目標來自 192.168.1.0/24 可接受,但 192.168.1.10 丟棄
[root@linux ~]# iptables -A INPUT -i eth0 -s 192.168.1.10 -j DROP
[root@linux ~]# iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
# 上述這兩個范例很重要。∫驗橛悬c關(guān)係!要先丟棄 192.168.1.10 才能接受該網(wǎng)域。
[root@linux ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 192.168.0.1 0.0.0.0/0
DROP all -- 192.168.1.100 0.0.0.0/0
ACCEPT all -- 192.168.1.0/24 0.0.0.0/0
# 瞧!剛剛的設(shè)定在這裡已經(jīng)生效囉!
這就是最單純、簡單的防火墻規(guī)則的設(shè)定與觀察方式。你在設(shè)定完畢后,都可以利用 iptables -L -n 或 iptables -L -v 來簡單的查閱一下。而如果你想要記錄某個規(guī)則的紀錄怎麼辦?可以這樣做:
[root@linux ~]# iptables -A INPUT -s 192.168.2.200 -j LOG
[root@linux ~]# iptables -L -n
target prot opt source destination
LOG all -- 192.168.2.200 0.0.0.0/0 LOG flags 0 level 4
看到輸出結(jié)果的最左邊,會出現(xiàn)的是 LOG 喔!只要有封包來自 192.168.2.200 這個 IP 時, 那麼該封包的相關(guān)資訊就會被寫入到核心訊息,亦即是 /var/log/messages 這個檔案當中。 然后該封包會繼續(xù)進行后續(xù)的規(guī)則比對。所以說, LOG 這個動作僅在進行記錄而已,并不會影響到這個封包的其他規(guī)則比對的。 好了,接下來我們分別來看看 TCP,UDP 以及 ICMP 封包的其他規(guī)則比對吧!
[ 本帖最后由 superchen 于 2006-9-21 13:15 編輯 ] |
|