小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

鳥(niǎo)哥的 Linux 私房菜

 dwlinux_gs 2015-01-22
          
最近更新日期2011/07/22
9.3 Linux 的封包過(guò)濾軟件 iptables
  9.3.1 不同 Linux 核心版本的防火墻軟件
  9.3.2 封包進(jìn)入流程規(guī)則順序的重要性!
  9.3.3 iptables 的表格 (table) 與鏈 (chain)
  9.3.4 本機(jī)的 iptables 語(yǔ)法
  9.3.4-1 規(guī)則的觀察與清除
  9.3.4-2 定義預(yù)設(shè)政策 (policy)
  9.3.4-3 封包的基礎(chǔ)比對(duì)IP, 網(wǎng)域及接口裝置 信任裝置, 信任網(wǎng)域
  9.3.4-4 TCP, UDP 的規(guī)則比對(duì)針對(duì)埠口設(shè)定
  9.3.4-5 iptables 外掛模塊mac 與 state
  9.3.4-6 ICMP 封包規(guī)則的比對(duì)針對(duì)是否響應(yīng) ping 來(lái)設(shè)計(jì)
  9.3.4-7 超陽(yáng)春客戶端防火墻設(shè)計(jì)與防火墻規(guī)則儲(chǔ)存
  9.3.5 IPv4 的核心管理功能/proc/sys/net/ipv4/*

大標(biāo)題的圖示9.3 Linux 的封包過(guò)濾軟件iptables

上面談了這么多,主要還是希望你能了解到防火墻是什么這個(gè)議題!而且也希望你知道防火墻并非萬(wàn)能的。 好了,那么底下我們終于可以來(lái)瞧一瞧,那目前我們的 2.6 版這個(gè) Linux 核心到底使用什么核心功能來(lái)進(jìn)行防火墻設(shè)定?



小標(biāo)題的圖示9.3.1 不同 Linux 核心版本的防火墻軟件

Linux 的防火墻為什么功能這么好?這是因?yàn)樗旧砭褪怯?Linux 核心所提供,由于直接經(jīng)過(guò)核心來(lái)處理,因此效能非常好! 不過(guò),不同核心版本所使用的防火墻軟件是不一樣的!因?yàn)楹诵闹С值姆阑饓κ侵饾u演進(jìn)而來(lái)的嘛!

  • Version 2.0使用 ipfwadm 這個(gè)防火墻機(jī)制;
  • Version 2.2使用的是 ipchains 這個(gè)防火墻機(jī)制;
  • Version 2.4 與 2.6 主要是使用 iptables 這個(gè)防火墻機(jī)制,不過(guò)在某些早期的 Version 2.4 版本的 distributions 當(dāng)中,亦同時(shí)支持 ipchains (編譯成為模塊),好讓用戶仍然可以使用來(lái)自 2.2 版的 ipchains 的防火墻規(guī)劃。不過(guò),不建議在 2.4 以上的核心版本使用 ipchains 喔!

因?yàn)椴煌暮诵氖褂玫姆阑饓C(jī)制不同,且支持的軟件指令與語(yǔ)法也不相同,所以在 Linux 上頭設(shè)定屬于你自己的防火墻規(guī)則時(shí),要注意啊,先用 uname -r 追蹤一下你的核心版本再說(shuō)!如果你是安裝 2004 年以后推出的 distributions ,那就不需要擔(dān)心了,因?yàn)檫@些 distributions 幾乎都使用 kernel 2.6 版的核心??! ^_^


小標(biāo)題的圖示9.3.2 封包進(jìn)入流程規(guī)則順序的重要性!

前面的幾個(gè)小節(jié)里面我們一直談到『防火墻規(guī)則』,咦!啥是規(guī)則???因?yàn)?iptables 是利用封包過(guò)濾的機(jī)制, 所以他會(huì)分析封包的表頭數(shù)據(jù)。根據(jù)表頭數(shù)據(jù)與定義的『規(guī)則』來(lái)決定該封包是否可以進(jìn)入主機(jī)或者是被丟棄。 意思就是說(shuō)『根據(jù)封包的分析資料 "比對(duì)" 你預(yù)先定義的規(guī)則內(nèi)容, 若封包數(shù)據(jù)與規(guī)則內(nèi)容相同則進(jìn)行動(dòng)作,否則就繼續(xù)下一條規(guī)則的比對(duì)!』 重點(diǎn)在那個(gè)『比對(duì)與分析順序』上。

舉個(gè)簡(jiǎn)單的例子,假設(shè)我預(yù)先定義 10 條防火墻規(guī)則好了,那么當(dāng) Internet 來(lái)了一個(gè)封包想要進(jìn)入我的主機(jī), 那么防火墻是如何分析這個(gè)封包的呢?我們以底下的圖示來(lái)說(shuō)明好了

封包過(guò)濾的規(guī)則動(dòng)作及分析流程
圖 9.3-1、封包過(guò)濾的規(guī)則動(dòng)作及分析流程

當(dāng)一個(gè)網(wǎng)絡(luò)封包要進(jìn)入到主機(jī)之前,會(huì)先經(jīng)由 NetFilter 進(jìn)行檢查,那就是 iptables 的規(guī)則了。 檢查通過(guò)則接受 (ACCEPT) 進(jìn)入本機(jī)取得資源,如果檢查不通過(guò),則可能予以丟棄 (DROP) ! 上圖中主要的目的在告知你『規(guī)則是有順序的』!例如當(dāng)網(wǎng)絡(luò)封包進(jìn)入 Rule 1 的比對(duì)時(shí), 如果比對(duì)結(jié)果符合 Rule 1 ,此時(shí)這個(gè)網(wǎng)絡(luò)封包就會(huì)進(jìn)行 Action 1 的動(dòng)作,而不會(huì)理會(huì)后續(xù)的 Rule 2, Rule 3.... 等規(guī)則的分析了。

而如果這個(gè)封包并不符合 Rule 1 的比對(duì),那就會(huì)進(jìn)入 Rule 2 的比對(duì)了!如此一個(gè)一個(gè)規(guī)則去進(jìn)行比對(duì)就是了。 那如果所有的規(guī)則都不符合怎辦?此時(shí)就會(huì)透過(guò)預(yù)設(shè)動(dòng)作 (封包政策, Policy) 來(lái)決定這個(gè)封包的去向。 所以啦,當(dāng)你的規(guī)則順序排列錯(cuò)誤時(shí),就會(huì)產(chǎn)生很嚴(yán)重的錯(cuò)誤了。 怎么說(shuō)呢?讓我們看看底下這個(gè)例子

假設(shè)你的 Linux 主機(jī)提供了 WWW 的服務(wù),那么自然就要針對(duì) port 80 來(lái)啟用通過(guò)的封包規(guī)則,但是你發(fā)現(xiàn) IP 來(lái)源為 192.168.100.100 老是惡意的嘗試入侵你的系統(tǒng),所以你想要將該 IP 拒絕往來(lái),最后,所有的非 WWW 的封包都給他丟棄,就這三個(gè)規(guī)則來(lái)說(shuō),你要如何設(shè)定防火墻檢驗(yàn)順序呢?

  1. Rule 1 先抵擋 192.168.100.100 ;
  2. Rule 2 再讓要求 WWW 服務(wù)的封包通過(guò);
  3. Rule 3 將所有的封包丟棄。

這樣的排列順序就能符合你的需求,不過(guò),萬(wàn)一你的順序排錯(cuò)了,變成

  1. Rule 1 先讓要求 WWW 服務(wù)的封包通過(guò);
  2. Rule 2 再抵擋 192.168.100.100 ;
  3. Rule 3 將所有的封包丟棄。

此時(shí),那個(gè) 192.168.100.100 『可以使用你的 WWW 服務(wù)』喔!只要他對(duì)你的主機(jī)送出 WWW 要求封包,就可以使用你的 WWW 功能了,因?yàn)槟愕囊?guī)則順序定義第一條就會(huì)讓他通過(guò),而不去考慮第二條規(guī)則!這樣可以理解規(guī)則順序的意義了嗎! 現(xiàn)在再來(lái)想一想,如果 Rule 1 變成了『將所有的封包丟棄』,Rule 2 才設(shè)定『WWW 服務(wù)封包通過(guò)』,請(qǐng)問(wèn),我的 client 可以使用我的 WWW 服務(wù)嗎?呵呵!答案是『否~』想通了嗎? ^_^


小標(biāo)題的圖示9.3.3 iptables 的表格 (table) 與鏈 (chain)

事實(shí)上,那個(gè)圖 9.3-1 所列出的規(guī)則僅是 iptables 眾多表格當(dāng)中的一個(gè)鏈 (chain) 而已。 什么是鏈呢?這得由 iptables 的名稱說(shuō)起。為什么稱為 ip"tables" 呢? 因?yàn)檫@個(gè)防火墻軟件里面有多個(gè)表格 (table) ,每個(gè)表格都定義出自己的默認(rèn)政策與規(guī)則, 且每個(gè)表格的用途都不相同。我們可以使用底下這張圖來(lái)稍微了解一下

iptables 的表格與相關(guān)鏈?zhǔn)疽鈭D
圖 9.3-2、iptables 的表格與相關(guān)鏈?zhǔn)疽鈭D

剛剛圖 9.3-1 的規(guī)則內(nèi)容僅只是圖 9.3-2 內(nèi)的某個(gè) chain 而已! 而預(yù)設(shè)的情況下,咱們 Linux 的 iptables 至少就有三個(gè)表格,包括管理本機(jī)進(jìn)出的 filter 、管理后端主機(jī) (防火墻內(nèi)部的其他計(jì)算機(jī)) 的 nat 、管理特殊旗標(biāo)使用的 mangle (較少使用) 。更有甚者,我們還可以自定義額外的鏈呢! 真是很神奇吧!每個(gè)表格與其中鏈的用途分別是這樣的

  • filter (過(guò)濾器)主要跟進(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ī)比較沒(méi)有關(guān)系, 他可以『轉(zhuǎn)遞封包』到后端的計(jì)算機(jī)中,與下列 nat table 相關(guān)性較高。

  • nat (地址轉(zhuǎn)換)是 Network Address Translation 的縮寫(xiě), 這個(gè)表格主要在進(jìn)行來(lái)源與目的之 IP 或 port 的轉(zhuǎn)換,與 Linux 本機(jī)較無(wú)關(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 鏈,不過(guò)從 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 鏈。 由于這個(gè)表格與特殊旗標(biāo)相關(guān)性較高,所以像咱們這種單純的環(huán)境當(dāng)中,較少使用 mangle 這個(gè)表格。

所以說(shuō),如果你的 Linux 是作為 www 服務(wù),那么要開(kāi)放客戶端對(duì)你的 www 要求有響應(yīng),就得要處理 filter 的 INPUT 鏈; 而如果你的 Linux 是作為局域網(wǎng)絡(luò)的路由器,那么就得要分析 nat 的各個(gè)鏈以及 filter 的 FORWARD 鏈才行。也就是說(shuō), 其實(shí)各個(gè)表格的鏈結(jié)之間是有關(guān)系的!簡(jiǎn)單的關(guān)系可以由下圖這么看

iptables 內(nèi)建各表格與鏈的相關(guān)性
圖 9.3-3、iptables 內(nèi)建各表格與鏈的相關(guān)性

上面的圖示很復(fù)雜喔!不過(guò)基本上你依舊可以看出來(lái),我們的 iptables 可以控制三種封包的流向

  • 封包進(jìn)入 Linux 主機(jī)使用資源 (路徑 A) 在路由判斷后確定是向 Linux 主機(jī)要求數(shù)據(jù)的封包,主要就會(huì)透過(guò) filter 的 INPUT 鏈來(lái)進(jìn)行控管;

  • 封包經(jīng)由 Linux 主機(jī)的轉(zhuǎn)遞,沒(méi)有使用主機(jī)資源,而是向后端主機(jī)流動(dòng) (路徑 B) 在路由判斷之前進(jìn)行封包表頭的修訂作業(yè)后,發(fā)現(xiàn)到封包主要是要透過(guò)防火墻而去后端,此時(shí)封包就會(huì)透過(guò)路徑 B 來(lái)跑動(dòng)。 也就是說(shuō),該封包的目標(biāo)并非我們的 Linux 本機(jī)。主要經(jīng)過(guò)的鏈?zhǔn)?filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。 這路徑 B 的封包流向使用情況,我們會(huì)在本章的 9.5 小節(jié)來(lái)跟大家作個(gè)簡(jiǎn)單的介紹。

  • 封包由 Linux 本機(jī)發(fā)送出去 (路徑 C) 例如響應(yīng)客戶端的要求,或者是 Linux 本機(jī)主動(dòng)送出的封包,都是透過(guò)路徑 C 來(lái)跑的。先是透過(guò)路由判斷, 決定了輸出的路徑后,再透過(guò) filter 的 OUTPUT 鏈來(lái)傳送的!當(dāng)然,最終還是會(huì)經(jīng)過(guò) nat 的 POSTROUTING 鏈。
Tips:
有沒(méi)有發(fā)現(xiàn)有兩個(gè)『路由判斷』呢?因?yàn)榫W(wǎng)絡(luò)是雙向的,所以進(jìn)與出要分開(kāi)來(lái)看!因此,進(jìn)入的封包需要路由判斷, 送出的封包當(dāng)然也要進(jìn)行路由判斷才能夠發(fā)送出去??!了解乎?
鳥(niǎo)哥的圖示

由于 mangle 這個(gè)表格很少被使用,如果將圖 9.3-3 的 mangle 拿掉的話,那就容易看的多了

iptables 內(nèi)建各表格與鏈的相關(guān)性(簡(jiǎn)圖)
圖 9.3-4、iptables 內(nèi)建各表格與鏈的相關(guān)性(簡(jiǎn)圖)

透過(guò)圖 9.3-4 你就可以更輕松的了解到,事實(shí)上與本機(jī)最有關(guān)的其實(shí)是 filter 這個(gè)表格內(nèi)的 INPUT 與 OUTPUT 這兩條鏈,如果你的 iptables 只是用來(lái)保護(hù) Linux 主機(jī)本身的話,那 nat 的規(guī)則根本就不需要理他,直接設(shè)定為開(kāi)放即可。

不過(guò),如果你的防火墻事實(shí)上是用來(lái)管制 LAN 內(nèi)的其他主機(jī)的話,那么你就必須要再針對(duì) filter 的 FORWARD 這條鏈,還有 nat 的 PREROUTING, POSTROUTING 以及 OUTPUT 進(jìn)行額外的規(guī)則訂定才行。 nat 表格的使用需要很清晰的路由概念才能夠設(shè)定的好,建議新手先不要碰!最多就是先玩一玩最陽(yáng)春的 nat 功能『IP 分享器的功能』就好了! ^_^!這部份我們?cè)诒菊碌淖詈笠恍」?jié)會(huì)介紹的啦!


小標(biāo)題的圖示9.3.4 本機(jī)的 iptables 語(yǔ)法

理論上,當(dāng)你安裝好 Linux 之后,系統(tǒng)應(yīng)該會(huì)主動(dòng)的幫你啟動(dòng)一個(gè)陽(yáng)春的防火墻規(guī)則才是, 不過(guò)這個(gè)陽(yáng)春防火墻可能不是我們想要的模式,因此我們需要額外進(jìn)行一些修訂的行為。不過(guò),在開(kāi)始進(jìn)行底下的練習(xí)之前, 鳥(niǎo)哥這里有個(gè)很重要的事情要告知一下。因?yàn)?iptables 的指令會(huì)將網(wǎng)絡(luò)封包進(jìn)行過(guò)濾及抵擋的動(dòng)作,所以, 請(qǐng)不要在遠(yuǎn)程主機(jī)上進(jìn)行防火墻的練習(xí),因?yàn)槟愫苡锌赡芤徊恍⌒膶⒆约宏P(guān)在家門外! 盡量在本機(jī)前面登入 tty1-tty6 終端機(jī)進(jìn)行練習(xí),否則常常會(huì)發(fā)生悲劇?。▲B(niǎo)哥以前剛剛在玩 iptables 時(shí),就常常因?yàn)椴恍⌒囊?guī)則設(shè)定錯(cuò)誤,導(dǎo)致常常要請(qǐng)遠(yuǎn)程的朋友幫忙重新啟動(dòng)...

剛剛提到咱們的 iptables 至少有三個(gè)預(yù)設(shè)的 table (filter, nat, mangle),較常用的是本機(jī)的 filter 表格, 這也是默認(rèn)表格啦。另一個(gè)則是后端主機(jī)的 nat 表格,至于 mangle 較少使用,所以這個(gè)章節(jié)我們并不會(huì)討論 mangle。 由于不同的 table 他們的鏈不一樣,導(dǎo)致使用的指令語(yǔ)法或多或少都有點(diǎn)差異。 在這個(gè)小節(jié)當(dāng)中,我們主要將針對(duì) filter 這個(gè)默認(rèn)表格的三條鏈來(lái)做介紹。底下就來(lái)玩一玩吧!

Tips:
防火墻的設(shè)定主要使用的就是 iptables 這個(gè)指令而已。而防火墻是系統(tǒng)管理員的主要任務(wù)之一, 且對(duì)于系統(tǒng)的影響相當(dāng)?shù)拇?,因此『只能?root 使用 iptables 』,不論是設(shè)定還是觀察防火墻規(guī)則喔!
鳥(niǎo)哥的圖示

小標(biāo)題的圖示9.3.4-1 規(guī)則的觀察與清除

如果你在安裝的時(shí)候選擇沒(méi)有防火墻的話,那么 iptables 在一開(kāi)始的時(shí)候應(yīng)該是沒(méi)有規(guī)則的,不過(guò), 可能因?yàn)槟阍诎惭b的時(shí)候就有選擇系統(tǒng)自動(dòng)幫你建立防火墻機(jī)制,那系統(tǒng)就會(huì)有默認(rèn)的防火墻規(guī)則了! 無(wú)論如何,我們先來(lái)看看目前本機(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ò)該規(guī)則的封包總位數(shù)、相關(guān)的網(wǎng)絡(luò)接口等

范例列出 filter table 三條鏈的規(guī)則
[root@www ~]# iptables -L -n
Chain INPUT (policy ACCEPT)   <==針對(duì) INPUT 鏈,且預(yù)設(shè)政策為可接受
target  prot opt source     destination <==說(shuō)明欄
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-prohibited

Chain FORWARD (policy ACCEPT)  <==針對(duì) FORWARD 鏈,且預(yù)設(shè)政策為可接受
target  prot opt source     destination
REJECT  all  --  0.0.0.0/0  0.0.0.0/0   reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)  <==針對(duì) OUTPUT 鏈,且預(yù)設(shè)政策為可接受
target  prot opt source     destination

范例列出 nat table 三條鏈的規(guī)則
[root@www ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain 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)說(shuō)明
  • source 代表此規(guī)則是針對(duì)哪個(gè)『來(lái)源 IP』進(jìn)行限制?
  • destination 代表此規(guī)則是針對(duì)哪個(gè)『目標(biāo) IP』進(jìn)行限制?

在輸出結(jié)果中,第一個(gè)范例因?yàn)闆](méi)有加上 -t 的選項(xiàng),所以默認(rèn)就是 filter 這個(gè)表格內(nèi)的 INPUT, OUTPUT, FORWARD 三條鏈的規(guī)則啰。若針對(duì)單機(jī)來(lái)說(shuō),INPUT 與 FORWARD 算是比較重要的管制防火墻鏈, 所以你可以發(fā)現(xiàn)最后一條規(guī)則的政策是 REJECT (拒絕) 喔!雖然 INPUT 與 FORWARD 的政策是放行 (ACCEPT), 不過(guò)在最后一條規(guī)則就已經(jīng)將全部的封包都拒絕了!

不過(guò)這個(gè)指令的觀察只是作個(gè)格式化的查閱,要詳細(xì)解釋每個(gè)規(guī)則會(huì)比較不容易解析。舉例來(lái)說(shuō), 我們將 INPUT 的 5 條規(guī)則依據(jù)輸出結(jié)果來(lái)說(shuō)明一下,結(jié)果會(huì)變成

  1. 只要是封包狀態(tài)為 RELATED,ESTABLISHED 就予以接受
  2. 只要封包協(xié)議是 icmp 類型的,就予以放行
  3. 無(wú)論任何來(lái)源 (0.0.0.0/0) 且要去任何目標(biāo)的封包,不論任何封包格式 (prot 為 all),通通都接受
  4. 只要是傳給 port 22 的主動(dòng)式聯(lián)機(jī) tcp 封包就接受
  5. 全部的封包信息通通拒絕

最有趣的應(yīng)該是第 3 條規(guī)則了,怎么會(huì)所有的封包信息都予以接受?如果都接受的話,那么后續(xù)的規(guī)則根本就不會(huì)有用嘛! 其實(shí)那條規(guī)則是僅針對(duì)每部主機(jī)都有的內(nèi)部循環(huán)測(cè)試網(wǎng)絡(luò) (lo) 接口啦!如果沒(méi)有列出接口,那么我們就很容易搞錯(cuò)啰~ 所以,近來(lái)鳥(niǎo)哥都建議使用 iptables-save 這個(gè)指令來(lái)觀察防火墻規(guī)則啦!因?yàn)?iptables-save 會(huì)列出完整的防火墻規(guī)則,只是并沒(méi)有規(guī)格化輸出而已。

[root@www ~]# iptables-save [-t table]
選項(xiàng)與參數(shù)
-t 可以僅針對(duì)某些表格來(lái)輸出,例如僅針對(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)開(kāi)頭的指的是表格,這里為 filter
:INPUT ACCEPT [0:0]          <==冒號(hào)開(kāi)頭的指的是鏈,三條內(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)部接口開(kā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

由上面的輸出來(lái)看,有底線且內(nèi)容含有 lo 的那條規(guī)則當(dāng)中,『 -i lo 』指的就是由 lo 適配卡進(jìn)來(lái)的封包! 這樣看就清楚多了!因?yàn)橛袑?xiě)到接口的關(guān)系??!不像之前的 iptables -L -n 嘛!這樣了解乎! 不過(guò),既然這個(gè)規(guī)則不是我們想要的,那該如何修改規(guī)則呢?鳥(niǎo)哥建議,先刪除規(guī)則再慢慢建立各個(gè)需要的規(guī)則! 那如何清除規(guī)則?這樣做就對(duì)了

[root@www ~]# iptables [-t tables] [-FXZ]
選項(xiàng)與參數(shù)
-F 清除所有的已訂定的規(guī)則;
-X 殺掉所有使用者 "自定義" 的 chain (應(yīng)該說(shuō)的是 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í))!要小心??!

一般來(lái)說(shuō),我們?cè)谥匦露x防火墻的時(shí)候,都會(huì)先將規(guī)則給他清除掉。還記得我們前面談到的, 防火墻的『規(guī)則順序』是有特殊意義的,所以啰, 當(dāng)然先清除掉規(guī)則,然后一條一條來(lái)設(shè)定會(huì)比較容易一點(diǎn)啦。底下就來(lái)談?wù)劧x預(yù)設(shè)政策吧!


小標(biāo)題的圖示9.3.4-2 定義預(yù)設(shè)政策 (policy)

清除規(guī)則之后,再接下來(lái)就是要設(shè)定規(guī)則的政策啦!還記得政策指的是什么嗎?『 當(dāng)你的封包不在你設(shè)定的規(guī)則之內(nèi)時(shí),則該封包的通過(guò)與否,是以 Policy 的設(shè)定為準(zhǔn)』,在本機(jī)方面的預(yù)設(shè)政策中,假設(shè)你對(duì)于內(nèi)部的使用者有信心的話, 那么 filter 內(nèi)的 INPUT 鏈方面可以定義的比較嚴(yán)格一點(diǎn),而 FORWARD 與 OUTPUT 則可以訂定的松一些!通常鳥(niǎo)哥都是將 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 為大寫(xiě)??!
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é)果顯示
# 所有的封包都無(wú)法進(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è)定完畢后,來(lái)談一談關(guān)于各規(guī)則的封包基礎(chǔ)比對(duì)設(shè)定吧。


小標(biāo)題的圖示9.3.4-3 封包的基礎(chǔ)比對(duì)IP, 網(wǎng)域及接口裝置

開(kāi)始來(lái)進(jìn)行防火墻規(guī)則的封包比對(duì)設(shè)定吧!既然是因特網(wǎng),那么我們就由最基礎(chǔ)的 IP, 網(wǎng)域及埠口,亦即是 OSI 的第三層談起,再來(lái)談?wù)勓b置 (網(wǎng)絡(luò)卡) 的限制等等。這一小節(jié)與下一小節(jié)的語(yǔ)法你一定要記住,因?yàn)檫@是最基礎(chǔ)的比對(duì)語(yǔ)法喔!

[root@www ~]# iptables [-AI 鏈名] [-io 網(wǎng)絡(luò)接口] [-p 協(xié)議] > [-s 來(lái)源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ī)則。如果沒(méi)有指定此規(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 來(lái)源 IP/網(wǎng)域設(shè)定此規(guī)則之封包的來(lái)源項(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 之封包來(lái)源;

-d 目標(biāo) IP/網(wǎng)域同 -s ,只不過(guò)這里指的是目標(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ì)談到。 好,先讓我們來(lái)看看最基礎(chǔ)的幾個(gè)規(guī)則,例如開(kāi)放 lo 這個(gè)本機(jī)的接口以及某個(gè) IP 來(lái)源吧!

范例設(shè)定 lo 成為受信任的裝置,亦即進(jìn)出 lo 的封包都予以接受
[root@www ~]# iptables -A INPUT -i lo -j ACCEPT

仔細(xì)看上面并沒(méi)有列出 -s, -d 等等的規(guī)則,這表示不論封包來(lái)自何處或去到哪里,只要是來(lái)自 lo 這個(gè)界面,就予以接受!這個(gè)觀念挺重要的,就是『沒(méi)有指定的項(xiàng)目,則表示該項(xiàng)目完全接受』的意思! 例如這個(gè)案例當(dāng)中,關(guān)于 -s, -d...等等的參數(shù)沒(méi)有規(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』 來(lái)將該裝置設(shè)定為信任裝置。不過(guò),下達(dá)這個(gè)指令前要特別注意,因?yàn)檫@樣等于該網(wǎng)卡沒(méi)有任何防備了喔!

范例只要是來(lái)自內(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)域』啰。

范例只要是來(lái)自 192.168.100.10 就接受,但 192.168.100.230 這個(gè)惡意來(lái)源就丟棄
[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 來(lái)源,可視為信任主機(jī)或者是不信任的惡意來(lái)源喔!

[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 DROP
COMMIT
# Completed on Fri Jul 22 16:00:43 2011

這就是最單純簡(jiǎn)單的防火墻規(guī)則的設(shè)定與觀察方式。不過(guò),在上面的案例中,其實(shí)你也發(fā)現(xiàn)到有兩條規(guī)則可能有問(wèn)題~ 那就是上面的特殊字體圈起來(lái)的規(guī)則順序。明明已經(jīng)放行了 192.168.100.0/24 了,所以那個(gè) 192.168.100.230 的規(guī)則就不可能會(huì)被用到!這就是有問(wèn)題的防火墻設(shè)定??!了解乎?那該怎辦?就重打?。_@! 那如果你想要記錄某個(gè)規(guī)則的紀(jì)錄怎么辦?可以這樣做

[root@www ~]# iptables -A INPUT -s 192.168.2.200 -j LOG
[root@www ~]# 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é)果的最左邊,會(huì)出現(xiàn)的是 LOG 喔!只要有封包來(lái)自 192.168.2.200 這個(gè) IP 時(shí), 那么該封包的相關(guān)信息就會(huì)被寫(xiě)入到核心訊息,亦即是 /var/log/messages 這個(gè)檔案當(dāng)中。 然后該封包會(huì)繼續(xù)進(jìn)行后續(xù)的規(guī)則比對(duì)。所以說(shuō), LOG 這個(gè)動(dòng)作僅在進(jìn)行記錄而已,并不會(huì)影響到這個(gè)封包的其他規(guī)則比對(duì)的。 好了,接下來(lái)我們分別來(lái)看看 TCP,UDP 以及 ICMP 封包的其他規(guī)則比對(duì)吧!


小標(biāo)題的圖示9.3.4-4 TCP, UDP 的規(guī)則比對(duì)針對(duì)埠口設(shè)定

我們?cè)?a href="http://linux./linux_server/0110network_basic.php">第二章網(wǎng)絡(luò)基礎(chǔ)談過(guò)各種不同的封包格式, 在談到 TCP 與 UDP 時(shí),比較特殊的就是那個(gè)埠口 (port),在 TCP 方面則另外有所謂的聯(lián)機(jī)封包狀態(tài), 包括最常見(jiàn)的 SYN 主動(dòng)聯(lián)機(jī)的封包格式。那么如何針對(duì)這兩種封包格式進(jìn)行防火墻規(guī)則的設(shè)定呢?你可以這樣看

[root@www ~]# iptables [-AI 鏈] [-io 網(wǎng)絡(luò)接口] [-p tcp,udp] > [-s 來(lái)源IP/網(wǎng)域] [--sport 埠口范圍] > [-d 目標(biāo)IP/網(wǎng)域] [--dport 埠口范圍] -j [ACCEPT|DROP|REJECT]
選項(xiàng)與參數(shù)
--sport 埠口范圍限制來(lái)源的端口號(hào)碼,端口號(hào)碼可以是連續(xù)的,例如 1024:65535
--dport 埠口范圍限制目標(biāo)的端口號(hào)碼。

事實(shí)上就是多了那個(gè) --sport 及 --dport 這兩個(gè)玩意兒,重點(diǎn)在那個(gè) port 上面啦! 不過(guò)你得要特別注意,因?yàn)閮H有 tcp 與 udp 封包具有埠口,因此你想要使用 --dport, --sport 時(shí),得要加上 -p tcp 或 -p udp 的參數(shù)才會(huì)成功喔!底下讓我們來(lái)進(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)碼來(lái)進(jìn)行某些服務(wù)的開(kāi)放或關(guān)閉喔!你還可以綜合處理呢!例如只要來(lái)自 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ā)生啥問(wèn)題呢?

[root@www ~]# iptables -A INPUT -i eth0 --dport 21 -j DROP
iptables v1.4.7: unknown option `--dport'
Try `iptables -h' or 'iptables --help' for more information.

你應(yīng)該會(huì)覺(jué)得很奇怪,怎么『 --dport 』會(huì)是未知的參數(shù) (arg) 呢?這是因?yàn)槟銢](méi)有加上 -p tcp 或 -p udp 的緣故??!很重要喔!

除了埠口之外,在 TCP 還有特殊的旗標(biāo)啊!最常見(jiàn)的就是那個(gè)主動(dòng)聯(lián)機(jī)的 SYN 旗標(biāo)了。 我們?cè)?iptables 里面還支持『 --syn 』的處理方式,我們以底下的例子來(lái)說(shuō)明好了

范例將來(lái)自任何地方來(lái)源 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

一般來(lái)說(shuō),client 端啟用的 port 都是大于 1024 以上的埠口,而 server 端則是啟用小于 1023 以下的埠口在監(jiān)聽(tīng)的。所以我們可以讓來(lái)自遠(yuǎn)程的小于 1023 以下的端口數(shù)據(jù)的主動(dòng)聯(lián)機(jī)都給他丟棄! 但不適用在 FTP 的主動(dòng)聯(lián)機(jī)中!這部份我們未來(lái)在二十一章的 FTP 服務(wù)器再來(lái)談吧!


小標(biāo)題的圖示9.3.4-5 iptables 外掛模塊mac 與 state

在 kernel 2.2 以前使用 ipchains 管理防火墻時(shí),通常會(huì)讓系統(tǒng)管理員相當(dāng)頭痛!因?yàn)?ipchains 沒(méi)有所謂的封包狀態(tài)模塊,因此我們必須要針對(duì)封包的進(jìn)、出方向進(jìn)行管控。舉例來(lái)說(shuō),如果你想要聯(lián)機(jī)到遠(yuǎn)程主機(jī)的 port 22 時(shí),你必須要針對(duì)兩條規(guī)則來(lái)設(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è)開(kāi)啟 (ACCEPT), 你依舊需要填寫(xiě)十行規(guī)則,讓那十部遠(yuǎn)程主機(jī)的 port 22 可以聯(lián)機(jī)到你的本地端主機(jī)上。 那如果開(kāi)啟全部的 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è)困擾!他可以透過(guò)一個(gè)狀態(tài)模塊來(lái)分析 『這個(gè)想要進(jìn)入的封包是否為剛剛我發(fā)出去的響應(yīng)?』 如果是剛剛我發(fā)出去的響應(yīng),那么就可以予以接受放行!哇!真棒!這樣就不用管遠(yuǎn)程主機(jī)是否聯(lián)機(jī)進(jìn)來(lái)的問(wèn)題了! 那如何達(dá)到呢?看看底下的語(yǔ)法

[root@www ~]# iptables -A INPUT [-m state] [--state 狀態(tài)]
選項(xiàng)與參數(shù)
-m 一些 iptables 的外掛模塊,主要常見(jiàn)的有
     state 狀態(tài)模塊
     mac   網(wǎng)絡(luò)卡硬件地址 (hardware address)
--state 一些封包的狀態(tài),主要有
     INVALID    無(wú)效的封包,例如數(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)封包就予以通過(guò),只要是不合法封包就丟棄
[root@www ~]# iptables -A INPUT -m state > --state RELATED,ESTABLISHED -j ACCEPT
[root@www ~]# iptables -A INPUT -m state --state INVALID -j DROP

如此一來(lái),我們的 iptables 就會(huì)主動(dòng)分析出該封包是否為響應(yīng)狀態(tài),若是的話,就直接予以接受。呵呵! 這樣一來(lái)你就不需要針對(duì)響應(yīng)的封包來(lái)撰寫(xiě)個(gè)別的防火墻規(guī)則了!這真是太棒了!底下我們繼續(xù)談一下 iptables 的另一個(gè)外掛, 那就是針對(duì)網(wǎng)卡來(lái)進(jìn)行放行與防御

范例針對(duì)局域網(wǎng)絡(luò)內(nèi)的 aa:bb:cc:dd:ee:ff 主機(jī)開(kāi)放其聯(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 就是來(lái)源主機(jī)的 MAC 啦!

如果你的區(qū)網(wǎng)當(dāng)中有某些網(wǎng)絡(luò)高手,老是可以透過(guò)修改 IP 去嘗試透過(guò)路由器往外跑,那你該怎么辦? 難道將整個(gè)區(qū)網(wǎng)拒絕?并不需要的,你可以透過(guò)之前談到的 ARP 相關(guān)概念,去捉到那部主機(jī)的 MAC ,然后透過(guò)上頭的這個(gè)機(jī)制, 將該主機(jī)整個(gè) DROP 掉即可。不管他改了什么 IP ,除非他知道你是用網(wǎng)卡的 MAC 來(lái)管理,否則他就是出不去啦!了解乎?

Tips:
其實(shí) MAC 也是可以偽裝的,可以透過(guò)某些軟件來(lái)修改網(wǎng)卡的 MAC。不過(guò),這里我們是假設(shè) MAC 是無(wú)法修改的情況來(lái)說(shuō)明的。 此外,MAC 是不能跨路由的,因此上述的案例中才特別說(shuō)明是在區(qū)網(wǎng)內(nèi),而不是指 Internet 外部的來(lái)源唷!
鳥(niǎo)哥的圖示

小標(biāo)題的圖示9.3.4-6 ICMP 封包規(guī)則的比對(duì)針對(duì)是否響應(yīng) ping 來(lái)設(shè)計(jì)

第二章 ICMP 協(xié)議當(dāng)中我們知道 ICMP 的類型相當(dāng)?shù)亩?,而且很?ICMP 封包的類型都是為了要用來(lái)進(jìn)行網(wǎng)絡(luò)檢測(cè)用的!所以最好不要將所有的 ICMP 封包都丟棄!如果不是做為路由器的主機(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/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@www ~]# sh  somefile

這樣就能夠開(kāi)放部分的 ICMP 封包格式進(jìn)入本機(jī)進(jìn)行網(wǎng)絡(luò)檢測(cè)的工作了!不過(guò),如果你的主機(jī)是作為區(qū)網(wǎng)的路由器, 那么建議 icmp 封包還是要通通放行才好!這是因?yàn)榭蛻舳藱z測(cè)網(wǎng)絡(luò)時(shí),常常會(huì)使用 ping 來(lái)測(cè)試到路由器的線路是否暢通之故呦! 所以不要將路由器的 icmp 關(guān)掉,會(huì)有狀況啦!


小標(biāo)題的圖示9.3.4-7 超陽(yáng)春客戶端防火墻設(shè)計(jì)與防火墻規(guī)則儲(chǔ)存

經(jīng)過(guò)上述的本機(jī) iptables 語(yǔ)法分析后,接下來(lái)我們來(lái)想想,如果站在客戶端且不提供網(wǎng)絡(luò)服務(wù)的 Linux 本機(jī)角色時(shí), 你應(yīng)該要如何設(shè)計(jì)你的防火墻呢?老實(shí)說(shuō),你只要分析過(guò) CentOS 默認(rèn)的防火墻規(guī)則就會(huì)知道了,理論上, 應(yīng)該要有的規(guī)則如下

  1. 規(guī)則歸零清除所有已經(jīng)存在的規(guī)則 (iptables -F...)
  2. 預(yù)設(shè)政策除了 INPUT 這個(gè)自定義鏈設(shè)為 DROP 外,其他為預(yù)設(shè) ACCEPT;
  3. 信任本機(jī)由于 lo 對(duì)本機(jī)來(lái)說(shuō)是相當(dāng)重要的,因此 lo 必須設(shè)定為信任裝置;
  4. 回應(yīng)封包讓本機(jī)主動(dòng)向外要求而響應(yīng)的封包可以進(jìn)入本機(jī) (ESTABLISHED,RELATED)
  5. 信任用戶這是非必要的,如果你想要讓區(qū)網(wǎng)的來(lái)源可用你的主機(jī)資源時(shí)

這就是最最陽(yáng)春的防火墻,你可以透過(guò)第二步驟抵擋所有遠(yuǎn)程的來(lái)源封包,而透過(guò)第四步驟讓你要求的遠(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/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH

# 1. 清除規(guī)則
iptables -F
iptables -X
iptables -Z

# 2. 設(shè)定政策
iptables -P   INPUT DROP
iptables -P  OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# 3~5. 制訂各項(xiàng)規(guī)則
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

# 6. 寫(xiě)入防火墻規(guī)則配置文件
/etc/init.d/iptables save

[root@www ~]# sh bin/firewall.sh
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

其實(shí)防火墻也是一個(gè)服務(wù),你可以透過(guò)『chkconfig --list iptables』去察看就知道了。 因此,你這次修改的各種設(shè)定想要在下次開(kāi)機(jī)還保存,那就得要進(jìn)行『 /etc/init.d/iptables save 』這個(gè)指令加參數(shù)。 因此,鳥(niǎo)哥現(xiàn)在都是將儲(chǔ)存的動(dòng)作寫(xiě)入這個(gè) firewall.sh 腳本中,比較單純些啰!現(xiàn)在,你的 Linux 主機(jī)已經(jīng)有相當(dāng)?shù)谋Wo(hù)了, 只是如果想要作為服務(wù)器,或者是作為路由器,那就得要自行加上某些自定義的規(guī)則啰。

Tips:
老實(shí)說(shuō),如果你對(duì) Linux 夠熟悉的話,直接去修改 /etc/sysconfig/iptables 然后將 iptables 這個(gè)服務(wù) restart, 那你的防火墻規(guī)則就是會(huì)在開(kāi)機(jī)后持續(xù)存在啰!不過(guò),鳥(niǎo)哥個(gè)人還是喜歡寫(xiě) scripts 就是了。
鳥(niǎo)哥的圖示

制訂好規(guī)則后當(dāng)然就是要測(cè)試啰!那么如何測(cè)試呢?

  1. 先由主機(jī)向外面主動(dòng)聯(lián)機(jī)試看看;
  2. 再由私有網(wǎng)域內(nèi)的 PC 向外面主動(dòng)聯(lián)機(jī)試看看;
  3. 最后,由 Internet 上面的主機(jī),主動(dòng)聯(lián)機(jī)到你的 Linux 主機(jī)試看看;

一步一步作下來(lái),看看問(wèn)題出在哪里,然后多多的去改進(jìn)、改良!基本上,網(wǎng)絡(luò)上目前很多的資料可以提供你不錯(cuò)的參考了! 這一篇的設(shè)定寫(xiě)的是很簡(jiǎn)單,大部分都還在介紹階段而已!希望對(duì)大家有幫助! 鳥(niǎo)哥在參考數(shù)據(jù)(注2)當(dāng)中列出幾個(gè)有用的防火墻網(wǎng)頁(yè),希望大家有空真的要多多的去看看!會(huì)很有幫助的!


小標(biāo)題的圖示9.3.5 IPv4 的核心管理功能 /proc/sys/net/ipv4/*

除了 iptables 這個(gè)防火墻軟件之外,其實(shí)咱們 Linux kernel 2.6 提供很多核心預(yù)設(shè)的攻擊抵擋機(jī)制喔! 由于是核心的網(wǎng)絡(luò)功能,所以相關(guān)的設(shè)定數(shù)據(jù)都是放置在 /proc/sys/net/ipv4/ 這個(gè)目錄當(dāng)中。 至于該目錄下各個(gè)檔案的詳細(xì)資料,可以參考核心的說(shuō)明文件 (你得要先安裝 kernel-doc 軟件)

  • /usr/share/doc/kernel-doc-2.6.32/Documentation/networking/ip-sysctl.txt

鳥(niǎo)哥這里也放一份備份

有興趣的話應(yīng)該要自行去查一查比較好的喔!我們底下就拿幾個(gè)簡(jiǎn)單的檔案來(lái)作說(shuō)明吧!


  • /proc/sys/net/ipv4/tcp_syncookies

    我們?cè)谇耙徽抡劦剿^的阻斷式服務(wù) (DoS) 攻擊法當(dāng)中的一種方式,就是利用 TCP 封包的 SYN 三向交握原理所達(dá)成的, 這種方式稱為 SYN Flooding 。那如何預(yù)防這種方式的攻擊呢?我們可以啟用核心的 SYN Cookie 模塊?。? 這個(gè) SYN Cookie 模塊可以在系統(tǒng)用來(lái)啟動(dòng)隨機(jī)聯(lián)機(jī)的埠口 (1024:65535) 即將用完時(shí)自動(dòng)啟動(dòng)。

    當(dāng)啟動(dòng) SYN Cookie 時(shí),主機(jī)在發(fā)送 SYN/ACK 確認(rèn)封包前,會(huì)要求 Client 端在短時(shí)間內(nèi)回復(fù)一個(gè)序號(hào),這個(gè)序號(hào)包含許多原本 SYN 封包內(nèi)的信息,包括 IP、port 等。若 Client 端可以回復(fù)正確的序號(hào),那么主機(jī)就確定該封包為可信的,因此會(huì)發(fā)送 SYN/ACK 封包,否則就不理會(huì)此一封包。

    透過(guò)此一機(jī)制可以大大的降低無(wú)效的 SYN 等待埠口,而避免 SYN Flooding 的 DoS 攻擊說(shuō)! 那么如何啟動(dòng)這個(gè)模塊呢?很簡(jiǎn)單,這樣做即可
    [root@www ~]# echo "1" > /proc/sys/net/ipv4/tcp_syncookies
    
    但是這個(gè)設(shè)定值由于違反 TCP 的三向交握 (因?yàn)橹鳈C(jī)在發(fā)送 SYN/ACK 之前需要先等待 client 的序號(hào)響應(yīng)), 所以可能會(huì)造成某些服務(wù)的延遲現(xiàn)象,例如 SMTP (mail server)。 不過(guò)總的來(lái)說(shuō),這個(gè)設(shè)定值還是不錯(cuò)用的! 只是不適合用在負(fù)載已經(jīng)很高的服務(wù)器內(nèi)喔! 因?yàn)樨?fù)載太高的主機(jī)有時(shí)會(huì)讓核心誤判遭受 SYN Flooding 的攻擊呢。

    如果是為了系統(tǒng)的 TCP 封包聯(lián)機(jī)優(yōu)化,則可以參考 tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow 這幾個(gè)設(shè)定值的意義。


  • /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

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

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

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

  • /proc/sys/net/ipv4/conf/網(wǎng)絡(luò)接口/*

    咱們的核心還可以針對(duì)不同的網(wǎng)絡(luò)接口進(jìn)行不一樣的參數(shù)設(shè)定喔!網(wǎng)絡(luò)接口的相關(guān)設(shè)定放置在 /proc/sys/net/ipv4/conf/ 當(dāng)中,每個(gè)接口都以接口代號(hào)做為其代表,例如 eth0 接口的相關(guān)設(shè)定數(shù)據(jù)在 /proc/sys/net/ipv4/conf/eth0/ 內(nèi)。那么網(wǎng)絡(luò)接口的設(shè)定數(shù)據(jù)有哪些比較需要注意的呢? 大概有底下這幾個(gè)

    • rp_filter稱為逆向路徑過(guò)濾 (Reverse Path Filtering), 可以藉由分析網(wǎng)絡(luò)接口的路由信息配合封包的來(lái)源地址,來(lái)分析該封包是否為合理。舉例來(lái)說(shuō),你有兩張網(wǎng)卡,eth0 為 192.168.1.10/24 ,eth1 為 public IP 。那么當(dāng)有一個(gè)封包自稱來(lái)自 eth1 ,但是其 IP 來(lái)源為 192.168.1.200 , 那這個(gè)封包就不合理,應(yīng)予以丟棄。這個(gè)設(shè)定值建議可以啟動(dòng)的。

    • log_martians這個(gè)設(shè)定數(shù)據(jù)可以用來(lái)啟動(dòng)記錄不合法的 IP 來(lái)源, 舉例來(lái)說(shuō),包括來(lái)源為 0.0.0.0、127.x.x.x、及 Class E 的 IP 來(lái)源,因?yàn)檫@些來(lái)源的 IP 不應(yīng)該應(yīng)用于 Internet 啊。 記錄的數(shù)據(jù)默認(rèn)放置到核心放置的登錄檔 /var/log/messages。

    • accept_source_route或許某些路由器會(huì)啟動(dòng)這個(gè)設(shè)定值, 不過(guò)目前的設(shè)備很少使用到這種來(lái)源路由,你可以取消這個(gè)設(shè)定值。

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

    • send_redirects與上一個(gè)類似,只是此值為發(fā)送一個(gè) ICMP redirect 封包。 同樣建議關(guān)閉。(事實(shí)上,鳥(niǎo)哥就曾經(jīng)為了這個(gè) ICMP redirect 的問(wèn)題傷腦筋!其實(shí)關(guān)閉 redirect 的這兩個(gè)項(xiàng)目即可?。?

    雖然你可以使用『 echo "1" > /proc/sys/net/ipv4/conf/???/rp_filter 』之類的方法來(lái)啟動(dòng)這個(gè)項(xiàng)目,不過(guò), 鳥(niǎo)哥比較建議修改系統(tǒng)設(shè)定值,那就是 /etc/sysctl.conf 這個(gè)檔案!假設(shè)我們僅有 eth0 這個(gè)以太接口,而且上述的功能要通通啟動(dòng), 那你可以這樣做
    [root@www ~]# vim /etc/sysctl.conf
    # Adding by VBird 2011/01/28
    net.ipv4.tcp_syncookies = 1
    net.ipv4.icmp_echo_ignore_broadcasts = 1
    net.ipv4.conf.all.rp_filter = 1
    net.ipv4.conf.default.rp_filter = 1
    net.ipv4.conf.eth0.rp_filter = 1
    net.ipv4.conf.lo.rp_filter = 1
    ....(以下省略)....
    
    [root@www ~]# sysctl -p
    

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多