亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1853 | 回復(fù): 3
打印 上一主題 下一主題

[網(wǎng)絡(luò)管理] Linux 防火墻與 NAT 主機(轉(zhuǎn)自鳥哥的 Linux 私房菜) [復(fù)制鏈接]

論壇徽章:
0
1 [報告]
發(fā)表于 2006-09-21 11:54 |只看該作者
--------------------------------------------------------------------------------
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 編輯 ]

論壇徽章:
0
2 [報告]
發(fā)表于 2006-09-21 11:56 |只看該作者
--------------------------------------------------------------------------------

TCP, UDP 的規(guī)則比對

我們在網(wǎng)路基礎(chǔ)談過各種不同的封包格式, 在談到 TCP 與 UDP 時,比較特殊的就是那個埠口 (port number),在 TCP 方面則另外有所謂的連線封包狀態(tài), 包括最常見的 SYN 主動連線的封包格式。那麼如何針對這兩種封包格式進行防火墻規(guī)則的設(shè)定呢?你可以這樣看:
[root@linux ~]# iptables [-AI 鏈] [-io 網(wǎng)路介面] [-p tcp,udp] \
> [-s 來源IP/網(wǎng)域] [--sport 埠口范圍] \
> [-d 目標IP/網(wǎng)域] [--dport 埠口范圍] -j [ACCEPT|DROP]
參數(shù):
--sport 埠口范圍:限制來源的埠口號碼,埠口號碼可以是連續(xù)的,例如 1024:65535
--dport 埠口范圍:限制目標的埠口號碼。


事實上就是多了那個 --sport 及 --dport 這兩個玩意兒,重點在那個 port number 上面啦! 底下讓我們來進行幾個小測試:
范例一:想要連線進入本機 port 21 的封包都抵擋掉:
[root@linux ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP

范例二:想連到我這部主機的網(wǎng)芳 (upd port 137,138 tcp port 139,445) 就放行
[root@linux ~]# iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
[root@linux ~]# iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
[root@linux ~]# iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT


瞧!你可以利用 UDP 與 TCP 協(xié)定所擁有的埠口號碼來進行某些服務(wù)的開放或關(guān)閉喔! 你還可以綜合處理呢!例如:只要來自 192.168.1.0/24 的 1024:65535 埠口的封包, 只要想要連線到本機的 ssh port 就予以抵擋,可以這樣做:
[root@linux ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 \
> --sport 1024:65534 --dport ssh -j DROP


注意啊!如果你有使用到 --sport 及 --dport 的參數(shù)時,就必須指定 udp 或 tcp 的封包格式才行!否則的話, iptables 的指令就會出現(xiàn)如下的錯誤:
[root@linux ~]# iptables -A INPUT -i eth0 --dport 21 -j DROP
iptables v1.2.11: Unknown arg `--dport'
Try `iptables -h' or 'iptables --help' for more information.


你應(yīng)該會覺得很奇怪,怎麼『 --dport 』會是未知的參數(shù) (arg) 呢?這是因為你沒有加上 -p tcp 或 -p udp 的緣故。∫驗 port 是 TCP,UDP 特有的,其他類似 ICMP 則沒有這種類的埠口資料啊! 這樣說,您可以理解吧! ^_^

除了埠口之外,在 TCP 還有特殊的旗標!最常見的就是那個主動連線的 SYN 旗標了。 我們在 iptables 裡面還支援『 --syn 』的處理方式,我們以底下的例子來說明好了:
范例:將來自任何地方來源 port 1:1023 的主動連線到本機端的 1:1023 連線丟棄
[root@linux ~]# iptables -A INPUT -i eth0 -p tcp --sport 1:1023 \
> --dport 1:1023 --syn -j DROP


一般來說,client 端啟用的 port 都是大於 1024 以上的埠口,而 server 端則是啟用小於 1023 以下的埠口在監(jiān)聽的。所以我們可以讓來自遠端的小於 1023 以下的埠口資料的主動連線都給他丟棄! 但不適用在 FTP 的主動連線中!這部份我們未來在 FTP 章節(jié)當中再來談吧!



--------------------------------------------------------------------------------

狀態(tài)模組:MAC 與 RELATED

在早期的 kernel 2.2 以前使用 ipchains 管理防火墻時,通常會讓系統(tǒng)管理員相當頭痛! 因為 ipchains 沒有所謂的封包狀態(tài)模組,因此我們必須要針對封包的進、出方向進行管控。 舉例來說,如果你想要連線到遠端主機的 port 22 時,你必須要針對兩條規(guī)則來設(shè)定:

本機端的 1024:65535 到遠端的 port 22 必須要放行 (OUTPUT 鏈);
遠端主機 port 22 到本機的 1024:65535 必須放行 (INPUT 鏈);
這會很麻煩!因為如果你要連線到 10 部主機的 port 22 時,假設(shè) OUTPUT 為預(yù)設(shè)開啟 (ACCEPT), 你依舊需要填寫十行規(guī)則,讓那十部遠端主機的 port 22 可以連線到你的本地端主機上。 那如果開啟全部的 port 22 呢?又擔心某些惡意主機會主動以 port 22 連線到你的機器上! 同樣的道理,如果你要讓本地端主機可以連到外部的 port 80 (WWW 服務(wù)),那就更不得了~ 這就是網(wǎng)路連線是雙向的一個很重要的概念!

好在我們的 iptables 免除了這個困擾!他可以透過一個狀態(tài)模組來分析 『這個想要進入的封包是否為剛剛我發(fā)出去的回應(yīng)?』 如果是剛剛我發(fā)出去的回應(yīng),那麼就可以予以接受放行!哇!真棒!這樣就不用管遠端主機是否連線進來的問題了! 那如何達到呢?看看底下的語法:
[root@linux ~]# iptables -A INPUT -m state --state 狀態(tài)
參數(shù):
-m :一些 iptables 的模組,主要常見的有:
     state :狀態(tài)模組
     mac   :網(wǎng)路卡硬體位址 (hardware address)
--state :一些封包的狀態(tài),主要有:
     INVALID    :無效的封包,例如資料破損的封包狀態(tài)
     ESTABLISHED:已經(jīng)連線成功的連線狀態(tài);
     NEW        :想要新建立連線的封包狀態(tài);
     RELATED    :這個最常用!表示這個封包是與我們主機發(fā)送出去的封包有關(guān)

范例:只要已建立或相關(guān)封包就予以通過,只要是不合法封包就丟棄
[root@linux ~]# iptables -A INPUT -m state \
> --state RELATED,ESTABLISHED -j ACCEPT
[root@linux ~]# iptables -A INPUT -m state --state INVALID -j DROP


所以說,如果你的 Linux 主機只想要作為 client 的用途,不許所有主動對你連線的來源, 那麼你可以這樣做即可:

清除所有已經(jīng)存在的規(guī)則 (iptables -F...)
設(shè)定預(yù)設(shè)政策,除了 INPUT 預(yù)設(shè)為 DROP 其他為預(yù)設(shè) ACCEPT;
開放本機的 lo 可以自由放行;
設(shè)定有相關(guān)的封包狀態(tài)可以連線進入本機。
這就是最最陽春的防火墻,你可以透過第二步驟抵擋所有遠端的來源封包, 而透過第四步驟讓你要求的遠端主機回應(yīng)封包可以進入, 加上讓本機的 lo 這個內(nèi)部迴圈裝置可以放行,嘿嘿!一部 client 專用的防火墻規(guī)則就 OK 了! 你可以在某個 script 上面這樣做即可:
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH
iptables -F
iptables -X
iptables -Z
iptables -P   INPUT DROP
iptables -P  OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT


那如果區(qū)域網(wǎng)路內(nèi)有其他的主機時,再將上表最后一行的 # 取消,就可以接受來自本地 LAN 的其他主機的連線了。 而如果你擔心某些 LAN 內(nèi)的惡意來源主機會主動的對你連線時,那你還可以針對信任的本地端主機的 MAC 進行過濾! 同樣是使用狀態(tài)模組!這次的狀態(tài)則是 MAC 的比對。舉例來說:
范例一:針對區(qū)域網(wǎng)路內(nèi)的 aa:bb:cc:dd:ee:ff 主機開放其連線
[root@linux ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff \
>  -j ACCEPT
參數(shù):
--mac-source :就是來源主機的 MAC 啦!


透過這個玩意兒,你就可以定義更嚴格的 LAN 內(nèi)的其他主機能否連線到你的主機的權(quán)限了!



--------------------------------------------------------------------------------

ICMP 封包規(guī)則的比對

在網(wǎng)路基礎(chǔ)的 ICMP 協(xié)定當中我們知道 ICMP 的格式相當?shù)亩,而且很?ICMP 封包的類型格式都是為了要用來進行網(wǎng)路檢測用的! 所以最好不要將所有的 ICMP 封包都丟棄!通常我們會把 ICMP type 8 (echo request) 拿掉而已, 讓遠端主機不知道我們是否存在,也不會接受 ping 的回應(yīng)就是了。ICMP 封包格式的處理是這樣的:
[root@linux ~]# iptables -A INPUT -p icmp --icmp-type 類型 -j ACCEPT
參數(shù):
--icmp-type :后面必須要接 ICMP 的封包類型,也可以使用代號,
              例如 8  代表 echo request 的意思。

范例:讓 0,3,4,11,12,14,16,18 的 ICMP type 可以進入本機:
[root@linux ~]# vi somefile
#!/bin/bash
icmp_type="0 3 4 11 12 14 16 18"
for typeicmp in $icmp_type
do
   iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
done

[root@linux ~]# sh  somefile


這樣就能夠開放部分的 ICMP 封包格式進入本機進行網(wǎng)路檢測的工作了!真好!不是嘛!^_^

--------------------------------------------------------------------------------
防火墻的記錄、回復(fù)與測試

剛剛上面我們談了很多的設(shè)定了,那麼我該如何觀察目前主機上面的防火墻規(guī)則呢? 我們可以使用『iptables -L -n 』來觀察,不過,該指令所顯示的資訊其實還是不太足夠的。 這個時候,我們其實可以使用底下的兩個指令來將目前主機上面的防火墻機制『儲存』下來, 在下次想要將這個規(guī)則『回復(fù)』的時候,就能夠直接利用指令將規(guī)則直接回復(fù)喔!
[root@linux ~]# iptables-save > filename
[root@linux ~]# iptables-restore < filename


一個是儲存一個是回復(fù)!而在 Red Hat 系統(tǒng)的 RHEL,CentOS,Fedora 當中,如果你將那個 filename 檔案存成『 /etc/sysconfig/iptables 』,并且利用 chkconfig 將 iptables 在開機時預(yù)設(shè)啟動的話,那麼一開機系統(tǒng)就會主動的幫你把防火墻的規(guī)則給載入了就是! 那麼使用 iptables-save 所得到的結(jié)果會是如何呢?讓我們來看看:
[root@linux ~]# iptables-save
# Generated by iptables-save v1.2.11 on Mon Sep 11 17:47:35 2006
*filter    <==使用的 table
:INPUT DROP [7335:859454] <==三條預(yù)設(shè)的鏈與預(yù)設(shè)政策
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [16992:13134791]
-A INPUT -i lo -j ACCEPT  <==開始各個規(guī)則的設(shè)定
-A INPUT -m state --state RELATED -j ACCEPT
-A INPUT -m mac --mac-source 00:04:750:A2:58 -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 3 -j ACCEPT
....中間省略....
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT
# Completed on Mon Sep 11 17:47:35 2006
# 井號 (#) 是註解,星號 (*) 代表預(yù)設(shè)的 table,而冒號 ( 代表各條鏈的預(yù)設(shè)政策;
# 后續(xù)的動作則是各個規(guī)則啦!


你瞧到輸出的結(jié)果啦!整個資料幾乎就是類似手動在指令列模式輸入的指令! 比起 iptables -L -n 所得到的資訊要仔細的多。這也是 iptables 的特殊格式, 可以用在 iptables-restore 的指令讀入呢! 比起這種方式,鳥哥還是比較喜歡使用 script 來撰寫自己的防火墻規(guī)則啦。 制訂好規(guī)則后當然就是要測試囉!那麼如何測試呢?

先由主機向外面主動連線試看看;
再由私有網(wǎng)域內(nèi)的 PC 向外面主動連線試看看;
最后,由 Internet 上面的主機,主動連線到您的 Linux 主機試看看;
一步一步作下來,看看問題出在哪裡,然后多多的去改進、改良!基本上, 網(wǎng)路上目前很多的資料可以提供您不錯的參考了!這一篇的設(shè)定寫的是很簡單, 大部分都還在介紹階段而已!希望對大家有幫助! 鳥哥在參考資料當中列出幾個有用的防火墻網(wǎng)頁, 希望大家有空真的要多多的去看看!會很有幫助的!



--------------------------------------------------------------------------------
IPv4 的核心管理功能: /proc/sys/net/ipv4/*

除了 iptables 這個防火墻軟體之外,其實咱們 Linux kernel 2.6 提供很多核心預(yù)設(shè)的攻擊抵擋機制喔! 由於是核心的網(wǎng)路功能,所以相關(guān)的設(shè)定資料都是放置在 /proc/sys/net/ipv4/ 這個目錄當中。 至於該目錄下各個檔案的詳細資料,可以參考核心的說明文件:

/usr/src/linux-{version}/networking/ip-sysctl.txt
上面的這個說明資料可以由 http://www.kernel.org 這個網(wǎng)站下載任何一個核心原始碼后,解壓縮就能夠看到。 鳥哥這裡也放一份備份:

http:/linux.vbird.org/linux_server/0250simple_firewall/ip-sysctl.txt
有興趣的話應(yīng)該要自行去查一查比較好的喔!我們底下就拿幾個簡單的檔案來作說明吧!


--------------------------------------------------------------------------------

/proc/sys/net/ipv4/tcp_syncookies

我們在前一章談到所謂的阻斷式服務(wù) (DoS) 攻擊法當中的一種方式,就是利用 TCP 封包的 SYN 三向交握原理所達成的, 這種方式稱為 SYN Flooding 。那如何預(yù)防這種方式的攻擊呢?我們可以啟用核心的 SYN Cookie 模組! 這個 SYN Cookie 模組可以在系統(tǒng)用來啟動隨機連線的埠口 (1024:65535) 即將用完時自動啟動。

當啟動 SYN Cookie 時,主機在發(fā)送 SYN/ACK 確認封包前,會要求 Client 端在短時間內(nèi)回覆一個序號, 這個序號包含許多原本 SYN 封包內(nèi)的資訊,包括 IP、port 等。若 Client 端可以回覆正確的序號, 那麼主機就確定該封包為可信的,因此會發(fā)送 SYN/ACK 封包,否則就不理會此一封包。

透過此一機制可以大大的降低無效的 SYN 等待埠口,而避免 SYN Flooding 的 DoS 攻擊說! 那麼如何啟動這個模組呢?很簡單,這樣做即可:
[root@linux ~]# echo "1" > /proc/sys/net/ipv4/tcp_syncookies


但是這個設(shè)定值由於違反 TCP 的三向交握 (因為主機在發(fā)送 SYN/ACK 之前需要先等待 client 的序號回應(yīng)), 所以可能會造成某些服務(wù)的延遲現(xiàn)象,例如 SMTP (mail server)。 不過總的來說,這個設(shè)定值還是不錯用的! 只是不適合用在負載已經(jīng)很高的伺服器內(nèi)喔! 因為負載太高的主機有時會讓核心誤判遭受 SYN Flooding 的攻擊呢。

如果是為了系統(tǒng)的 TCP 封包連線最佳化,則可以參考 tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow 這幾個設(shè)定值的意義。



--------------------------------------------------------------------------------

/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

阻斷式服務(wù)常見的是 SYN Flooding ,不過,我們知道系統(tǒng)其實可以接受使用 ping 的回應(yīng), 而 ping 的封包是可以給很大的!想像一個狀況, 如果有個搞破壞的人使用 1000 臺主機傳送 ping 給你的主機,而且每個 ping 都高達數(shù)百 K bytes時, 你的網(wǎng)路頻寬會怎樣?要嘛就是頻寬被吃光,要嘛可能系統(tǒng)會當機! 這種方式分別被稱為 ping flooding (不斷發(fā) ping) 及 ping of death (發(fā)送大的 ping 封包)。

那如何避免呢?取消 ICMP 類型 8 的 ICMP 封包回應(yīng)就是了。我們可以透過防火墻來抵擋, 這也是比較建議的方式。當然也可以讓核心自動取消 ping 的回應(yīng)。不過您必須要瞭解, 某些區(qū)域網(wǎng)路內(nèi)常見的服務(wù) (例如動態(tài) IP 分配 DHCP 協(xié)定) 會使用 ping 的方式來偵測是否有重復(fù)的 IP ,所以你最好不要取消所有的 ping 回應(yīng)比較好。

核心取消 ping 回應(yīng)的設(shè)定值有兩個,分別是:/proc/sys/net/ipv4 內(nèi)的 icmp_echo_ignore_broadcasts (僅有 ping broadcast 位址時才取消 ping 的回應(yīng)) 及 icmp_echo_ignore_all (全部的 ping 都不回應(yīng))。鳥哥建議設(shè)定 icmp_echo_ignore_broadcasts 就好了。 你可以這麼做:
[root@linux ~]# echo "1" >  \
> /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

論壇徽章:
0
3 [報告]
發(fā)表于 2006-09-21 11:56 |只看該作者
--------------------------------------------------------------------------------

/proc/sys/net/ipv4/conf/網(wǎng)路介面/*

咱們的核心還可以針對不同的網(wǎng)路介面進行不一樣的參數(shù)設(shè)定喔!網(wǎng)路介面的相關(guān)設(shè)定放置在 /proc/sys/net/ipv4/conf/ 當中,每個介面都以介面代號做為其代表,例如 eth0 介面的相關(guān)設(shè)定資料在 /proc/sys/net/ipv4/conf/eth0/ 內(nèi)。那麼網(wǎng)路介面的設(shè)定資料有哪些比較需要注意的呢? 大概有底下這幾個:

rp_filter:稱為逆向路徑過濾 (Reverse Path Filtering), 可以藉由分析網(wǎng)路介面的路由資訊配合封包的來源位址,來分析該封包是否為合理。舉例來說,你有兩張網(wǎng)卡,eth0 為 192.168.10.100/24 ,eth1 為 public IP 。那麼當有一個封包自稱來自 eth1 ,但是其 IP 來源為 192.168.10.200 , 那這個封包就不合理,應(yīng)予以丟棄。這個設(shè)定值建議可以啟動的。


log_martians:這個設(shè)定資料可以用來啟動記錄不合法的 IP 來源, 舉例來說,包括來源為 0.0.0.0、127.x.x.x、及 Class E 的 IP 來源,因為這些來源的 IP 不應(yīng)該應(yīng)用於 Internet 啊。 記錄的資料預(yù)設(shè)放置到核心放置的登錄檔 /var/log/messages。


accept_source_route:或許某些路由器會啟動這個設(shè)定值, 不過目前的設(shè)備很少使用到這種來源路由,你可以取消這個設(shè)定值。


accept_redirects:當你在同一個實體網(wǎng)域內(nèi)架設(shè)一部路由器, 但這個實體網(wǎng)域有兩個 IP 網(wǎng)域,例如 192.168.0.0/24, 192.168.1.0/24。此時你的 192.168.0.100 想要向 192.168.1.100 傳送訊息時,路由器可能會傳送一個 ICMP redirect 封包告知 192.168.0.100 直接傳送資料給 192.168.1.100 即可,而不需透過路由器。因為 192.168.0.100 與 192.168.1.100確實是在同一個實體線路上 (兩者可以直接互通),所以路由器會告知來源 IP 使用最短路徑去傳遞資料。但那兩部主機在不同的 IP 段,卻是無法實際傳遞訊息的!這個設(shè)定也可能會產(chǎn)生一些輕微的安全風險,所以建議關(guān)閉他。


send_redirects:與上一個類似,只是此值為發(fā)送一個 ICMP redirect 封包。 同樣建議關(guān)閉。(事實上,鳥哥在某補教中心教同學架設(shè)路由器時,就曾經(jīng)為了這個 ICMP redirect 的問題傷腦筋! 其實關(guān)閉 redirect 的這兩個項目即可。)
要達成上面的功能你必須要這樣做:
[root@linux ~]# vi somefile
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
    echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
    echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
    echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
    echo "0" > $i
done

[root@linux ~]# sh somefile




--------------------------------------------------------------------------------
本機防火墻的一個實例

介紹了這麼多的防火墻語法與相關(guān)的注意事項后,終於要來架設(shè)防火墻了。如同前面談到的, 你當然可以使用 iptables-save 的語法將相關(guān)的防火墻規(guī)則轉(zhuǎn)存到 /etc/sysconfig/iptables 去, 然后透過 iptables-restore 或者是重新啟動 iptables 來啟用你的新防火墻規(guī)則。 不過鳥哥還是比較習慣使用 shell script 來撰寫防火墻規(guī)則,而且此一特色還可以用在呼叫其他的 scripts , 可以讓防火墻規(guī)則具有較為靈活的使用方式。好了,那就來談?wù)勅绾卧O(shè)定咱們的防火墻規(guī)則吧!


--------------------------------------------------------------------------------
規(guī)則草擬

鳥哥底下介紹的這個防火墻,其實可以用來作為路由器上的防火墻,也可以用來作為本機的防火墻。 假設(shè)硬體連線如同圖二所示那樣的環(huán)境, Linux 主機本身也是內(nèi)部 LAN 的路由器! 亦即是一個簡單的 IP 分享器的功能啦!假設(shè)鳥哥網(wǎng)路介面有底下這些:

外部網(wǎng)路使用 eth1 (如果是撥接,有可能是 ppp0,請針對您的環(huán)境來設(shè)定);
內(nèi)部網(wǎng)路使用 eth0 ,且內(nèi)部使用 192.168.1.0/24 這個 Class ;
主機預(yù)設(shè)開放的服務(wù)有 WWW, SSH, SMTP 等等;
由於希望將信任網(wǎng)域 (LAN) 與不信任網(wǎng)域 (Internet) 整個分開的完整一點, 所以希望你可以在 Linux 上面安裝兩塊以上的實體網(wǎng)卡,將兩塊網(wǎng)卡接在不同的網(wǎng)域,這樣可以避免很多問題。 至於最重要的防火墻規(guī)則是:『關(guān)閉所有的連線,僅開放特定的服務(wù)』模式。 而且假設(shè)內(nèi)部使用者已經(jīng)受過良好的訓(xùn)練,因此在 filter table 的三條鏈個預(yù)設(shè)政策是:

INPUT 為 DROP
OUTPUT 及 FORWARD 為 ACCEPT
為了未來修改的方便,鳥哥將整個 script 拆成三部分,分別是:

iptables.rule:設(shè)定最基本的規(guī)則,包括清除防火墻規(guī)則、載入模組、設(shè)定服務(wù)可接受等;
iptables.deny:設(shè)定抵擋某些惡意主機的進入;
iptables.allow:設(shè)定允許某些自訂的后門來源主機!
鳥哥底下預(yù)計提供的防火墻流程是這樣的:



圖九、防火墻規(guī)則的流程


原則上,內(nèi)部 LAN 主機與主機本身的開放度很高,因為 Output 與 Forward 是完全開放不理的!對於小家庭的主機是可以接受的,因為我們內(nèi)部的電腦數(shù)量不多,而且人員都是熟悉的, 所以不需要特別加以控管!但是:『在大企業(yè)的內(nèi)部,這樣的規(guī)劃是很不合格的, 因為您不能保證內(nèi)部所有的人都可以按照您的規(guī)定來使用 Network !』也就是說『家賊難防』呀! 因此,連 Output 與 Forward 都需要特別加以管理才行!



--------------------------------------------------------------------------------
實際設(shè)定

事實上,我們在設(shè)定防火墻的時候,不太可能會一個一個指令的輸入,通常是利用 shell scripts 來幫我們達成這樣的功能吶!底下是利用上面的流程圖所規(guī)劃出來的防火墻 scripts,您可以參考看看, 但是您需要將環(huán)境修改成適合您自己的環(huán)境才行喔!
[root@linux ~]# mkdir -p /usr/local/virus/iptables
[root@linux ~]# cd /usr/local/virus/iptables
[root@linux iptables]# vi iptables.rule
#!/bin/bash

# 請先輸入您的相關(guān)參數(shù),不要輸入錯誤了!
  EXTIF="eth1"              # 這個是可以連上 Public IP 的網(wǎng)路介面
  INIF="eth0"               # 內(nèi)部 LAN 的連接介面;若無請?zhí)?""
  INNET="192.168.1.0/24"    # 內(nèi)部 LAN 的網(wǎng)域,若沒有內(nèi)部 LAN 請設(shè)定為 ""
  export EXTIF INIF INNET

# 第一部份,針對本機的防火墻設(shè)定!###########################
# 1. 先設(shè)定好核心的網(wǎng)路功能:
  echo "1" > /proc/sys/net/ipv4/tcp_syncookies
  echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
  for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo "1" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/log_martians; do
        echo "1" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo "0" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo "0" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
        echo "0" > $i
  done

# 2. 清除規(guī)則、設(shè)定預(yù)設(shè)政策及開放 lo 與相關(guān)的設(shè)定值
  PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH
  iptables -F
  iptables -X
  iptables -Z
  iptables -P INPUT   DROP
  iptables -P OUTPUT  ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -A INPUT -i lo -j ACCEPT
  iptables -A INPUT -m state --state RELATED -j ACCEPT

# 3. 啟動額外的防火墻 script 模組
  if [ -f /usr/local/virus/iptables/iptables.deny ]; then
        sh /usr/local/virus/iptables/iptables.deny
  fi
  if [ -f /usr/local/virus/iptables/iptables.allow ]; then
        sh /usr/local/virus/iptables/iptables.allow
  fi
  if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
        sh /usr/local/virus/httpd-err/iptables.http
  fi
  iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

# 4. 允許某些類型的 ICMP 封包進入
  AICMP="0 3 3/4 4 11 12 14 16 18"
  for tyicmp in $AICMP
  do
     iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
  done

# 5. 允許某些服務(wù)的進入,請依照您自己的環(huán)境開啟
# iptables -A INPUT -p TCP -i $EXTIF --dport  22  -j ACCEPT   # SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport  25  -j ACCEPT   # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --sport  53  -j ACCEPT   # DNS
# iptables -A INPUT -p TCP -i $EXTIF --sport  53  -j ACCEPT   # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport  80  -j ACCEPT   # WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport 110  -j ACCEPT   # POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 443  -j ACCEPT   # HTTPS

# 第二部份,針對后端主機的防火墻設(shè)定!##############################
# 1. 先載入一些有用的模組
  modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack
ip_conntrack_ftp ip_conntrack_irc"
  for mod in $modules
  do
        testmod=`lsmod | grep "${mod} "`
        if [ "$testmod" == "" ]; then
                modprobe $mod
        fi
  done

# 2. 清除 NAT table 的規(guī)則吧!
  iptables -F -t nat
  iptables -X -t nat
  iptables -Z -t nat
  iptables -t nat -P PREROUTING  ACCEPT
  iptables -t nat -P POSTROUTING ACCEPT
  iptables -t nat -P OUTPUT      ACCEPT

# 3. 開放成為路由器,且為 IP 分享器!
  if [ "$INIF" != "" ]; then
    iptables -A INPUT -i $INIF -j ACCEPT
    echo "1" > /proc/sys/net/ipv4/ip_forward
    if [ "$INNET" != "" ]; then
      for innet in $INNET
      do
        iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
      done
    fi
  fi

# 4. 內(nèi)部伺服器的設(shè)定:
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80  \
           -j DNAT --to 192.168.1.210:80


特別留意上面程式碼的特殊字體部分,基本上,你只要修改一下最上方的介面部分, 應(yīng)該就能夠運作這個防火墻了。不過因為每個人的環(huán)境都不相同, 因此你在設(shè)定完成后,依舊需要測試一下才行喔!不然,出了問題不要怪我啊!.... 再來看一下關(guān)於 iptables.allow 的內(nèi)容是如何?假如我要讓一個 140.116.44.0/24 這個網(wǎng)域的所有主機來源可以進入我的主機的話,那麼這個檔案的內(nèi)容可以寫成這樣:
[root@linux iptables]# vi iptables.allow
#!/bin/bash
# 底下則填寫你允許進入本機的其他網(wǎng)域或主機!
  iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT

# 底下則是關(guān)於抵擋的檔案設(shè)定法!
[root@linux iptables]# vi iptables.deny
#!/bin/bash
# 底下填寫的是『你要抵擋的那個咚咚!』
  iptables -A INPUT -i $EXTIF -s 140.116.44.254 -j DROP

[root@linux iptables]# chmod 700 iptables.*


將這三個檔案的權(quán)限設(shè)定為 700 且只屬於 root 的權(quán)限后,就能夠直接執(zhí)行 iptables.rule 囉! 不過要注意的是,在上面的案例當中,鳥哥預(yù)設(shè)將所有的服務(wù)的通道都是關(guān)閉的! 所以你必須要到本機防火墻的第 5 步驟處將一些註解符號 (#) 解開才行。 同樣的,如果有其他更多的 port 想要開啟時,一樣需要增加額外的規(guī)則才行喔!

不過,還是如同前面我們所說的,這個 firewall 僅能提供基本的安全防護,其他的相關(guān)問題還需要再測試測試呢! 此外,如果你希望一開機就自動執(zhí)行這個 script 的話,請將這個檔案的完整檔名寫入 /etc/rc.d/rc.local 當中,有點像底下這樣:
[root@linux ~]# vi /etc/rc.d/rc.local
.....其他省略.....
# 1. Firewall
/usr/local/virus/iptables/iptables.rule
.....其他省略.....


上述三個檔案請你不要在 Windows 系統(tǒng)上面編輯后傳送到 Linux 上運作,因為 Windows 系統(tǒng)的斷行字元問題, 將可能導(dǎo)致該檔案無法執(zhí)行。建議你直接到底下去下載,傳送到 Linux 后可以利用 dos2unix 指令去轉(zhuǎn)換斷行字元! 就不會有問題!

http://linux.vbird.org/download/ ... etail&fileid=43
這就是一個最簡單、陽春的防火墻。同時,這個防火墻還可以具有最陽春的 IP 分享器的功能呢! 也就是在 iptables.rule 這個檔案當中的第二部分了。 這部分我們在下一節(jié)會再繼續(xù)介紹的。

[ 本帖最后由 superchen 于 2006-9-21 13:16 編輯 ]

論壇徽章:
0
4 [報告]
發(fā)表于 2006-09-21 11:57 |只看該作者
--------------------------------------------------------------------------------
NAT 主機的設(shè)定

呼呼!終於來到這個地方了!我們準備要架設(shè)一個路由器的延伸伺服器,就稱之為 NAT 主機。 NAT 是什麼呢?簡單的說,你可以稱他為內(nèi)部 LAN 主機的『 IP 分享器』啦!

NAT 的全名是 Network Address Translation,字面上的意思是『網(wǎng)路位址的轉(zhuǎn)換』。由字面上的意思我們來想一想, TCP/IP 的網(wǎng)路封包不是有 IP 位址嗎?那 IP 位址不是有來源與目的嗎?我們的 iptables 指令就能夠修改 IP 封包的表頭資料, 嘿嘿!連目標或來源的 IP 位址都可以修改呢!甚至連 TCP 封包表頭的 port number 也能修改!真是有趣!

NAT 主機的功能可以達到類似圖二所介紹的類似 IP 分享的功能之外, 還可以達到類似圖四所介紹的 DMZ (非軍事區(qū)) 的功能!這完全取決於我們的 NAT 是修改: (1)來源 IP 還是 (2)目標 IP !底下我們就來聊一聊吧! ^_^


--------------------------------------------------------------------------------
什麼是 NAT? SNAT? DNAT?

在談到 NAT 的實際運作之前,讓我們再來看一下比較簡單的封包透過 iptables 而傳送到后端主機的流程(請往前參考圖八)。當網(wǎng)路佈線如圖二的架構(gòu), 若內(nèi)部 LAN 有任何一部主機想要傳送封包出去時,那麼這個封包要如何透過 Linux 主機而傳送出去? 他是這樣的:

先經(jīng)過 NAT table 的 PREROUTING 鏈;
經(jīng)由路由判斷確定這個封包是要進入本機與否,若不進入本機,則下一步;
再經(jīng)過 Filter table 的 FORWARD 鏈;
通過 NAT table 的 POSTROUTING 鏈,最后傳送出去。
NAT 主機的重點就在於上面流程的第 1,4 步驟,也就是 NAT table 的兩條重要的鏈:PREROUTING 與 POSTROUTING。 那這兩條鏈有什麼重要的功能呢?重點在於修改 IP 嘛!但是這兩條鏈修改的 IP 是不一樣的! POSTROUTING 在修改來源 IP ,PREROUTING 則在修改目標 IP 。 由於修改的 IP 不一樣,所以就稱為 來源 NAT (Source NAT, SNAT) 及目標 NAT (Destination NAT, DNAT)。我們先來談一談 IP 分享器功能的 SNAT 吧!


--------------------------------------------------------------------------------

來源 NAT, SNAT

你應(yīng)該有聽說過 IP 分享器這個玩意兒,他可以讓你家庭裡的好幾部主機同時透過一條 ADSL 網(wǎng)路連線到 Internet 上面, 例如圖二連線的方式來說,那個 Linux 主機就是 IP 分享器啦!那麼他是如何達到 IP 分享的功能?就是透過 NAT 表格的 POSTROUTING 來處理的。假設(shè)你的網(wǎng)路佈線如圖二所示, 那麼 NAT 主機是如何處理這個封包的呢?



圖十、SNAT 封包傳送出去的示意圖


如上圖所示,在用戶端 192.168.1.100 這部主機要連線到 http://tw.yahoo.com 去時,他的封包表頭會如何變化?

用戶端所發(fā)出的封包表頭中,來源會是 192.168.1.100 ,然后傳送到 NAT 這部主機;
NAT 這部主機的內(nèi)部介面 (192.168.1.2) 接收到這個封包后,會主動分析表頭資料, 因為表頭資料顯示目的并非 Linux 本機,所以開始經(jīng)過路由, 將此封包轉(zhuǎn)到可以連接到 Internet 的 Public IP 處;
由於 private IP 與 public IP 不能互通,所以 Linux 主機透過 iptables 的 NAT table 內(nèi)的 Postrouting 鏈將封包表頭的來源偽裝成為 Linux 的 Public IP ,并且將兩個不同來源 (192.168.1.100 及 public IP) 的封包對應(yīng)寫入暫存記憶體當中, 然后將此封包傳送出去了;
此時 Internet 上面看到這個封包時,都只會知道這個封包來自那個 Public IP 而不知道其實是來自內(nèi)部啦。 好了,那麼如果 Internet 回傳封包呢?又會怎麼作?



圖十一、SNAT 封包接收的示意圖



在 Internet 上面的主機接到這個封包時,會將回應(yīng)資料傳送給那個 Public IP 的主機;
當 Linux NAT 主機收到來自 Internet 的回應(yīng)封包后,會分析該封包的序號,并比對剛剛記錄到記憶體當中的資料, 由於發(fā)現(xiàn)該封包為后端主機之前傳送出去的,因此在 NAT Prerouting 鏈中,會將目標 IP 修改成為后端主機,亦即那部 192.168.1.100,然后發(fā)現(xiàn)目標已經(jīng)不是本機 (public IP), 所以開始透過路由分析封包流向;
封包會傳送到 192.168.1.2 這個內(nèi)部介面,然后再傳送到最終目標 192.168.1.100 機器上去!
經(jīng)過這個流程,您就可以發(fā)現(xiàn)到,所有內(nèi)部 LAN 的主機都可以透過這部 NAT 主機連線出去, 而大家在 Internet 上面看到的都是同一個 IP (就是 NAT 那部主機的 public IP 啦!), 所以,如果內(nèi)部 LAN 主機沒有連上不明網(wǎng)站的話,那麼內(nèi)部主機其實是具有一定程度的安全性的啦! 因為 Internet 上的其他主機沒有辦法主動攻擊你的 LAN 內(nèi)的 PC 嘛!所以我們才會說, NAT 最簡單的功能就是類似 IP 分享器啦!那也是 SNAT 的一種。

Tips:
NAT 主機與路由器有啥不同?基本上,NAT 主機一定是路由器,不過, NAT 主機由於會修改 IP 表頭資料, 因此與單純轉(zhuǎn)遞封包的路由器不同。最常見的 IP 分享器就是一個路由器,但是這個 IP 分享器一定會有一個 Public IP 與一個 Private IP,讓 LAN 內(nèi)的 Private IP 可以透過 IP 分享器的 Public IP 傳送出去喔! 至於路由器通常兩邊都是 Public IP 或同時為 Private IP。   


--------------------------------------------------------------------------------

目標 NAT, DNAT

SNAT 主要是應(yīng)付內(nèi)部 LAN 連接到 Internet 的使用方式,至於 DNAT 則主要用在內(nèi)部主機想要架設(shè)可以讓 Internet 存取的伺服器啦! 就有點類似圖四的 DMZ 內(nèi)的主機。〉紫乱蚕葋碚勔徽 DNAT 的運作吧!



圖十二、DNAT 的封包傳送示意圖


如上圖十二所示,假設(shè)我的內(nèi)部主機 192.168.1.210 啟動了 WWW 服務(wù),這個服務(wù)的 port 開啟在 port 80 , 那麼 Internet 上面的主機 (61.xx.xx.xx) 要如何連接到我的內(nèi)部伺服器呢?當然啦, 還是得要透過 Linux NAT 主機嘛!所以這部 Internet 上面的機器必須要連接到我們的 NAT 的 public IP 才行。

外部主機想要連接到目的端的 WWW 服務(wù),則必須要連接到我們的 NAT 主機上頭;
我們的 NAT 主機已經(jīng)設(shè)定好要分析出 port 80 的封包,所以當 NAT 主機接到這個封包后, 會將目標 IP 由 public IP 改成 192.168.1.210 ,且將該封包相關(guān)資訊記錄下來,等待內(nèi)部伺服器的回應(yīng);
上述的封包在經(jīng)過路由后,來到 private 介面處,然后透過內(nèi)部的 LAN 傳送到 192.168.1.210 上頭!
192.186.1.210 會回應(yīng)資料給 61.xx.xx.xx ,這個回應(yīng)當然會傳送到 192.168.1.2 上頭去;
經(jīng)過路由判斷后,來到 NAT Postrouting 的鏈,然后透過剛剛第二步驟的記錄,將來源 IP 由 192.168.1.210 改為 public IP 后,就可以傳送出去了! (類似圖十的狀態(tài)!)。
其實整個步驟幾乎就等於 SNAT 的反向傳送哩!這就是 DNAT 囉!很簡單吧!


--------------------------------------------------------------------------------
最陽春 NAT 主機: IP 分享功能

在 Linux 的 NAT 主機服務(wù)當中,最常見的就是類似圖二的 IP 分享器功能了。 而由剛剛的介紹你也該知道,這個 IP 分享器的功能其實就是 SNAT 啦!作用就只是在 iptables 內(nèi)的 NAT 表格當中,那個路由后的 POSTROUTING 鏈進行 IP 的偽裝就是了。另外, 你也必須要瞭解,你的 NAT 主機必須要有一個 public IP 介面,以及一個內(nèi)部 LAN 連接的 private IP 介面才行。

同樣的,我的假設(shè)是這樣的:

外部介面使用 eth1 ,這個介面具有 public IP 喔;
內(nèi)部介面使用 eth0 ,假設(shè)這個 IP 為 192.168.1.2 ;
記住!當你利用前面幾章談到的資料來設(shè)定你的網(wǎng)路參數(shù)后,務(wù)必要進行路由的檢測, 因為在 NAT 主機的設(shè)定方面,最容易出錯的地方就是路由了!尤其是在撥皆產(chǎn)生 ppp0 這個對外介面的環(huán)境下, 這個問題最嚴重。反正你要記得:『如果你的 public IP 取得的方式是撥接或 cable modem 時,你的設(shè)定檔 /etc/sysconfig/network, ifcfg-eth0, ifcfg-eth1 等檔案,千萬不要設(shè)定 GATEWAY 啦!』否則就會出現(xiàn)兩個 default gateway ,反而會造成問題。

如果你剛剛已經(jīng)下載了 iptables.rule ,那麼該檔案內(nèi)已經(jīng)含有 NAT 的腳本了! 你可以看到該檔案的第二部份關(guān)於 NAT 主機的部分,應(yīng)該有看到底下這幾行:
iptables -A INPUT -i $INIF -j ACCEPT
# 這一行在讓 NAT 主機可接受來自內(nèi)部 LAN 的封包
echo "1" > /proc/sys/net/ipv4/ip_forward
# 上頭這一行則是在讓你的 Linux 具有 router 的能力
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
# 這一行最關(guān)鍵!就是加入 nat table 封包偽裝!


重點在那個『 MASQUERADE 』!這個設(shè)定值就是『 IP 偽裝成為封包出去 (-o) 的那塊裝置上的 IP 』!以上面的例子來說,就是 $EXTIF ,也就是 eth1 啦! 所以封包來源只要來自 $innet (也就是內(nèi)部 LAN 的其他主機) ,只要該封包可透過 eth1 傳送出去, 那就會自動的修改 IP 的來源表頭成為 eth1 的 public IP 啦!就這麼簡單! 你只要將 iptables.rule 下載后,并設(shè)定好你的內(nèi)、外網(wǎng)路介面, 執(zhí)行 iptables.rule 后,你的 Linux 就擁有主機防火墻以及 NAT 主機的功能了!


--------------------------------------------------------------------------------

LAN 內(nèi)其他 PC 的設(shè)定

上面提到的是 NAT 主機的設(shè)定,那麼在 LAN 內(nèi)的其他 PC 網(wǎng)路參數(shù)要如何設(shè)定呢?很簡單啊, 只要記得底下的參數(shù)值即可:

NETWORK 為 192.168.1.0
NETMASK 為 255.255.255.0
BROADCAST 為 192.168.1.255
IP 可以設(shè)定 192.168.1.1 ~ 192.168.1.254 間,不可重復(fù)!
通訊閘 (Gateway) 需要設(shè)定為 192.168.1.2 (NAT 主機的 Private IP)
DNS (/etc/resolv.conf) 需設(shè)定為 168.95.1.1 (Hinet) 或 139.175.10.20 (Seed Net), 這個請依您的 ISP 而定;
這樣就搞定一部陽春的 NAT 主機了!簡單的要命啊!

事實上,除了 IP 偽裝 (MASQUERADE) 之外,我們還可以直接指定修改 IP 封包表頭的來源 IP 呢! 舉例來說,如下面這個例子:
范例:將要由 eth1 傳送出去的封包,封包來源改為 192.168.200.250
[root@linux ~]# iptables -t nat -A POSTROUTING -o eth1 \
>  -j SNAT --to 192.168.200.250

范例:同上,但封包來源為 192.168.200.210~220
[root@linux ~]# iptables -t nat -A POSTROUTING -o eth1 \
>  -j SNAT --to 192.168.200.210-192.168.200.210


這樣也可以修改網(wǎng)路封包的來源 IP 資料喔!不過,除非你使用的是固定 IP , 且有多個 IP 可以對外連線,否則一般使用 IP 偽裝即可,不需要使用到這個 SNAT 吧? 當然,你也可能有自己的獨特的環(huán)境啦! ^_^



--------------------------------------------------------------------------------
iptables 的額外核心模組功能

如果你剛剛在 iptables.rule 內(nèi)的第二部分有仔細看的話, 那有沒有覺得很奇怪,為何我們需要載入一些有用的模組?舉例來說, ip_nat_ftp 及 ip_net_irc ? 這是因為很多通訊協(xié)定使用的封包傳輸比較特殊,尤其是 FTP 檔案傳輸使用到兩個 port 來處理資料! 這個部分我們會在 FTP 章節(jié)再次的詳談,在這裡你要先知道,我們的 iptables 提供很多好用的模組, 這些模組可以輔助封包的過濾用途,讓我們可以節(jié)省很多 iptables 的規(guī)則擬定, 好棒的吶! ^_^



--------------------------------------------------------------------------------
在防火墻后端之網(wǎng)路伺服器 DNAT 設(shè)定

既然可以做 SNAT 的 IP 分享功能,我們當然可以使用 iptables 做出 DMZ 啦! 但是再次重申,不同的伺服器封包傳輸?shù)姆绞娇赡苡悬c差異,因此,建議新手不要玩這個咚咚! 否則很容易導(dǎo)致某些服務(wù)無法順利對 Internet 提供的問題。

先來談一談,如果我想要處理 DNAT 的功能時, iptables 要如何下達指令? 另外,你必須要知道的是, DNAT 用到的是 nat table 的 Prerouting 鏈喔!不要搞錯了。
范例:將連接到 eth1 介面的 port 80 傳導(dǎo)到內(nèi)部的 192.168.1.210
[root@linux ~]# iptables -t nat -A PREROUTING -p tcp -i eth1 \
> --dport 80 -j DNAT --to 192.168.1.210:80


那個『 -j DNAT --to IP[:port] 』就是精髓啦!代表從 eth1 這個介面?zhèn)魅氲,且想要使?port 80 的服務(wù)時, 將該封包重新傳導(dǎo)到 192.168.1.210:80 的 IP 及 port 上面!可以同時修改 IP 與 port 呢!真方便。 其他還有一些較進階的 iptables 使用方式,如下所示:
-j REDIRECT --to-ports <port number>
# 這個也挺常見的,基本上,就是進行本機上面 port 的轉(zhuǎn)換就是了!
# 不過,特別留意的是,這個動作僅能夠在 nat table 的 PREROUTING 以及
# OUTPUT 鏈上面實行而已喔!

范例:將要求與 80 連線的封包轉(zhuǎn)遞到 8080 這個 port
[root@linux ~]# iptables -t nat -A PREROUTING -p tcp  --dport 80 \
> -j REDIRECT --to-ports 8080
# 這玩意最容易在您使用了非正規(guī)的 port 來進行某些 well known 的協(xié)定,
# 例如使用 8080 這個 port 來啟動 WWW ,但是別人都以 port 80 來連線,
# 所以,您就可以使用上面的方式來將對方對您主機的連線傳遞到 8080 囉!


至於更多的用途,那就有待你自己的發(fā)掘囉! ^_^

--------------------------------------------------------------------------------
重點回顧

要擁有一部安全的主機,必須要有良好的主機權(quán)限設(shè)定;隨時的更新套件;定期的重要資料備份;完善的員工教育訓(xùn)練。 僅有防火墻是不足夠的;
防火墻最大的功能就是幫助你『限制某些服務(wù)的存取來源』,可以管制來源與目標的 IP ;
防火墻依據(jù)封包抵擋的階層,可以分為 Proxy 以及 IP Filter (封包過濾) 兩種類型;
為了將整個網(wǎng)路的信任 (LAN) 與不信任 (Internet) 網(wǎng)域完整切割,防火墻通常具有兩個實體網(wǎng)路介面, 分別連結(jié)信任與不信任網(wǎng)域;
在防火墻內(nèi),但不在 LAN 內(nèi)的伺服器所在網(wǎng)域,通常被稱為 DMZ (非軍事區(qū)),如圖四所示;
封包過濾機制的防火墻,通常至少可以分析 IP, port, flag (如 TCP 封包的 SYN), MAC 等等;
防火墻對於病毒的抵擋并不敏感;
防火墻對於來自內(nèi)部的網(wǎng)路誤用或濫用的抵擋性可能較不足;
并不是架設(shè)防火墻之后,系統(tǒng)就一定很安全!還是需要更新套件漏洞以及管制使用者及權(quán)限設(shè)定等;
核心 2.4 以后的 Linux 使用 iptables 作為防火墻的軟體;
防火墻的訂定與『規(guī)則順序』有很大的關(guān)係;若規(guī)則順序錯誤,可能會導(dǎo)致防火墻的失效;
iptables 的預(yù)設(shè) table 共有三個,分別是 filter, nat 及 mangle ,慣用者為 filter (本機) 與 nat (后端主機)。
filter table 主要為針對本機的防火墻設(shè)定,依據(jù)封包流向又分為 INPUT, OUTPUT, FORWARD 三條鏈;
nat table 主要針對防火墻的后端主機,依據(jù)封包流向又分為 PREROUTING, OUTPUT, POSTROUTING 三條鏈, 其中 PREROUTING 與 DNAT 有關(guān), POSTROUTING 則與 SNAT 有關(guān);
iptables 的防火墻為規(guī)則比對,但所有規(guī)則都不符合時,則以預(yù)設(shè)政策 (policy) 作為封包的行為依據(jù);
核心本身有提供很多網(wǎng)路相關(guān)功能,針對 IPv4 之設(shè)定值都在 /proc/sys/net/ipv4/* 內(nèi);
iptables 的指令列當中,可以下達的參數(shù)相當?shù)亩,當下達 -j LOG 的參數(shù)時,則該封包的流程會被紀錄到 /var/log/messages 當中;
防火墻可以多重設(shè)定,例如雖然已經(jīng)設(shè)定了 iptables ,但是仍然可以持續(xù)設(shè)定 TCP Wrappers ,因為誰也不曉得什麼時候 iptables 會有漏洞~或者是規(guī)則規(guī)劃不良!

--------------------------------------------------------------------------------
課后練習

為什麼我架設(shè)了防火墻,我的主機還是可能中毒?
防火墻不是萬靈丹,他還是可能被病毒或者是木馬程式所入侵的! 此外,如果您的主機本身就已經(jīng)提供了多個網(wǎng)路服務(wù),則當該網(wǎng)路服務(wù)的套件有漏洞時, 防火墻仍然無法克服該服務(wù)的漏洞的!因此仍然需要持續(xù)的進行主機的監(jiān)視工作
請說明為何架設(shè)了防火墻,我的主機還是可能被入侵?入侵的依據(jù)可能是什麼方法?
因為防火墻僅是抵擋某些不受歡迎的封包,如果您有開放 WWW 的服務(wù)時,則要求您主機 port 80 的封包將可直接進入您的主機,萬一 WWW 套件有漏洞時,那麼就可能被入侵了!所以套件的更新很重要!
我們知道核心為 2.4 的 Linux 使用的防火墻機制為 iptables ,請問,如何知道我的 Linux 核心版本?
利用 uname -r 可以查得!
請列出 iptables 預(yù)設(shè)的兩個主要的 table ,以及各個 table 裡面的 chains 與各個 chains 所代表的意義;
filter 為預(yù)設(shè)的 Table,裡頭預(yù)設(shè)的鏈有:
INPUT:為來自外部,想要進入主機的封包;
OUTPUT:為來自主機,想要離開主機的封包;
FORWARD:為主機內(nèi)部網(wǎng)域與外部網(wǎng)域的封包(不論進或者出),但該封包不會進入主機。
還有 nat 這個 table:
PREROUTING:進行路由之前的封包傳送過程
OUTPUT:離開主機的封包傳送過程;
POSTROUTING:已經(jīng)經(jīng)過路由了,然后才進行的過濾規(guī)則。
什麼是 iptables 的預(yù)設(shè)政策 (Policy)?若我要針對 filter 的 INPUT 做成 DROP 的預(yù)設(shè)政策,指令如何下達?
當封包的所有屬性都不在防火墻的規(guī)則當中時,那麼這個封包能否順利的通過防火墻,則以 Policy 作為這個封包的最終動作了!
iptables -P INPUT DROP
假設(shè)今天我的 Linux 僅是作為 Client 之用,并沒有對 Internet 進行任何服務(wù), 那麼您的防火墻規(guī)劃應(yīng)該如何設(shè)定比較好?!
既然沒有對 Internet 提供任何服務(wù),那麼(1)請將所有的對外埠口先關(guān)閉吧!(2)防火墻規(guī)則當中,最重要的是 INPUT 的 Policy 一定要 DROP ,然后將『 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 』即可!
我要將來自 192.168.1.50 這個 IP 來源的封包,只要是向我的 21~23 埠口要求的封包,就將他抵擋,應(yīng)該如何下達 iptables 指令?
iptables -A INPUT -p tcp -s 192.168.1.50 --dport 21:23 -j DROP
我要將我自己主機 ping 的回應(yīng)功能取消,應(yīng)該如何下達 iptables 的指令?
因為 ping 能否回應(yīng)用的是 icmp 的 type 8 (請參考網(wǎng)路基礎(chǔ)內(nèi)的 ICMP 相關(guān)內(nèi)容),所以我可以這樣做:
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
請說明為何這個指令是錯誤的?『iptables -A INPUT -p udp --syn -s 192.168.0.20 -j DROP』?
因為只有 TCP 封包才會具有 SYN 的標誌, UDP 并沒有 SYN 的標誌!所以上面的指令是錯誤的
DNS 的要求是必須的,那麼我該如何設(shè)定我的主機可以接受要求 DNS 的回應(yīng)呢?
因為 DNS 的來源是 port 53 ,因此要接受來自 port 53 的封包就成為了:
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p tcp --sport 53 -j ACCEPT
如何取消 iptables 在我的系統(tǒng)上面?
先要清除規(guī)則后,才能夠?qū)?iptables 移除!不過,我們主要將規(guī)則清除即可!
iptables -F; iptables -X; iptables -Z
iptables -t nat -F; iptables -t nat -X; iptables -t nat -Z
如何儲存目前的防火墻機制,以及如何將上次儲存下來的機制回復(fù)到目前的系統(tǒng)中?
請利用 iptables-save 以及 iptables-restore 這兩個指令,配合命令重導(dǎo)向即可!
如果你的區(qū)網(wǎng)當中有個 PC 使用者老是連上 Internet 亂搞,你想要將他的 IP 鎖住,但他總是有辦法修改成其他 IP 來連外, 那你該怎麼辦?讓他無法繼續(xù)連外?
可以利用封鎖網(wǎng)路卡卡號 MAC 來處理!

--------------------------------------------------------------------------------
參考資料

中文網(wǎng)站:
http://www.study-area.org/linux/servers/linux_nat.htm
http://linux.tnc.edu.tw/techdoc/firewall/
http://www.linuxyes.com/tw/tutorial/iptables.html
英文網(wǎng)站:
http://www.netfilter.org/
http://www.linuxguruz.org/iptables/
http://www.netfilter.org/documen ... iltering-HOWTO.html
http://www.interhack.net/pubs/fwfaq/
其他書籍與資料:
Robert L. Ziegler 著,朱亮愷等譯,『實戰(zhàn) Linux 防火墻--iptables 應(yīng)用全蒐錄』,上奇出版社,2004。
本機的核心文件:/usr/src/linux-{version}/networking/ip-sysctl.txt
iptables 的內(nèi)建 tables 與各個 chain 的相關(guān)性:
核心參數(shù)的相關(guān)說明:http://www.study-area.org/tips/a ... uting-HOWTO-12.html

--------------------------------------------------------------------------------
2002/08/20:第一次完成日期!
2003/08/25:重新設(shè)計內(nèi)容,改寫一些指令介紹,與前一篇『認識網(wǎng)路安全』 分的比較完整一點!
2006/09/06:將舊的文章移動到此處
2006/09/11:拿掉了已經(jīng)在基礎(chǔ)篇有介紹過的 認識服務(wù)之 TCP Wrappers。
2006/09/13:加入 NAT 的說明了,將舊的 NAT 主機移動到 此處。
2006/09/15:將 iptables.rule 的連結(jié)貼上去了!之前忘記修改該檔案了~

--------------------------------------------------------------------------------

[ 本帖最后由 superchen 于 2006-9-21 13:17 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP