<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 9.3 Linux 的封包過濾軟件:iptables 上面談了這么多,主要還是希望你能了解到防火墻是什么這個議題!而且也希望你知道防火墻并非萬能的。 好了,那么底下我們終于可以來瞧一瞧,那目前我們的 2.6 版這個 Linux 核心到底使用什么核心功能來進行防火墻設定? * * * ### 9.3.1 不同 Linux 核心版本的防火墻軟件 Linux 的防火墻為什么功能這么好?這是因為他本身就是由 Linux 核心所提供,由于直接經過核心來處理,因此效能非常好! 不過,不同核心版本所使用的防火墻軟件是不一樣的!因為核心支持的防火墻是逐漸演進而來的嘛! * Version 2.0:使用 ipfwadm 這個防火墻機制; * Version 2.2:使用的是 ipchains 這個防火墻機制; * Version 2.4 與 2.6 :主要是使用 iptables 這個防火墻機制,不過在某些早期的 Version 2.4 版本的 distributions 當中,亦同時支持 ipchains (編譯成為模塊),好讓用戶仍然可以使用來自 2.2 版的 ipchains 的防火墻規劃。不過,不建議在 2.4 以上的核心版本使用 ipchains 喔! 因為不同的核心使用的防火墻機制不同,且支持的軟件指令與語法也不相同,所以在 Linux 上頭設定屬于你自己的防火墻規則時,要注意啊,先用 [uname -r](http://linux.vbird.org/linux_basic/0440processcontrol.php#uname) 追蹤一下你的核心版本再說!如果你是安裝 2004 年以后推出的 distributions ,那就不需要擔心了,因為這些 distributions 幾乎都使用 kernel 2.6 版的核心啊! ^_^ * * * ### 9.3.2 封包進入流程:規則順序的重要性! 前面的幾個小節里面我們一直談到:『防火墻規則』,咦!啥是規則啊?因為 iptables 是利用封包過濾的機制, 所以他會分析封包的表頭數據。根據表頭數據與定義的『規則』來決定該封包是否可以進入主機或者是被丟棄。 意思就是說:『根據封包的分析資料 "比對" 你預先定義的規則內容, 若封包數據與規則內容相同則進行動作,否則就繼續下一條規則的比對!』 重點在那個『比對與分析順序』上。 舉個簡單的例子,假設我預先定義 10 條防火墻規則好了,那么當 Internet 來了一個封包想要進入我的主機, 那么防火墻是如何分析這個封包的呢?我們以底下的圖示來說明好了: ![](https://box.kancloud.cn/2016-05-13_5735da5116e95.png) 圖 9.3-1、封包過濾的規則動作及分析流程 當一個網絡封包要進入到主機之前,會先經由 NetFilter 進行檢查,那就是 iptables 的規則了。 檢查通過則接受 (ACCEPT) 進入本機取得資源,如果檢查不通過,則可能予以丟棄 (DROP) ! 上圖中主要的目的在告知你:『規則是有順序的』!例如當網絡封包進入 Rule 1 的比對時, 如果比對結果符合 Rule 1 ,此時這個網絡封包就會進行 Action 1 的動作,而不會理會后續的 Rule 2, Rule 3.... 等規則的分析了。 而如果這個封包并不符合 Rule 1 的比對,那就會進入 Rule 2 的比對了!如此一個一個規則去進行比對就是了。 那如果所有的規則都不符合怎辦?此時就會透過預設動作 (封包政策, Policy) 來決定這個封包的去向。 所以啦,當你的規則順序排列錯誤時,就會產生很嚴重的錯誤了。 怎么說呢?讓我們看看底下這個例子: 假設你的 Linux 主機提供了 WWW 的服務,那么自然就要針對 port 80 來啟用通過的封包規則,但是你發現 IP 來源為 192.168.100.100 老是惡意的嘗試入侵你的系統,所以你想要將該 IP 拒絕往來,最后,所有的非 WWW 的封包都給他丟棄,就這三個規則來說,你要如何設定防火墻檢驗順序呢? 1. Rule 1 先抵擋 192.168.100.100 ; 2. Rule 2 再讓要求 WWW 服務的封包通過; 3. Rule 3 將所有的封包丟棄。 這樣的排列順序就能符合你的需求,不過,萬一你的順序排錯了,變成: 1. Rule 1 先讓要求 WWW 服務的封包通過; 2. Rule 2 再抵擋 192.168.100.100 ; 3. Rule 3 將所有的封包丟棄。 此時,那個 192.168.100.100 『可以使用你的 WWW 服務』喔!只要他對你的主機送出 WWW 要求封包,就可以使用你的 WWW 功能了,因為你的規則順序定義第一條就會讓他通過,而不去考慮第二條規則!這樣可以理解規則順序的意義了嗎! 現在再來想一想,如果 Rule 1 變成了『將所有的封包丟棄』,Rule 2 才設定『WWW 服務封包通過』,請問,我的 client 可以使用我的 WWW 服務嗎?呵呵!答案是『否~』想通了嗎? ^_^ * * * ### 9.3.3 iptables 的表格 (table) 與鏈 (chain) 事實上,那個[圖 9.3-1](#fig9.3-1) 所列出的規則僅是 iptables 眾多表格當中的一個鏈 (chain) 而已。 什么是鏈呢?這得由 iptables 的名稱說起。為什么稱為 ip"tables" 呢? 因為這個防火墻軟件里面有多個表格 (table) ,每個表格都定義出自己的默認政策與規則, 且每個表格的用途都不相同。我們可以使用底下這張圖來稍微了解一下: ![](https://box.kancloud.cn/2016-05-13_5735da51509e8.png) 圖 9.3-2、iptables 的表格與相關鏈示意圖 剛剛圖 9.3-1 的規則內容僅只是圖 9.3-2 內的某個 chain 而已! 而預設的情況下,咱們 Linux 的 iptables 至少就有三個表格,包括管理本機進出的 filter 、管理后端主機 (防火墻內部的其他計算機) 的 nat 、管理特殊旗標使用的 mangle (較少使用) 。更有甚者,我們還可以自定義額外的鏈呢! 真是很神奇吧!每個表格與其中鏈的用途分別是這樣的: * filter (過濾器):主要跟進入 Linux 本機的封包有關,這個是預設的 table 喔! * INPUT:主要與想要進入我們 Linux 本機的封包有關; * OUTPUT:主要與我們 Linux 本機所要送出的封包有關; * FORWARD:這個咚咚與 Linux 本機比較沒有關系, 他可以『轉遞封包』到后端的計算機中,與下列 nat table 相關性較高。 * nat (地址轉換):是 Network Address Translation 的縮寫, 這個表格主要在進行來源與目的之 IP 或 port 的轉換,與 Linux 本機較無關,主要與 Linux 主機后的局域網絡內計算機較有相關。 * PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT) * POSTROUTING:在進行路由判斷之后所要進行的規則(SNAT/MASQUERADE) * OUTPUT:與發送出去的封包有關 * mangle (破壞者):這個表格主要是與特殊的封包的路由旗標有關, 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 鏈。 由于這個表格與特殊旗標相關性較高,所以像咱們這種單純的環境當中,較少使用 mangle 這個表格。 所以說,如果你的 Linux 是作為 www 服務,那么要開放客戶端對你的 www 要求有響應,就得要處理 filter 的 INPUT 鏈; 而如果你的 Linux 是作為局域網絡的路由器,那么就得要分析 nat 的各個鏈以及 filter 的 FORWARD 鏈才行。也就是說, 其實各個表格的鏈結之間是有關系的!簡單的關系可以由下圖這么看: ![](https://box.kancloud.cn/2016-05-13_5735da51983bf.gif) 圖 9.3-3、iptables 內建各表格與鏈的相關性 上面的圖示很復雜喔!不過基本上你依舊可以看出來,我們的 iptables 可以控制三種封包的流向: * 封包進入 Linux 主機使用資源 (路徑 A): 在路由判斷后確定是向 Linux 主機要求數據的封包,主要就會透過 filter 的 INPUT 鏈來進行控管; * 封包經由 Linux 主機的轉遞,沒有使用主機資源,而是向后端主機流動 (路徑 B): 在路由判斷之前進行封包表頭的修訂作業后,發現到封包主要是要透過防火墻而去后端,此時封包就會透過路徑 B 來跑動。 也就是說,該封包的目標并非我們的 Linux 本機。主要經過的鏈是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。 這路徑 B 的封包流向使用情況,我們會在本章的 9.5 小節來跟大家作個簡單的介紹。 * 封包由 Linux 本機發送出去 (路徑 C): 例如響應客戶端的要求,或者是 Linux 本機主動送出的封包,都是透過路徑 C 來跑的。先是透過路由判斷, 決定了輸出的路徑后,再透過 filter 的 OUTPUT 鏈來傳送的!當然,最終還是會經過 nat 的 POSTROUTING 鏈。 **Tips:** 有沒有發現有兩個『路由判斷』呢?因為網絡是雙向的,所以進與出要分開來看!因此,進入的封包需要路由判斷, 送出的封包當然也要進行路由判斷才能夠發送出去啊!了解乎? ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) 由于 mangle 這個表格很少被使用,如果將圖 9.3-3 的 mangle 拿掉的話,那就容易看的多了: ![](https://box.kancloud.cn/2016-05-13_5735da51ed155.gif) 圖 9.3-4、iptables 內建各表格與鏈的相關性(簡圖) 透過圖 9.3-4 你就可以更輕松的了解到,事實上與本機最有關的其實是 filter 這個表格內的 INPUT 與 OUTPUT 這兩條鏈,如果你的 iptables 只是用來保護 Linux 主機本身的話,那 nat 的規則根本就不需要理他,直接設定為開放即可。 不過,如果你的防火墻事實上是用來管制 LAN 內的其他主機的話,那么你就必須要再針對 filter 的 FORWARD 這條鏈,還有 nat 的 PREROUTING, POSTROUTING 以及 OUTPUT 進行額外的規則訂定才行。 nat 表格的使用需要很清晰的路由概念才能夠設定的好,建議新手先不要碰!最多就是先玩一玩最陽春的 nat 功能『IP 分享器的功能』就好了! ^_^!這部份我們在本章的最后一小節會介紹的啦! * * * ### 9.3.4 本機的 iptables 語法 理論上,當你安裝好 Linux 之后,系統應該會主動的幫你啟動一個陽春的防火墻規則才是, 不過這個陽春防火墻可能不是我們想要的模式,因此我們需要額外進行一些修訂的行為。不過,在開始進行底下的練習之前, 鳥哥這里有個很重要的事情要告知一下。因為 iptables 的指令會將網絡封包進行過濾及抵擋的動作,所以, 請不要在遠程主機上進行防火墻的練習,因為你很有可能一不小心將自己關在家門外! 盡量在本機前面登入 tty1-tty6 終端機進行練習,否則常常會發生悲劇啊!鳥哥以前剛剛在玩 iptables 時,就常常因為不小心規則設定錯誤,導致常常要請遠程的朋友幫忙重新啟動... 剛剛提到咱們的 iptables 至少有三個預設的 table (filter, nat, mangle),較常用的是本機的 filter 表格, 這也是默認表格啦。另一個則是后端主機的 nat 表格,至于 mangle 較少使用,所以這個章節我們并不會討論 mangle。 由于不同的 table 他們的鏈不一樣,導致使用的指令語法或多或少都有點差異。 在這個小節當中,我們主要將針對 filter 這個默認表格的三條鏈來做介紹。底下就來玩一玩吧! **Tips:** 防火墻的設定主要使用的就是 iptables 這個指令而已。而防火墻是系統管理員的主要任務之一, 且對于系統的影響相當的大,因此『只能讓 root 使用 iptables 』,不論是設定還是觀察防火墻規則喔! ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) * * * ### 9.3.4-1 規則的觀察與清除 如果你在安裝的時候選擇沒有防火墻的話,那么 iptables 在一開始的時候應該是沒有規則的,不過, 可能因為你在安裝的時候就有選擇系統自動幫你建立防火墻機制,那系統就會有默認的防火墻規則了! 無論如何,我們先來看看目前本機的防火墻規則是如何吧! ``` [root@www ~]# iptables [-t tables] [-L] [-nv] 選項與參數: -t :后面接 table ,例如 nat 或 filter ,若省略此項目,則使用默認的 filter -L :列出目前的 table 的規則 -n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快很多! -v :列出更多的信息,包括通過該規則的封包總位數、相關的網絡接口等 范例:列出 filter table 三條鏈的規則 [root@www ~]# iptables -L -n Chain INPUT (policy ACCEPT) &lt;==針對 INPUT 鏈,且預設政策為可接受 target prot opt source destination &lt;==說明欄 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED &lt;==第 1 條規則 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 &lt;==第 2 條規則 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 &lt;==第 3 條規則 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 &lt;==以下類推 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) &lt;==針對 FORWARD 鏈,且預設政策為可接受 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) &lt;==針對 OUTPUT 鏈,且預設政策為可接受 target prot opt source destination 范例:列出 nat table 三條鏈的規則 [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 ``` 在上表中,每一個 Chain 就是前面提到的每個鏈啰~ Chain 那一行里面括號的 policy 就是預設的政策, 那底下的 target, prot 代表什么呢? * target:代表進行的動作, ACCEPT 是放行,而 REJECT 則是拒絕,此外,尚有 DROP (丟棄) 的項目! * prot:代表使用的封包協議,主要有 tcp, udp 及 icmp 三種封包格式; * opt:額外的選項說明 * source :代表此規則是針對哪個『來源 IP』進行限制? * destination :代表此規則是針對哪個『目標 IP』進行限制? 在輸出結果中,第一個范例因為沒有加上 -t 的選項,所以默認就是 filter 這個表格內的 INPUT, OUTPUT, FORWARD 三條鏈的規則啰。若針對單機來說,INPUT 與 FORWARD 算是比較重要的管制防火墻鏈, 所以你可以發現最后一條規則的政策是 REJECT (拒絕) 喔!雖然 INPUT 與 FORWARD 的政策是放行 (ACCEPT), 不過在最后一條規則就已經將全部的封包都拒絕了! 不過這個指令的觀察只是作個格式化的查閱,要詳細解釋每個規則會比較不容易解析。舉例來說, 我們將 INPUT 的 5 條規則依據輸出結果來說明一下,結果會變成: 1. 只要是封包狀態為 RELATED,ESTABLISHED 就予以接受 2. 只要封包協議是 icmp 類型的,就予以放行 3. 無論任何來源 (0.0.0.0/0) 且要去任何目標的封包,不論任何封包格式 (prot 為 all),通通都接受 4. 只要是傳給 port 22 的主動式聯機 tcp 封包就接受 5. 全部的封包信息通通拒絕 最有趣的應該是第 3 條規則了,怎么會所有的封包信息都予以接受?如果都接受的話,那么后續的規則根本就不會有用嘛! 其實那條規則是僅針對每部主機都有的內部循環測試網絡 (lo) 接口啦!如果沒有列出接口,那么我們就很容易搞錯啰~ 所以,近來鳥哥都建議使用 iptables-save 這個指令來觀察防火墻規則啦!因為 iptables-save 會列出完整的防火墻規則,只是并沒有規格化輸出而已。 ``` [root@www ~]# iptables-save [-t table] 選項與參數: -t :可以僅針對某些表格來輸出,例如僅針對 nat 或 filter 等等 [root@www ~]# iptables-save # Generated by iptables-save v1.4.7 on Fri Jul 22 15:51:52 2011 *filter &lt;==星號開頭的指的是表格,這里為 filter :INPUT ACCEPT [0:0] &lt;==冒號開頭的指的是鏈,三條內建的鏈 :FORWARD ACCEPT [0:0] &lt;==三條內建鏈的政策都是 ACCEPT 啰! :OUTPUT ACCEPT [680:100461] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT &lt;==針對 INPUT 的規則 -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT &lt;==這條很重要!針對本機內部接口開放! -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 &lt;==針對 FORWARD 的規則 COMMIT # Completed on Fri Jul 22 15:51:52 2011 ``` 由上面的輸出來看,有底線且內容含有 lo 的那條規則當中,『 -i lo 』指的就是由 lo 適配卡進來的封包! 這樣看就清楚多了!因為有寫到接口的關系啊!不像之前的 iptables -L -n 嘛!這樣了解乎! 不過,既然這個規則不是我們想要的,那該如何修改規則呢?鳥哥建議,先刪除規則再慢慢建立各個需要的規則! 那如何清除規則?這樣做就對了: ``` [root@www ~]# iptables [-t tables] [-FXZ] 選項與參數: -F :清除所有的已訂定的規則; -X :殺掉所有使用者 "自定義" 的 chain (應該說的是 tables )啰; -Z :將所有的 chain 的計數與流量統計都歸零 范例:清除本機防火墻 (filter) 的所有規則 [root@www ~]# iptables -F [root@www ~]# iptables -X [root@www ~]# iptables -Z ``` 由于這三個指令會將本機防火墻的所有規則都清除,但卻不會改變預設政策 (policy) , 所以如果你不是在本機下達這三行指令時,很可能你會被自己擋在家門外 (若 INPUT 設定為 DROP 時)!要小心啊! 一般來說,我們在重新定義防火墻的時候,都會先將規則給他清除掉。還記得我們前面談到的, 防火墻的『規則順序』是有特殊意義的,所以啰, 當然先清除掉規則,然后一條一條來設定會比較容易一點啦。底下就來談談定義預設政策吧! * * * ### 9.3.4-2 定義預設政策 (policy) 清除規則之后,再接下來就是要設定規則的政策啦!還記得政策指的是什么嗎?『 當你的封包不在你設定的規則之內時,則該封包的通過與否,是以 Policy 的設定為準』,在本機方面的預設政策中,假設你對于內部的使用者有信心的話, 那么 filter 內的 INPUT 鏈方面可以定義的比較嚴格一點,而 FORWARD 與 OUTPUT 則可以訂定的松一些!通常鳥哥都是將 INPUT 的 policy 定義為 DROP 啦,其他兩個則定義為 ACCEPT。 至于 nat table 則暫時先不理會他。 ``` [root@www ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP] 選項與參數: -P :定義政策( Policy )。注意,這個 P 為大寫啊! ACCEPT :該封包可接受 DROP :該封包直接丟棄,不會讓 client 端知道為何被丟棄。 范例:將本機的 INPUT 設定為 DROP ,其他設定為 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 設定為 DROP 而又尚未有任何規則,所以上面的輸出結果顯示: # 所有的封包都無法進入你的主機!是不通的防火墻設定!(網絡聯機是雙向的) ``` 看到輸出的結果了吧?INPUT 被修改了設定喔!其他的 nat table 三條鏈的預設政策設定也是一樣的方式,例如:『 iptables -t nat -P PREROUTING ACCEPT 』就設定了 nat table 的 PREROUTING 鏈為可接受的意思!預設政策設定完畢后,來談一談關于各規則的封包基礎比對設定吧。 * * * ### 9.3.4-3 封包的基礎比對:IP, 網域及接口裝置 開始來進行防火墻規則的封包比對設定吧!既然是因特網,那么我們就由最基礎的 IP, 網域及埠口,亦即是 OSI 的第三層談起,再來談談裝置 (網絡卡) 的限制等等。這一小節與下一小節的語法你一定要記住,因為這是最基礎的比對語法喔! ``` [root@www ~]# iptables [-AI 鏈名] [-io 網絡接口] [-p 協議] \ &gt; [-s 來源IP/網域] [-d 目標IP/網域] -j [ACCEPT&#124;DROP&#124;REJECT&#124;LOG] 選項與參數: -AI 鏈名:針對某的鏈進行規則的 "插入" 或 "累加" -A :新增加一條規則,該規則增加在原本規則的最后面。例如原本已經有四條規則, 使用 -A 就可以加上第五條規則! -I :插入一條規則。如果沒有指定此規則的順序,默認是插入變成第一條規則。 例如原本有四條規則,使用 -I 則該規則變成第一條,而原本四條變成 2~5 號 鏈 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關,請看底下。 -io 網絡接口:設定封包進出的接口規范 -i :封包所進入的那個網絡接口,例如 eth0, lo 等接口。需與 INPUT 鏈配合; -o :封包所傳出的那個網絡接口,需與 OUTPUT 鏈配合; -p 協定:設定此規則適用于哪種封包格式 主要的封包格式有: tcp, udp, icmp 及 all 。 -s 來源 IP/網域:設定此規則之封包的來源項目,可指定單純的 IP 或包括網域,例如: IP :192.168.0.100 網域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。 若規范為『不許』時,則加上 ! 即可,例如: -s ! 192.168.100.0/24 表示不許 192.168.100.0/24 之封包來源; -d 目標 IP/網域:同 -s ,只不過這里指的是目標的 IP 或網域。 -j :后面接動作,主要的動作有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT)及記錄(LOG) ``` iptables 的基本參數就如同上面所示的,僅只談到 IP 、網域與裝置等等的信息, 至于 TCP, UDP 封包特有的埠口 (port number) 與狀態 (如 SYN 旗標) 則在下小節才會談到。 好,先讓我們來看看最基礎的幾個規則,例如開放 lo 這個本機的接口以及某個 IP 來源吧! ``` 范例:設定 lo 成為受信任的裝置,亦即進出 lo 的封包都予以接受 [root@www ~]# iptables -A INPUT -i lo -j ACCEPT ``` 仔細看上面并沒有列出 -s, -d 等等的規則,這表示:不論封包來自何處或去到哪里,只要是來自 lo 這個界面,就予以接受!這個觀念挺重要的,就是『沒有指定的項目,則表示該項目完全接受』的意思! 例如這個案例當中,關于 -s, -d...等等的參數沒有規定時,就代表不論什么值都會被接受啰。 這就是所謂的信任裝置啦!假如你的主機有兩張以太網絡卡,其中一張是對內部的網域,假設該網卡的代號為 eth1 好了, 如果內部網域是可信任的,那么該網卡的進出封包就通通會被接受,那你就能夠用:『iptables -A INPUT -i eth1 -j ACCEPT』 來將該裝置設定為信任裝置。不過,下達這個指令前要特別注意,因為這樣等于該網卡沒有任何防備了喔! ``` 范例:只要是來自內網的 (192.168.100.0/24) 的封包通通接受 [root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT # 由于是內網就接受,因此也可以稱之為『信任網域』啰。 范例:只要是來自 192.168.100.10 就接受,但 192.168.100.230 這個惡意來源就丟棄 [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 # 針對單一 IP 來源,可視為信任主機或者是不信任的惡意來源喔! [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 ``` 這就是最單純簡單的防火墻規則的設定與觀察方式。不過,在上面的案例中,其實你也發現到有兩條規則可能有問題~ 那就是上面的特殊字體圈起來的規則順序。明明已經放行了 192.168.100.0/24 了,所以那個 192.168.100.230 的規則就不可能會被用到!這就是有問題的防火墻設定啊!了解乎?那該怎辦?就重打啊!@_@! 那如果你想要記錄某個規則的紀錄怎么辦?可以這樣做: ``` [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 ``` 看到輸出結果的最左邊,會出現的是 LOG 喔!只要有封包來自 192.168.2.200 這個 IP 時, 那么該封包的相關信息就會被寫入到核心訊息,亦即是 /var/log/messages 這個檔案當中。 然后該封包會繼續進行后續的規則比對。所以說, LOG 這個動作僅在進行記錄而已,并不會影響到這個封包的其他規則比對的。 好了,接下來我們分別來看看 TCP,UDP 以及 ICMP 封包的其他規則比對吧! * * * ### 9.3.4-4 TCP, UDP 的規則比對:針對埠口設定 我們在[第二章網絡基礎](http://linux.vbird.org/linux_server/0110network_basic.php)談過各種不同的封包格式, 在談到 TCP 與 UDP 時,比較特殊的就是那個埠口 (port),在 TCP 方面則另外有所謂的聯機封包狀態, 包括最常見的 SYN 主動聯機的封包格式。那么如何針對這兩種封包格式進行防火墻規則的設定呢?你可以這樣看: ``` [root@www ~]# iptables [-AI 鏈] [-io 網絡接口] [-p tcp,udp] \ &gt; [-s 來源IP/網域] [--sport 埠口范圍] \ &gt; [-d 目標IP/網域] [--dport 埠口范圍] -j [ACCEPT&#124;DROP&#124;REJECT] 選項與參數: --sport 埠口范圍:限制來源的端口號碼,端口號碼可以是連續的,例如 1024:65535 --dport 埠口范圍:限制目標的端口號碼。 ``` 事實上就是多了那個 --sport 及 --dport 這兩個玩意兒,重點在那個 port 上面啦! 不過你得要特別注意,因為僅有 tcp 與 udp 封包具有埠口,因此你想要使用 --dport, --sport 時,得要加上 -p tcp 或 -p udp 的參數才會成功喔!底下讓我們來進行幾個小測試: ``` 范例:想要聯機進入本機 port 21 的封包都抵擋掉: [root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP 范例:想連到我這部主機的網芳 (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 協議所擁有的端口號碼來進行某些服務的開放或關閉喔!你還可以綜合處理呢!例如:只要來自 192.168.1.0/24 的 1024:65535 埠口的封包,且想要聯機到本機的 ssh port 就予以抵擋,可以這樣做: ``` [root@www ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 \ &gt; --sport 1024:65534 --dport ssh -j DROP ``` 如果忘記加上 -p tcp 就使用了 --dport 時,會發生啥問題呢? ``` [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. ``` 你應該會覺得很奇怪,怎么『 --dport 』會是未知的參數 (arg) 呢?這是因為你沒有加上 -p tcp 或 -p udp 的緣故啊!很重要喔! 除了埠口之外,在 TCP 還有特殊的旗標啊!最常見的就是那個主動聯機的 SYN 旗標了。 我們在 iptables 里面還支持『 --syn 』的處理方式,我們以底下的例子來說明好了: ``` 范例:將來自任何地方來源 port 1:1023 的主動聯機到本機端的 1:1023 聯機丟棄 [root@www ~]# iptables -A INPUT -i eth0 -p tcp --sport 1:1023 \ &gt; --dport 1:1023 --syn -j DROP ``` 一般來說,client 端啟用的 port 都是大于 1024 以上的埠口,而 server 端則是啟用小于 1023 以下的埠口在監聽的。所以我們可以讓來自遠程的小于 1023 以下的端口數據的主動聯機都給他丟棄! 但不適用在 FTP 的主動聯機中!這部份我們未來在二十一章的 FTP 服務器再來談吧! * * * ### 9.3.4-5 iptables 外掛模塊:mac 與 state 在 kernel 2.2 以前使用 ipchains 管理防火墻時,通常會讓系統管理員相當頭痛!因為 ipchains 沒有所謂的封包狀態模塊,因此我們必須要針對封包的進、出方向進行管控。舉例來說,如果你想要聯機到遠程主機的 port 22 時,你必須要針對兩條規則來設定: * 本機端的 1024:65535 到遠程的 port 22 必須要放行 (OUTPUT 鏈); * 遠程主機 port 22 到本機的 1024:65535 必須放行 (INPUT 鏈); 這會很麻煩!因為如果你要聯機到 10 部主機的 port 22 時,假設 OUTPUT 為預設開啟 (ACCEPT), 你依舊需要填寫十行規則,讓那十部遠程主機的 port 22 可以聯機到你的本地端主機上。 那如果開啟全部的 port 22 呢?又擔心某些惡意主機會主動以 port 22 聯機到你的機器上! 同樣的道理,如果你要讓本地端主機可以連到外部的 port 80 (WWW 服務),那就更不得了~ 這就是網絡聯機是雙向的一個很重要的概念! 好在我們的 iptables 免除了這個困擾!他可以透過一個狀態模塊來分析 『這個想要進入的封包是否為剛剛我發出去的響應?』 如果是剛剛我發出去的響應,那么就可以予以接受放行!哇!真棒!這樣就不用管遠程主機是否聯機進來的問題了! 那如何達到呢?看看底下的語法: ``` [root@www ~]# iptables -A INPUT [-m state] [--state 狀態] 選項與參數: -m :一些 iptables 的外掛模塊,主要常見的有: state :狀態模塊 mac :網絡卡硬件地址 (hardware address) --state :一些封包的狀態,主要有: INVALID :無效的封包,例如數據破損的封包狀態 ESTABLISHED:已經聯機成功的聯機狀態; NEW :想要新建立聯機的封包狀態; RELATED :這個最常用!表示這個封包是與我們主機發送出去的封包有關 范例:只要已建立或相關封包就予以通過,只要是不合法封包就丟棄 [root@www ~]# iptables -A INPUT -m state \ &gt; --state RELATED,ESTABLISHED -j ACCEPT [root@www ~]# iptables -A INPUT -m state --state INVALID -j DROP ``` 如此一來,我們的 iptables 就會主動分析出該封包是否為響應狀態,若是的話,就直接予以接受。呵呵! 這樣一來你就不需要針對響應的封包來撰寫個別的防火墻規則了!這真是太棒了!底下我們繼續談一下 iptables 的另一個外掛, 那就是針對網卡來進行放行與防御: ``` 范例:針對局域網絡內的 aa:bb:cc:dd:ee:ff 主機開放其聯機 [root@www ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff \ &gt; -j ACCEPT 選項與參數: --mac-source :就是來源主機的 MAC 啦! ``` 如果你的區網當中有某些網絡高手,老是可以透過修改 IP 去嘗試透過路由器往外跑,那你該怎么辦? 難道將整個區網拒絕?并不需要的,你可以透過之前談到的 ARP 相關概念,去捉到那部主機的 MAC ,然后透過上頭的這個機制, 將該主機整個 DROP 掉即可。不管他改了什么 IP ,除非他知道你是用網卡的 MAC 來管理,否則他就是出不去啦!了解乎? **Tips:** 其實 MAC 也是可以偽裝的,可以透過某些軟件來修改網卡的 MAC。不過,這里我們是假設 MAC 是無法修改的情況來說明的。 此外,MAC 是不能跨路由的,因此上述的案例中才特別說明是在區網內,而不是指 Internet 外部的來源唷! ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) * * * ### 9.3.4-6 ICMP 封包規則的比對:針對是否響應 ping 來設計 在[第二章 ICMP 協議當中](http://linux.vbird.org/linux_server/0110network_basic.php#tcpip_network_icmp)我們知道 ICMP 的類型相當的多,而且很多 ICMP 封包的類型都是為了要用來進行網絡檢測用的!所以最好不要將所有的 ICMP 封包都丟棄!如果不是做為路由器的主機時,通常我們會把 ICMP type 8 (echo request) 拿掉而已,讓遠程主機不知道我們是否存在,也不會接受 ping 的響應就是了。ICMP 封包格式的處理是這樣的: ``` [root@www ~]# iptables -A INPUT [-p icmp] [--icmp-type 類型] -j ACCEPT 選項與參數: --icmp-type :后面必須要接 ICMP 的封包類型,也可以使用代號, 例如 8 代表 echo request 的意思。 范例:讓 0,3,4,11,12,14,16,18 的 ICMP type 可以進入本機: [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 ``` 這樣就能夠開放部分的 ICMP 封包格式進入本機進行網絡檢測的工作了!不過,如果你的主機是作為區網的路由器, 那么建議 icmp 封包還是要通通放行才好!這是因為客戶端檢測網絡時,常常會使用 ping 來測試到路由器的線路是否暢通之故呦! 所以不要將路由器的 icmp 關掉,會有狀況啦! * * * ### 9.3.4-7 超陽春客戶端防火墻設計與防火墻規則儲存 經過上述的本機 iptables 語法分析后,接下來我們來想想,如果站在客戶端且不提供網絡服務的 Linux 本機角色時, 你應該要如何設計你的防火墻呢?老實說,你只要分析過 CentOS 默認的防火墻規則就會知道了,理論上, 應該要有的規則如下: 1. 規則歸零:清除所有已經存在的規則 (iptables -F...) 2. 預設政策:除了 INPUT 這個自定義鏈設為 DROP 外,其他為預設 ACCEPT; 3. 信任本機:由于 lo 對本機來說是相當重要的,因此 lo 必須設定為信任裝置; 4. 回應封包:讓本機主動向外要求而響應的封包可以進入本機 (ESTABLISHED,RELATED) 5. 信任用戶:這是非必要的,如果你想要讓區網的來源可用你的主機資源時 這就是最最陽春的防火墻,你可以透過第二步驟抵擋所有遠程的來源封包,而透過第四步驟讓你要求的遠程主機響應封包可以進入, 加上讓本機的 lo 這個內部循環裝置可以放行,嘿嘿!一部 client 專用的防火墻規則就 OK 了!你可以在某個 script 上面這樣做即可: ``` [root@www ~]# vim bin/firewall.sh #!/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH # 1\. 清除規則 iptables -F iptables -X iptables -Z # 2\. 設定政策 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # 3~5\. 制訂各項規則 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\. 寫入防火墻規則配置文件 /etc/init.d/iptables save [root@www ~]# sh bin/firewall.sh iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] ``` 其實防火墻也是一個服務,你可以透過『chkconfig --list iptables』去察看就知道了。 因此,你這次修改的各種設定想要在下次開機還保存,那就得要進行『 /etc/init.d/iptables save 』這個指令加參數。 因此,鳥哥現在都是將儲存的動作寫入這個 firewall.sh 腳本中,比較單純些啰!現在,你的 Linux 主機已經有相當的保護了, 只是如果想要作為服務器,或者是作為路由器,那就得要自行加上某些自定義的規則啰。 **Tips:** 老實說,如果你對 Linux 夠熟悉的話,直接去修改 /etc/sysconfig/iptables 然后將 iptables 這個服務 restart, 那你的防火墻規則就是會在開機后持續存在啰!不過,鳥哥個人還是喜歡寫 scripts 就是了。 ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) 制訂好規則后當然就是要測試啰!那么如何測試呢? 1. 先由主機向外面主動聯機試看看; 2. 再由私有網域內的 PC 向外面主動聯機試看看; 3. 最后,由 Internet 上面的主機,主動聯機到你的 Linux 主機試看看; 一步一步作下來,看看問題出在哪里,然后多多的去改進、改良!基本上,網絡上目前很多的資料可以提供你不錯的參考了! 這一篇的設定寫的是很簡單,大部分都還在介紹階段而已!希望對大家有幫助! 鳥哥在[參考數據(注2)](#ps2)當中列出幾個有用的防火墻網頁,希望大家有空真的要多多的去看看!會很有幫助的! * * * ### 9.3.5 IPv4 的核心管理功能: /proc/sys/net/ipv4/* 除了 iptables 這個防火墻軟件之外,其實咱們 Linux kernel 2.6 提供很多核心預設的攻擊抵擋機制喔! 由于是核心的網絡功能,所以相關的設定數據都是放置在 /proc/sys/net/ipv4/ 這個目錄當中。 至于該目錄下各個檔案的詳細資料,可以參考核心的說明文件 (你得要先安裝 kernel-doc 軟件): * /usr/share/doc/kernel-doc-2.6.32/Documentation/networking/ip-sysctl.txt 鳥哥這里也放一份備份: * [http:/linux.vbird.org/linux_server/0250simple_firewall/ip-sysctl.txt](http://linux.vbird.org/linux_server/0250simple_firewall/ip-sysctl.txt) 有興趣的話應該要自行去查一查比較好的喔!我們底下就拿幾個簡單的檔案來作說明吧! * /proc/sys/net/ipv4/tcp_syncookies 我們在前一章談到所謂的[阻斷式服務 (DoS)](http://linux.vbird.org/linux_server/0210network-secure.php#cracker_ddos) 攻擊法當中的一種方式,就是利用 TCP 封包的 [SYN 三向交握](http://linux.vbird.org/linux_server/0110network_basic.php#tcpip_transfer_tcphand)原理所達成的, 這種方式稱為 SYN Flooding 。那如何預防這種方式的攻擊呢?我們可以啟用核心的 SYN Cookie 模塊啊! 這個 SYN Cookie 模塊可以在系統用來啟動隨機聯機的埠口 (1024:65535) 即將用完時自動啟動。 當啟動 SYN Cookie 時,主機在發送 SYN/ACK 確認封包前,會要求 Client 端在短時間內回復一個序號,這個序號包含許多原本 SYN 封包內的信息,包括 IP、port 等。若 Client 端可以回復正確的序號,那么主機就確定該封包為可信的,因此會發送 SYN/ACK 封包,否則就不理會此一封包。 透過此一機制可以大大的降低無效的 SYN 等待埠口,而避免 SYN Flooding 的 DoS 攻擊說! 那么如何啟動這個模塊呢?很簡單,這樣做即可: ``` [root@www ~]# echo "1" &gt; /proc/sys/net/ipv4/tcp_syncookies ``` 但是這個設定值由于違反 TCP 的三向交握 (因為主機在發送 SYN/ACK 之前需要先等待 client 的序號響應), 所以可能會造成某些服務的延遲現象,例如 SMTP (mail server)。 不過總的來說,這個設定值還是不錯用的! 只是不適合用在負載已經很高的服務器內喔! 因為負載太高的主機有時會讓核心誤判遭受 SYN Flooding 的攻擊呢。 如果是為了系統的 TCP 封包聯機優化,則可以參考 tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow 這幾個設定值的意義。 * /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 阻斷式服務常見的是 SYN Flooding ,不過,我們知道系統其實可以接受使用 ping 的響應, 而 [ping](http://linux.vbird.org/linux_server/0140networkcommand.php#ping) 的封包數據量是可以給很大的!想象一個狀況, 如果有個搞破壞的人使用 1000 臺主機傳送 ping 給你的主機,而且每個 ping 都高達數百 K bytes時, 你的網絡帶寬會怎樣?要嘛就是帶寬被吃光,要嘛可能系統會當機! 這種方式分別被稱為 ping flooding (不斷發 ping) 及 ping of death (發送大的 ping 封包)。 那如何避免呢?取消 ICMP 類型 8 的 ICMP 封包回應就是了。我們可以透過防火墻來抵擋, 這也是比較建議的方式。當然也可以讓核心自動取消 ping 的響應。不過你必須要了解, 某些局域網絡內常見的服務 (例如動態 IP 分配 DHCP 協議) 會使用 ping 的方式來偵測是否有重復的 IP ,所以你最好不要取消所有的 ping 響應比較好。 核心取消 ping 回應的設定值有兩個,分別是:/proc/sys/net/ipv4 內的 icmp_echo_ignore_broadcasts (僅有 ping broadcast 地址時才取消 ping 的回應) 及 icmp_echo_ignore_all (全部的 ping 都不回應)。鳥哥建議設定 icmp_echo_ignore_broadcasts 就好了。 你可以這么做: ``` [root@www ~]# echo "1" &gt; \ &gt; /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ``` * /proc/sys/net/ipv4/conf/網絡接口/* 咱們的核心還可以針對不同的網絡接口進行不一樣的參數設定喔!網絡接口的相關設定放置在 /proc/sys/net/ipv4/conf/ 當中,每個接口都以接口代號做為其代表,例如 eth0 接口的相關設定數據在 /proc/sys/net/ipv4/conf/eth0/ 內。那么網絡接口的設定數據有哪些比較需要注意的呢? 大概有底下這幾個: * rp_filter:稱為逆向路徑過濾 (Reverse Path Filtering), 可以藉由分析網絡接口的路由信息配合封包的來源地址,來分析該封包是否為合理。舉例來說,你有兩張網卡,eth0 為 192.168.1.10/24 ,eth1 為 public IP 。那么當有一個封包自稱來自 eth1 ,但是其 IP 來源為 192.168.1.200 , 那這個封包就不合理,應予以丟棄。這個設定值建議可以啟動的。 * log_martians:這個設定數據可以用來啟動記錄不合法的 IP 來源, 舉例來說,包括來源為 0.0.0.0、127.x.x.x、及 Class E 的 IP 來源,因為這些來源的 IP 不應該應用于 Internet 啊。 記錄的數據默認放置到核心放置的登錄檔 /var/log/messages。 * accept_source_route:或許某些路由器會啟動這個設定值, 不過目前的設備很少使用到這種來源路由,你可以取消這個設定值。 * accept_redirects:當你在同一個實體網域內架設一部路由器, 但這個實體網域有兩個 IP 網域,例如 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 段,卻是無法實際傳遞訊息的!這個設定也可能會產生一些輕微的安全風險,所以建議關閉他。 * send_redirects:與上一個類似,只是此值為發送一個 ICMP redirect 封包。 同樣建議關閉。(事實上,鳥哥就曾經為了這個 ICMP redirect 的問題傷腦筋!其實關閉 redirect 的這兩個項目即可啊!) 雖然你可以使用『 echo "1" &gt; /proc/sys/net/ipv4/conf/???/rp_filter 』之類的方法來啟動這個項目,不過, 鳥哥比較建議修改系統設定值,那就是 /etc/sysctl.conf 這個檔案!假設我們僅有 eth0 這個以太接口,而且上述的功能要通通啟動, 那你可以這樣做: ``` [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 ``` * * *
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看