iptables是封包過濾軟件,Linux內(nèi)核2.6以上都是這款軟件。本節(jié)節(jié)選自 鳥哥的 Linux 私房菜 -- 服務(wù)器架設(shè)篇 第九章、防火墻與 NAT 服務(wù)器
封包進(jìn)入流程:規(guī)則順序的重要性!iptables 的表格 (table) 與鏈 (chain)假設(shè)你的 Linux 主機(jī)提供了 WWW 的服務(wù),那么自然就要針對(duì) port 80 來啟用通過的封包規(guī)則,但是你發(fā)現(xiàn) IP 來源為 192.168.100.100 老是惡意的嘗試入侵你的系統(tǒng),所以你想要將該 IP 拒絕往來,最后,所有的非 WWW 的封包都給他丟棄,就這三個(gè)規(guī)則來說,你要如何設(shè)定防火墻檢驗(yàn)順序呢?
- Rule 1 先抵擋 192.168.100.100 ;
- Rule 2 再讓要求 WWW 服務(wù)的封包通過;
- Rule 3 將所有的封包丟棄。
這樣的排列順序就能符合你的需求,不過,萬(wàn)一你的順序排錯(cuò)了,變成:
- Rule 1 先讓要求 WWW 服務(wù)的封包通過;
- Rule 2 再抵擋 192.168.100.100 ;
- Rule 3 將所有的封包丟棄。
此時(shí),那個(gè) 192.168.100.100 『可以使用你的 WWW 服務(wù)』喔!只要他對(duì)你的主機(jī)送出 WWW 要求封包,就可以使用你的 WWW 功能了,因?yàn)槟愕囊?guī)則順序定義第一條就會(huì)讓他通過,而不去考慮第二條規(guī)則!這樣可以理解規(guī)則順序的意義了嗎! 現(xiàn)在再來想一想,如果 Rule 1 變成了『將所有的封包丟棄』,Rule 2 才設(shè)定『WWW 服務(wù)封包通過』,請(qǐng)問,我的 client 可以使用我的 WWW 服務(wù)嗎?呵呵!答案是『否~』想通了嗎?
本機(jī)的 iptables 語(yǔ)法什么是鏈呢?這得由 iptables 的名稱說起。為什么稱為 ip"tables" 呢? 因?yàn)檫@個(gè)防火墻軟件里面有多個(gè)表格 (table) ,每個(gè)表格都定義出自己的默認(rèn)政策與規(guī)則, 且每個(gè)表格的用途都不相同。我們可以使用底下這張圖來稍微了解一下:
Linux 的 iptables 至少就有三個(gè)表格,包括管理本機(jī)進(jìn)出的 filter 、管理后端主機(jī) (防火墻內(nèi)部的其他計(jì)算機(jī)) 的 nat 、管理特殊旗標(biāo)使用的 mangle (較少使用) 。更有甚者,我們還可以自定義額外的鏈呢! 真是很神奇吧!每個(gè)表格與其中鏈的用途分別是這樣的:
- filter (過濾器):主要跟進(jìn)入 Linux 本機(jī)的封包有關(guān),這個(gè)是預(yù)設(shè)的 table 喔!
- INPUT:主要與想要進(jìn)入我們 Linux 本機(jī)的封包有關(guān);
- OUTPUT:主要與我們 Linux 本機(jī)所要送出的封包有關(guān);
- FORWARD:這個(gè)咚咚與 Linux 本機(jī)比較沒有關(guān)系, 他可以『轉(zhuǎn)遞封包』到后端的計(jì)算機(jī)中,與下列 nat table 相關(guān)性較高。
- nat (地址轉(zhuǎn)換):是 Network Address Translation 的縮寫, 這個(gè)表格主要在進(jìn)行來源與目的之 IP 或 port 的轉(zhuǎn)換,與 Linux 本機(jī)較無關(guān),主要與 Linux 主機(jī)后的局域網(wǎng)絡(luò)內(nèi)計(jì)算機(jī)較有相關(guān)。
- PREROUTING:在進(jìn)行路由判斷之前所要進(jìn)行的規(guī)則(DNAT/REDIRECT)
- POSTROUTING:在進(jìn)行路由判斷之后所要進(jìn)行的規(guī)則(SNAT/MASQUERADE)
- OUTPUT:與發(fā)送出去的封包有關(guān)
- mangle (破壞者):這個(gè)表格主要是與特殊的封包的路由旗標(biāo)有關(guān), 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 鏈。 由于這個(gè)表格與特殊旗標(biāo)相關(guān)性較高,所以像咱們這種單純的環(huán)境當(dāng)中,較少使用 mangle 這個(gè)表格。
所以說,如果你的 Linux 是作為 www 服務(wù),那么要開放客戶端對(duì)你的 www 要求有響應(yīng),就得要處理 filter 的 INPUT 鏈; 而如果你的 Linux 是作為局域網(wǎng)絡(luò)的路由器,那么就得要分析 nat 的各個(gè)鏈以及 filter 的 FORWARD 鏈才行。也就是說, 其實(shí)各個(gè)表格的鏈結(jié)之間是有關(guān)系的!簡(jiǎn)單的關(guān)系可以由下圖這么看:
上面的圖示很復(fù)雜喔!不過基本上你依舊可以看出來,我們的 iptables 可以控制三種封包的流向:
- 封包進(jìn)入 Linux 主機(jī)使用資源 (路徑 A): 在路由判斷后確定是向 Linux 主機(jī)要求數(shù)據(jù)的封包,主要就會(huì)透過 filter 的 INPUT 鏈來進(jìn)行控管;
- 封包經(jīng)由 Linux 主機(jī)的轉(zhuǎn)遞,沒有使用主機(jī)資源,而是向后端主機(jī)流動(dòng) (路徑 B): 在路由判斷之前進(jìn)行封包表頭的修訂作業(yè)后,發(fā)現(xiàn)到封包主要是要透過防火墻而去后端,此時(shí)封包就會(huì)透過路徑 B 來跑動(dòng)。 也就是說,該封包的目標(biāo)并非我們的 Linux 本機(jī)。主要經(jīng)過的鏈?zhǔn)?filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。
- 封包由 Linux 本機(jī)發(fā)送出去 (路徑 C): 例如響應(yīng)客戶端的要求,或者是 Linux 本機(jī)主動(dòng)送出的封包,都是透過路徑 C 來跑的。先是透過路由判斷, 決定了輸出的路徑后,再透過 filter 的 OUTPUT 鏈來傳送的!當(dāng)然,最終還是會(huì)經(jīng)過 nat 的 POSTROUTING 鏈。
由于 mangle 這個(gè)表格很少被使用,如果將上圖的 mangle 拿掉的話,那就容易看的多了:
你就可以更輕松的了解到,事實(shí)上與本機(jī)最有關(guān)的其實(shí)是 filter 這個(gè)表格內(nèi)的 INPUT 與 OUTPUT 這兩條鏈,如果你的 iptables 只是用來保護(hù) Linux 主機(jī)本身的話,那 nat 的規(guī)則根本就不需要理他,直接設(shè)定為開放即可。
當(dāng)你安裝好 Linux 之后,系統(tǒng)應(yīng)該會(huì)主動(dòng)的幫你啟動(dòng)一個(gè)陽(yáng)春的防火墻規(guī)則才是, 不過這個(gè)陽(yáng)春防火墻可能不是我們想要的模式,因此我們需要額外進(jìn)行一些修訂的行為。
規(guī)則的觀察與清除如果你在安裝的時(shí)候選擇沒有防火墻的話,那么 iptables 在一開始的時(shí)候應(yīng)該是沒有規(guī)則的,不過, 可能因?yàn)槟阍诎惭b的時(shí)候就有選擇系統(tǒng)自動(dòng)幫你建立防火墻機(jī)制,那系統(tǒng)就會(huì)有默認(rèn)的防火墻規(guī)則了! 無論如何,我們先來看看目前本機(jī)的防火墻規(guī)則是如何吧!
[root@www ~]# iptables [-t tables] [-L] [-nv]選項(xiàng)與參數(shù):-t :后面接 table ,例如 nat 或 filter ,若省略此項(xiàng)目,則使用默認(rèn)的 filter-L :列出目前的 table 的規(guī)則-n :不進(jìn)行 IP 與 HOSTNAME 的反查,顯示訊息的速度會(huì)快很多!-v :列出更多的信息,包括通過該規(guī)則的封包總位數(shù)、相關(guān)的網(wǎng)絡(luò)接口等范例:列出 filter table 三條鏈的規(guī)則[root@www ~]# iptables -L -nChain INPUT (policy ACCEPT) <==針對(duì) INPUT 鏈,且預(yù)設(shè)政策為可接受target prot opt source destination <==說明欄ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED <==第 1 條規(guī)則ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 <==第 2 條規(guī)則ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 <==第 3 條規(guī)則ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 <==以下類推REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT) <==針對(duì) FORWARD 鏈,且預(yù)設(shè)政策為可接受target prot opt source destinationREJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT) <==針對(duì) OUTPUT 鏈,且預(yù)設(shè)政策為可接受target prot opt source destination范例:列出 nat table 三條鏈的規(guī)則[root@www ~]# iptables -t nat -L -nChain PREROUTING (policy ACCEPT)target prot opt source destinationChain POSTROUTING (policy ACCEPT)target prot opt source destinationChain OUTPUT (policy ACCEPT)target prot opt source destination在上表中,每一個(gè) Chain 就是前面提到的每個(gè)鏈啰~ Chain 那一行里面括號(hào)的 policy 就是預(yù)設(shè)的政策, 那底下的 target, prot 代表什么呢?
- target:代表進(jìn)行的動(dòng)作, ACCEPT 是放行,而 REJECT 則是拒絕,此外,尚有 DROP (丟棄) 的項(xiàng)目!
- prot:代表使用的封包協(xié)議,主要有 tcp, udp 及 icmp 三種封包格式;
- opt:額外的選項(xiàng)說明
- source :代表此規(guī)則是針對(duì)哪個(gè)『來源 IP』進(jìn)行限制?
- destination :代表此規(guī)則是針對(duì)哪個(gè)『目標(biāo) IP』進(jìn)行限制?
在輸出結(jié)果中,第一個(gè)范例因?yàn)闆]有加上 -t 的選項(xiàng),所以默認(rèn)就是 filter 這個(gè)表格內(nèi)的 INPUT, OUTPUT, FORWARD 三條鏈的規(guī)則啰。若針對(duì)單機(jī)來說,INPUT 與 FORWARD 算是比較重要的管制防火墻鏈, 所以你可以發(fā)現(xiàn)最后一條規(guī)則的政策是 REJECT (拒絕) 喔!雖然 INPUT 與 FORWARD 的政策是放行 (ACCEPT), 不過在最后一條規(guī)則就已經(jīng)將全部的封包都拒絕了!
不過這個(gè)指令的觀察只是作個(gè)格式化的查閱,要詳細(xì)解釋每個(gè)規(guī)則會(huì)比較不容易解析。舉例來說, 我們將 INPUT 的 5 條規(guī)則依據(jù)輸出結(jié)果來說明一下,結(jié)果會(huì)變成:
- 只要是封包狀態(tài)為 RELATED,ESTABLISHED 就予以接受
- 只要封包協(xié)議是 icmp 類型的,就予以放行
- 無論任何來源 (0.0.0.0/0) 且要去任何目標(biāo)的封包,不論任何封包格式 (prot 為 all),通通都接受
- 只要是傳給 port 22 的主動(dòng)式聯(lián)機(jī) tcp 封包就接受
- 全部的封包信息通通拒絕
最有趣的應(yīng)該是第 3 條規(guī)則了,怎么會(huì)所有的封包信息都予以接受?如果都接受的話,那么后續(xù)的規(guī)則根本就不會(huì)有用嘛! 其實(shí)那條規(guī)則是僅針對(duì)每部主機(jī)都有的內(nèi)部循環(huán)測(cè)試網(wǎng)絡(luò) (lo) 接口啦!如果沒有列出接口,那么我們就很容易搞錯(cuò)啰~ 所以,近來鳥哥都建議使用 iptables-save 這個(gè)指令來觀察防火墻規(guī)則啦!因?yàn)?iptables-save 會(huì)列出完整的防火墻規(guī)則,只是并沒有規(guī)格化輸出而已。
[root@www ~]# iptables-save [-t table]選項(xiàng)與參數(shù):-t :可以僅針對(duì)某些表格來輸出,例如僅針對(duì) nat 或 filter 等等[root@www ~]# iptables-save# Generated by iptables-save v1.4.7 on Fri Jul 22 15:51:52 2011*filter <==星號(hào)開頭的指的是表格,這里為 filter:INPUT ACCEPT [0:0] <==冒號(hào)開頭的指的是鏈,三條內(nèi)建的鏈:FORWARD ACCEPT [0:0] <==三條內(nèi)建鏈的政策都是 ACCEPT 啰!:OUTPUT ACCEPT [680:100461]-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT <==針對(duì) INPUT 的規(guī)則-A INPUT -p icmp -j ACCEPT-A INPUT -i lo -j ACCEPT <==這條很重要!針對(duì)本機(jī)內(nèi)部接口開放!-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT-A INPUT -j REJECT --reject-with icmp-host-prohibited-A FORWARD -j REJECT --reject-with icmp-host-prohibited <==針對(duì) FORWARD 的規(guī)則COMMIT# Completed on Fri Jul 22 15:51:52 2011由上面的輸出來看,有底線且內(nèi)容含有 lo 的那條規(guī)則當(dāng)中,『 -i lo 』指的就是由 lo 適配卡進(jìn)來的封包! 這樣看就清楚多了!因?yàn)橛袑懙浇涌诘年P(guān)系啊!不像之前的 iptables -L -n 嘛!這樣了解乎! 不過,既然這個(gè)規(guī)則不是我們想要的,那該如何修改規(guī)則呢?鳥哥建議,先刪除規(guī)則再慢慢建立各個(gè)需要的規(guī)則! 那如何清除規(guī)則?這樣做就對(duì)了:[root@www ~]# iptables [-t tables] [-FXZ]選項(xiàng)與參數(shù):-F :清除所有的已訂定的規(guī)則;-X :殺掉所有使用者 "自定義" 的 chain (應(yīng)該說的是 tables )啰;-Z :將所有的 chain 的計(jì)數(shù)與流量統(tǒng)計(jì)都?xì)w零范例:清除本機(jī)防火墻 (filter) 的所有規(guī)則[root@www ~]# iptables -F[root@www ~]# iptables -X[root@www ~]# iptables -Z由于這三個(gè)指令會(huì)將本機(jī)防火墻的所有規(guī)則都清除,但卻不會(huì)改變預(yù)設(shè)政策 (policy) , 所以如果你不是在本機(jī)下達(dá)這三行指令時(shí),很可能你會(huì)被自己擋在家門外 (若 INPUT 設(shè)定為 DROP 時(shí))!要小心啊!
一般來說,我們?cè)谥匦露x防火墻的時(shí)候,都會(huì)先將規(guī)則給他清除掉。還記得我們前面談到的, 防火墻的『規(guī)則順序』是有特殊意義的,所以啰, 當(dāng)然先清除掉規(guī)則,然后一條一條來設(shè)定會(huì)比較容易一點(diǎn)啦。底下就來談?wù)劧x預(yù)設(shè)政策吧!
定義預(yù)設(shè)政策 (policy)清除規(guī)則之后,再接下來就是要設(shè)定規(guī)則的政策啦!還記得政策指的是什么嗎?『 當(dāng)你的封包不在你設(shè)定的規(guī)則之內(nèi)時(shí),則該封包的通過與否,是以 Policy 的設(shè)定為準(zhǔn)』,在本機(jī)方面的預(yù)設(shè)政策中,假設(shè)你對(duì)于內(nèi)部的使用者有信心的話, 那么 filter 內(nèi)的 INPUT 鏈方面可以定義的比較嚴(yán)格一點(diǎn),而 FORWARD 與 OUTPUT 則可以訂定的松一些!通常都是將 INPUT 的 policy 定義為 DROP 啦,其他兩個(gè)則定義為 ACCEPT。 至于 nat table 則暫時(shí)先不理會(huì)他。
[root@www ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]選項(xiàng)與參數(shù):-P :定義政策( Policy )。注意,這個(gè) P 為大寫啊!ACCEPT :該封包可接受DROP :該封包直接丟棄,不會(huì)讓 client 端知道為何被丟棄。范例:將本機(jī)的 INPUT 設(shè)定為 DROP ,其他設(shè)定為 ACCEPT[root@www ~]# iptables -P INPUT DROP[root@www ~]# iptables -P OUTPUT ACCEPT[root@www ~]# iptables -P FORWARD ACCEPT[root@www ~]# iptables-save# Generated by iptables-save v1.4.7 on Fri Jul 22 15:56:34 2011*filter:INPUT DROP [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [0:0]COMMIT# Completed on Fri Jul 22 15:56:34 2011# 由于 INPUT 設(shè)定為 DROP 而又尚未有任何規(guī)則,所以上面的輸出結(jié)果顯示:# 所有的封包都無法進(jìn)入你的主機(jī)!是不通的防火墻設(shè)定!(網(wǎng)絡(luò)聯(lián)機(jī)是雙向的)看到輸出的結(jié)果了吧?INPUT 被修改了設(shè)定喔!其他的 nat table 三條鏈的預(yù)設(shè)政策設(shè)定也是一樣的方式,例如:『 iptables -t nat -P PREROUTING ACCEPT 』就設(shè)定了 nat table 的 PREROUTING 鏈為可接受的意思!預(yù)設(shè)政策設(shè)定完畢后,來談一談關(guān)于各規(guī)則的封包基礎(chǔ)比對(duì)設(shè)定吧。 封包的基礎(chǔ)比對(duì):IP, 網(wǎng)域及接口裝置開始來進(jìn)行防火墻規(guī)則的封包比對(duì)設(shè)定吧!既然是因特網(wǎng),那么我們就由最基礎(chǔ)的 IP, 網(wǎng)域及端口,亦即是 OSI 的第三層談起,再來談?wù)勓b置 (網(wǎng)絡(luò)卡) 的限制等等。這一小節(jié)與下一小節(jié)的語(yǔ)法你一定要記住,因?yàn)檫@是最基礎(chǔ)的比對(duì)語(yǔ)法喔!
[root@www ~]# iptables [-AI 鏈名] [-io 網(wǎng)絡(luò)接口] [-p 協(xié)議] [-s 來源IP/網(wǎng)域] [-d 目標(biāo)IP/網(wǎng)域] -j [ACCEPT|DROP|REJECT|LOG]選項(xiàng)與參數(shù):-AI 鏈名:針對(duì)某的鏈進(jìn)行規(guī)則的 "插入" 或 "累加" -A :新增加一條規(guī)則,該規(guī)則增加在原本規(guī)則的最后面。例如原本已經(jīng)有四條規(guī)則, 使用 -A 就可以加上第五條規(guī)則! -I :插入一條規(guī)則。如果沒有指定此規(guī)則的順序,默認(rèn)是插入變成第一條規(guī)則。 例如原本有四條規(guī)則,使用 -I 則該規(guī)則變成第一條,而原本四條變成 2~5 號(hào) 鏈 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關(guān),請(qǐng)看底下。-io 網(wǎng)絡(luò)接口:設(shè)定封包進(jìn)出的接口規(guī)范 -i :封包所進(jìn)入的那個(gè)網(wǎng)絡(luò)接口,例如 eth0, lo 等接口。需與 INPUT 鏈配合; -o :封包所傳出的那個(gè)網(wǎng)絡(luò)接口,需與 OUTPUT 鏈配合;-p 協(xié)定:設(shè)定此規(guī)則適用于哪種封包格式 主要的封包格式有: tcp, udp, icmp 及 all 。-s 來源 IP/網(wǎng)域:設(shè)定此規(guī)則之封包的來源項(xiàng)目,可指定單純的 IP 或包括網(wǎng)域,例如: IP :192.168.0.100 網(wǎng)域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。 若規(guī)范為『不許』時(shí),則加上 ! 即可,例如: -s ! 192.168.100.0/24 表示不許 192.168.100.0/24 之封包來源;-d 目標(biāo) IP/網(wǎng)域:同 -s ,只不過這里指的是目標(biāo)的 IP 或網(wǎng)域。-j :后面接動(dòng)作,主要的動(dòng)作有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT)及記錄(LOG)iptables 的基本參數(shù)就如同上面所示的,僅只談到 IP 、網(wǎng)域與裝置等等的信息, 至于 TCP, UDP 封包特有的埠口 (port number) 與狀態(tài) (如 SYN 旗標(biāo)) 則在下小節(jié)才會(huì)談到。 好,先讓我們來看看最基礎(chǔ)的幾個(gè)規(guī)則,例如開放 lo 這個(gè)本機(jī)的接口以及某個(gè) IP 來源吧!范例:設(shè)定 lo 成為受信任的裝置,亦即進(jìn)出 lo 的封包都予以接受[root@www ~]# iptables -A INPUT -i lo -j ACCEPT仔細(xì)看上面并沒有列出 -s, -d 等等的規(guī)則,這表示:不論封包來自何處或去到哪里,只要是來自 lo 這個(gè)界面,就予以接受!這個(gè)觀念挺重要的,就是『沒有指定的項(xiàng)目,則表示該項(xiàng)目完全接受』的意思! 例如這個(gè)案例當(dāng)中,關(guān)于 -s, -d...等等的參數(shù)沒有規(guī)定時(shí),就代表不論什么值都會(huì)被接受啰。
這就是所謂的信任裝置啦!假如你的主機(jī)有兩張以太網(wǎng)絡(luò)卡,其中一張是對(duì)內(nèi)部的網(wǎng)域,假設(shè)該網(wǎng)卡的代號(hào)為 eth1 好了, 如果內(nèi)部網(wǎng)域是可信任的,那么該網(wǎng)卡的進(jìn)出封包就通通會(huì)被接受,那你就能夠用:『iptables -A INPUT -i eth1 -j ACCEPT』 來將該裝置設(shè)定為信任裝置。不過,下達(dá)這個(gè)指令前要特別注意,因?yàn)檫@樣等于該網(wǎng)卡沒有任何防備了喔!
范例:只要是來自內(nèi)網(wǎng)的 (192.168.100.0/24) 的封包通通接受[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT# 由于是內(nèi)網(wǎng)就接受,因此也可以稱之為『信任網(wǎng)域』啰。范例:只要是來自 192.168.100.10 就接受,但 192.168.100.230 這個(gè)惡意來源就丟棄[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP# 針對(duì)單一 IP 來源,可視為信任主機(jī)或者是不信任的惡意來源喔![root@www ~]# iptables-save# Generated by iptables-save v1.4.7 on Fri Jul 22 16:00:43 2011*filter:INPUT DROP [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [17:1724]-A INPUT -i lo -j ACCEPT-A INPUT -s 192.168.100.0/24 -i eth1 -j ACCEPT-A INPUT -s 192.168.100.10/32 -i eth1 -j ACCEPT-A INPUT -s 192.168.100.230/32 -i eth1 -j DROPCOMMIT# Completed on Fri Jul 22 16:00:43 2011這就是最單純簡(jiǎn)單的防火墻規(guī)則的設(shè)定與觀察方式。不過,在上面的案例中,其實(shí)你也發(fā)現(xiàn)到有兩條規(guī)則可能有問題~ 那就是上面的特殊字體圈起來的規(guī)則順序。明明已經(jīng)放行了 192.168.100.0/24 了,所以那個(gè) 192.168.100.230 的規(guī)則就不可能會(huì)被用到!這就是有問題的防火墻設(shè)定啊!了解乎?那該怎辦?就重打啊!@_@! 那如果你想要記錄某個(gè)規(guī)則的紀(jì)錄怎么辦?可以這樣做:[root@www ~]# iptables -A INPUT -s 192.168.2.200 -j LOG[root@www ~]# iptables -L -ntarget prot opt source destinationLOG all -- 192.168.2.200 0.0.0.0/0 LOG flags 0 level 4到輸出結(jié)果的最左邊,會(huì)出現(xiàn)的是 LOG 喔!只要有封包來自 192.168.2.200 這個(gè) IP 時(shí), 那么該封包的相關(guān)信息就會(huì)被寫入到核心訊息,亦即是 /var/log/messages 這個(gè)檔案當(dāng)中。 然后該封包會(huì)繼續(xù)進(jìn)行后續(xù)的規(guī)則比對(duì)。所以說, LOG 這個(gè)動(dòng)作僅在進(jìn)行記錄而已,并不會(huì)影響到這個(gè)封包的其他規(guī)則比對(duì)的。 好了,接下來我們分別來看看 TCP,UDP 以及 ICMP 封包的其他規(guī)則比對(duì)吧! TCP, UDP 的規(guī)則比對(duì):針對(duì)端口設(shè)定在談到 TCP 與 UDP 時(shí),比較特殊的就是那個(gè)端口 (port),在 TCP 方面則另外有所謂的聯(lián)機(jī)封包狀態(tài), 包括最常見的 SYN 主動(dòng)聯(lián)機(jī)的封包格式。那么如何針對(duì)這兩種封包格式進(jìn)行防火墻規(guī)則的設(shè)定呢?你可以這樣看:
[root@www ~]# iptables [-AI 鏈] [-io 網(wǎng)絡(luò)接口] [-p tcp,udp] /> [-s 來源IP/網(wǎng)域] [--sport 埠口范圍] /> [-d 目標(biāo)IP/網(wǎng)域] [--dport 埠口范圍] -j [ACCEPT|DROP|REJECT]選項(xiàng)與參數(shù):--sport 端口范圍:限制來源的端口號(hào)碼,端口號(hào)碼可以是連續(xù)的,例如 1024:65535--dport 端口范圍:限制目標(biāo)的端口號(hào)碼。事實(shí)上就是多了那個(gè) --sport 及 --dport 這兩個(gè)玩意兒,重點(diǎn)在那個(gè) port 上面啦! 不過你得要特別注意,因?yàn)閮H有 tcp 與 udp 封包具有端口,因此你想要使用 --dport, --sport 時(shí),得要加上 -p tcp 或 -p udp 的參數(shù)才會(huì)成功喔!底下讓我們來進(jìn)行幾個(gè)小測(cè)試:
范例:想要聯(lián)機(jī)進(jìn)入本機(jī) port 21 的封包都抵擋掉:[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP范例:想連到我這部主機(jī)的網(wǎng)芳 (upd port 137,138 tcp port 139,445) 就放行[root@www ~]# iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT瞧!你可以利用 UDP 與 TCP 協(xié)議所擁有的端口號(hào)碼來進(jìn)行某些服務(wù)的開放或關(guān)閉喔!你還可以綜合處理呢!例如:只要來自 192.168.1.0/24 的 1024:65535 埠口的封包,且想要聯(lián)機(jī)到本機(jī)的 ssh port 就予以抵擋,可以這樣做:[root@www ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 /> --sport 1024:65534 --dport ssh -j DROP如果忘記加上 -p tcp 就使用了 --dport 時(shí),會(huì)發(fā)生啥問題呢?[root@www ~]# iptables -A INPUT -i eth0 --dport 21 -j DROPiptables v1.4.7: unknown option `--dport'Try `iptables -h' or 'iptables --help' for more information.你應(yīng)該會(huì)覺得很奇怪,怎么『 --dport 』會(huì)是未知的參數(shù) (arg) 呢?這是因?yàn)槟銢]有加上 -p tcp 或 -p udp 的緣故啊!很重要喔!
除了端口之外,在 TCP 還有特殊的旗標(biāo)啊!最常見的就是那個(gè)主動(dòng)聯(lián)機(jī)的 SYN 旗標(biāo)了。 我們?cè)?iptables 里面還支持『 --syn 』的處理方式,我們以底下的例子來說明好了:
范例:將來自任何地方來源 port 1:1023 的主動(dòng)聯(lián)機(jī)到本機(jī)端的 1:1023 聯(lián)機(jī)丟棄[root@www ~]# iptables -A INPUT -i eth0 -p tcp --sport 1:1023 /> --dport 1:1023 --syn -j DROP一般來說,client 端啟用的 port 都是大于 1024 以上的端口,而 server 端則是啟用小于 1023 以下的端口在監(jiān)聽的。所以我們可以讓來自遠(yuǎn)程的小于 1023 以下的端口數(shù)據(jù)的主動(dòng)聯(lián)機(jī)都給他丟棄! 但不適用在 FTP 的主動(dòng)聯(lián)機(jī)中! iptables 外掛模塊:mac 與 state在 kernel 2.2 以前使用 ipchains 管理防火墻時(shí),通常會(huì)讓系統(tǒng)管理員相當(dāng)頭痛!因?yàn)?ipchains 沒有所謂的封包狀態(tài)模塊,因此我們必須要針對(duì)封包的進(jìn)、出方向進(jìn)行管控。舉例來說,如果你想要聯(lián)機(jī)到遠(yuǎn)程主機(jī)的 port 22 時(shí),你必須要針對(duì)兩條規(guī)則來設(shè)定:
- 本機(jī)端的 1024:65535 到遠(yuǎn)程的 port 22 必須要放行 (OUTPUT 鏈);
- 遠(yuǎn)程主機(jī) port 22 到本機(jī)的 1024:65535 必須放行 (INPUT 鏈);
這會(huì)很麻煩!因?yàn)槿绻阋?lián)機(jī)到 10 部主機(jī)的 port 22 時(shí),假設(shè) OUTPUT 為預(yù)設(shè)開啟 (ACCEPT), 你依舊需要填寫十行規(guī)則,讓那十部遠(yuǎn)程主機(jī)的 port 22 可以聯(lián)機(jī)到你的本地端主機(jī)上。 那如果開啟全部的 port 22 呢?又擔(dān)心某些惡意主機(jī)會(huì)主動(dòng)以 port 22 聯(lián)機(jī)到你的機(jī)器上! 同樣的道理,如果你要讓本地端主機(jī)可以連到外部的 port 80 (WWW 服務(wù)),那就更不得了~ 這就是網(wǎng)絡(luò)聯(lián)機(jī)是雙向的一個(gè)很重要的概念!
好在我們的 iptables 免除了這個(gè)困擾!他可以透過一個(gè)狀態(tài)模塊來分析 『這個(gè)想要進(jìn)入的封包是否為剛剛我發(fā)出去的響應(yīng)?』 如果是剛剛我發(fā)出去的響應(yīng),那么就可以予以接受放行!哇!真棒!這樣就不用管遠(yuǎn)程主機(jī)是否聯(lián)機(jī)進(jìn)來的問題了! 那如何達(dá)到呢?看看底下的語(yǔ)法:
[root@www ~]# iptables -A INPUT [-m state] [--state 狀態(tài)]選項(xiàng)與參數(shù):-m :一些 iptables 的外掛模塊,主要常見的有: state :狀態(tài)模塊 mac :網(wǎng)絡(luò)卡硬件地址 (hardware address)--state :一些封包的狀態(tài),主要有: INVALID :無效的封包,例如數(shù)據(jù)破損的封包狀態(tài) ESTABLISHED:已經(jīng)聯(lián)機(jī)成功的聯(lián)機(jī)狀態(tài); NEW :想要新建立聯(lián)機(jī)的封包狀態(tài); RELATED :這個(gè)最常用!表示這個(gè)封包是與我們主機(jī)發(fā)送出去的封包有關(guān)范例:只要已建立或相關(guān)封包就予以通過,只要是不合法封包就丟棄[root@www ~]# iptables -A INPUT -m state /> --state RELATED,ESTABLISHED -j ACCEPT[root@www ~]# iptables -A INPUT -m state --state INVALID -j DROP如此一來,我們的 iptables 就會(huì)主動(dòng)分析出該封包是否為響應(yīng)狀態(tài),若是的話,就直接予以接受。呵呵! 這樣一來你就不需要針對(duì)響應(yīng)的封包來撰寫個(gè)別的防火墻規(guī)則了!這真是太棒了!底下我們繼續(xù)談一下 iptables 的另一個(gè)外掛, 那就是針對(duì)網(wǎng)卡來進(jìn)行放行與防御:范例:針對(duì)局域網(wǎng)絡(luò)內(nèi)的 aa:bb:cc:dd:ee:ff 主機(jī)開放其聯(lián)機(jī)[root@www ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff /> -j ACCEPT選項(xiàng)與參數(shù):--mac-source :就是來源主機(jī)的 MAC 啦!如果你的區(qū)網(wǎng)當(dāng)中有某些網(wǎng)絡(luò)高手,老是可以透過修改 IP 去嘗試透過路由器往外跑,那你該怎么辦? 難道將整個(gè)區(qū)網(wǎng)拒絕?并不需要的,你可以透過之前談到的 ARP 相關(guān)概念,去捉到那部主機(jī)的 MAC ,然后透過上頭的這個(gè)機(jī)制, 將該主機(jī)整個(gè) DROP 掉即可。不管他改了什么 IP ,除非他知道你是用網(wǎng)卡的 MAC 來管理,否則他就是出不去啦!了解乎? ICMP 封包規(guī)則的比對(duì):針對(duì)是否響應(yīng) ping 來設(shè)計(jì)如果不是做為路由器的主機(jī)時(shí),通常我們會(huì)把 ICMP type 8 (echo request) 拿掉而已,讓遠(yuǎn)程主機(jī)不知道我們是否存在,也不會(huì)接受 ping 的響應(yīng)就是了。ICMP 封包格式的處理是這樣的:
[root@www ~]# iptables -A INPUT [-p icmp] [--icmp-type 類型] -j ACCEPT選項(xiàng)與參數(shù):--icmp-type :后面必須要接 ICMP 的封包類型,也可以使用代號(hào), 例如 8 代表 echo request 的意思。范例:讓 0,3,4,11,12,14,16,18 的 ICMP type 可以進(jìn)入本機(jī):[root@www ~]# vi somefile#!/bin/bashicmp_type="0 3 4 11 12 14 16 18"for typeicmp in $icmp_typedo iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPTdone[root@www ~]# sh somefile這樣就能夠開放部分的 ICMP 封包格式進(jìn)入本機(jī)進(jìn)行網(wǎng)絡(luò)檢測(cè)的工作了!不過,如果你的主機(jī)是作為區(qū)網(wǎng)的路由器, 那么建議 icmp 封包還是要通通放行才好!這是因?yàn)榭蛻舳藱z測(cè)網(wǎng)絡(luò)時(shí),常常會(huì)使用 ping 來測(cè)試到路由器的線路是否暢通之故呦! 所以不要將路由器的 icmp 關(guān)掉,會(huì)有狀況啦! 超陽(yáng)春客戶端防火墻設(shè)計(jì)與防火墻規(guī)則儲(chǔ)存經(jīng)過上述的本機(jī) iptables 語(yǔ)法分析后,接下來我們來想想,如果站在客戶端且不提供網(wǎng)絡(luò)服務(wù)的 Linux 本機(jī)角色時(shí), 你應(yīng)該要如何設(shè)計(jì)你的防火墻呢?老實(shí)說,你只要分析過 CentOS 默認(rèn)的防火墻規(guī)則就會(huì)知道了,理論上, 應(yīng)該要有的規(guī)則如下:
- 規(guī)則歸零:清除所有已經(jīng)存在的規(guī)則 (iptables -F...)
- 預(yù)設(shè)政策:除了 INPUT 這個(gè)自定義鏈設(shè)為 DROP 外,其他為預(yù)設(shè) ACCEPT;
- 信任本機(jī):由于 lo 對(duì)本機(jī)來說是相當(dāng)重要的,因此 lo 必須設(shè)定為信任裝置;
- 回應(yīng)封包:讓本機(jī)主動(dòng)向外要求而響應(yīng)的封包可以進(jìn)入本機(jī) (ESTABLISHED,RELATED)
- 信任用戶:這是非必要的,如果你想要讓區(qū)網(wǎng)的來源可用你的主機(jī)資源時(shí)
這就是最最陽(yáng)春的防火墻,你可以透過第二步驟抵擋所有遠(yuǎn)程的來源封包,而透過第四步驟讓你要求的遠(yuǎn)程主機(jī)響應(yīng)封包可以進(jìn)入, 加上讓本機(jī)的 lo 這個(gè)內(nèi)部循環(huán)裝置可以放行,嘿嘿!一部 client 專用的防火墻規(guī)則就 OK 了!你可以在某個(gè) script 上面這樣做即可:
[root@www ~]# vim bin/firewall.sh#!/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH# 1. 清除規(guī)則iptables -Fiptables -Xiptables -Z# 2. 設(shè)定政策iptables -P INPUT DROPiptables -P OUTPUT ACCEPTiptables -P FORWARD ACCEPT# 3~5. 制訂各項(xiàng)規(guī)則iptables -A INPUT -i lo -j ACCEPTiptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT#iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT# 6. 寫入防火墻規(guī)則配置文件/etc/init.d/iptables save[root@www ~]# sh bin/firewall.shiptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]其實(shí)防火墻也是一個(gè)服務(wù),你可以透過『chkconfig --list iptables』去察看就知道了。 因此,你這次修改的各種設(shè)定想要在下次開機(jī)還保存,那就得要進(jìn)行『 /etc/init.d/iptables save 』這個(gè)指令加參數(shù)。 因此,鳥哥現(xiàn)在都是將儲(chǔ)存的動(dòng)作寫入這個(gè) firewall.sh 腳本中,比較單純些啰!現(xiàn)在,你的 Linux 主機(jī)已經(jīng)有相當(dāng)?shù)谋Wo(hù)了, 只是如果想要作為服務(wù)器,或者是作為路由器,那就得要自行加上某些自定義的規(guī)則啰。老實(shí)說,如果你對(duì) Linux 夠熟悉的話,直接去修改 /etc/sysconfig/iptables 然后將 iptables 這個(gè)服務(wù) restart, 那你的防火墻規(guī)則就是會(huì)在開機(jī)后持續(xù)存在啰!
制訂好規(guī)則后當(dāng)然就是要測(cè)試啰!那么如何測(cè)試呢?
- 先由主機(jī)向外面主動(dòng)聯(lián)機(jī)試看看;
- 再由私有網(wǎng)域內(nèi)的 PC 向外面主動(dòng)聯(lián)機(jī)試看看;
- 最后,由 Internet 上面的主機(jī),主動(dòng)聯(lián)機(jī)到你的 Linux 主機(jī)試看看;
一步一步作下來,看看問題出在哪里,然后多多的去改進(jìn)、改良!基本上,網(wǎng)絡(luò)上目前很多的資料可以提供你不錯(cuò)的參考了! 這一篇的設(shè)定寫的是很簡(jiǎn)單,大部分都還在介紹階段而已!希望對(duì)大家有幫助!
新聞熱點(diǎn)
疑難解答
圖片精選