歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> Linux 2.4有狀態防火牆設計(二)

Linux 2.4有狀態防火牆設計(二)

日期:2017/2/27 14:15:17   编辑:更多Linux
  第三章 定義規則 (小)改進 在本示例中,假設我們正在為有兩個網絡接口 eh0 和 eth1 的機器設計防火牆。eth0 網卡連接到 LAN,而 eth1 網卡連接到 DSL 路由器,這是與因特網的連接。對於這種情況,通過添加以下幾行命令就可以改進我們的“終極防火牆”: iptables -P INPUT DROP iptables -A INPUT -i ! eth1 -j ACCEPT 這行附加的 "iptables -A" 將一個新的包過濾規則添加到 INPUT 鏈的末端。添加此規則之後,INPUT 鏈就包含了一個規則和缺省刪除策略。現在,讓我們看一下這個半成品防火牆有什麼功能。 有關 INPUT 鏈 當包進入任何一個接口(lo、th0 或 eth1)時,netfilter 代碼會將它定向到 INPUT 鏈,並檢查該包是否與第一個規則匹配。如果匹配,則接受包,並且不再執行處理。如果不匹配,則實施 INPUT 鏈的缺省策略,廢棄(刪除)該包。 那是概念性的概述。具體情況中,第一個規則會匹配來自 eth0 和 lo 的所有包,並立即允許它們進入。而所有來自 eth1 的包都將被刪除。因此,如果我們在機器上啟用這個防火牆,它可以與 LAN 交互,但卻會徹底斷開因特網連接。讓我們看一些啟用因特網通信流的方法。 傳統防火牆,第 1 部分 顯然,如果要使防火牆變得實用,需要有選擇性地允許某些進入包經由因特網到達機器。有兩種方法可以使防火牆開放到實用的程度 -- 一種是使用靜態規則,另一種是使用動態規則,即有狀態規則。 傳統防火牆,第 2 部分 讓我們使用下載網頁作為示例。如果想要機器能夠從因特網下載網頁,可以添加一個靜態規則,此規則永遠允許每個進入 http 包,不管它來自何處: iptables -A INPUT --sport 80 -j ACCEPT 由於所有標准 Web 通信流都來自源端口 80,實際上此規則允許機器下載網頁。雖然可以勉強接受這種傳統方法,但是它卻有許多問題。 傳統防火牆的缺點,第 1 部分 這裡有個問題:雖然大多數 Web 通信流來自端口 80,但有些不是這樣。因此,雖然此規則在大部分時間中有效,但仍有少量情況並不適用此規則。例如,您可能看到過類似於 "http://www.foo.com:81" 的 URL。這個 URL 示例通過端口 81 連接到網站,而不是缺省端口 80,因此在防火牆後面就看不到這個網站。考慮所有這些特殊情況可以將相當安全的防火牆迅速變成瑞士干酪, 並迅速將許多規則添加到 INPUT 鏈以處理偶爾遇到的奇特網站。 傳統防火牆的缺點,第 2 部分 但是,這個規則的主要問題與安全性相關。的確,只有使用源端口 80 的通信流才能通過我們的防火牆。但是包的源端口並不是我們所能控制的,闖入者可以輕易地改變它。例如,如果闖入者知道我們的防火牆是如何設計的,他只要確保其所有進入連接都來自其機器的 80 端口就可以繞過我們的防火牆。由於這個靜態防火牆規則很容易被利用,因此需要一個更安全的動態方法。幸好,iptables 和內核 2.4 提供了啟用動態、有狀態過濾所需要的一切條件。 第四章 有狀態防火牆 狀態基礎知識 與其在基於靜態協議特征的防火牆上開一個洞,還不如使用 Linux 新的連接跟蹤功能來使防火牆根據包的動態連接狀態做出判定。conntrack 通過將每個包與一個獨立的雙向通信信道或連接相關聯來進行判定。 例如,設想一下,當使用 Telnet 或 ssh 連接遠程機器時會發生什麼情況。如果查看包級的網絡通信流,您所看到的許多包從一台機器傳遞到另一台機器。但是,從更高級別的角度看,這種包交換是您的本地機器與遠程機器之間的雙向通信信道。傳統(過時)的防火牆只看到獨立的包,並沒有看出它們實際上是一個更大的整體(連接)的一部分。 conntrack 內幕 那正是產生連接跟蹤技術的原因。Linux 的 conntrack 功能可以“看到”正在發生的更高級別的連接,從而將 ssh 會話看作是單一的邏輯實體。conntrack 甚至可以將 UDP 和 ICMP 包交換看作是邏輯“連接”,即使 UDP 和 ICMP 實際上是非連接方式;這是非常有用的,因為它可以讓我們使用 conntrack 來處理 ICMP 和 UDP 包交換。 如果已經重新啟動,並且正在使用支持 netfilter 的新內核,那麼通過輸入 "cat /proc/net/ip_conntrack" 可以查看您的機器參與的活動網絡連接。即使沒有配置防火牆,Linux 的 conntrack 功能也可以在幕後工作,跟蹤您的機器參與的連接。


NEW 連接狀態,第 1 部分 conntrack 不僅能識別連接,它還可以將它看到的包分成四種連接狀態。我們將要討論的第一種狀態叫作 NEW。輸入 "ssh remote.host.com" 時,初始包或源自於您的機器並要發送到 remote.host.com 的包都處於 NEW 狀態。但是,即使只從 remote.host.com 接收到一個應答包,那麼就立即不再將其它作為此連接的一部分、發送至 remote.host.com 的包看作是 NEW 包。因此,只有在建立新連接、並且還沒有從遠程主機接收到通信流時使用的包才被看作是 NEW(當然,這個包是此特定連接的一部分)。 NEW 連接狀態,第 2 部分 我們已經描述了外出 NEW 包,但還有可能會有進入 NEW 包(很常見)。進入 NEW 包通常來自遠程機器,在啟動與您的連接時使用。您的 Web 服務器接收到的初始包(作為 HTTP 請求的一部分)將被看作是進入 NEW 包;但是,只要您應答了一個進入 NEW 包,所接收到的與此特定連接相關的其它包都不再被看作是處於 NEW 狀態。 ESTABLISHED 狀態 一旦連接看到兩個方向上都有通信流,與此附加相關的其它包都被看作處於 ESTABLISHED 狀態。NEW 和 ESTABLISHED 之間的區別很重要,我們稍後將做討論。 RELATED 狀態 第三種連接狀態類別叫作 RELATED。RELATED 包是那些啟動新連接,但有與當前現有連接相關的包。RELATED 狀態可以用於調整組成多重連接協議(如 FTP)的連接,以及與現有連接相關的錯誤包(如與現有連接相關的 ICMP 錯誤包)。 INVALID 狀態 最後是 INVALID 包 -- 那些包不能歸入以上三種類別。應當注意某個包是否被看作是 INVALID,因為這種包不會被自動廢棄;因此您需要插入適當的規則,並設置鏈策略,以便可以正確處理這些包。 添加有狀態規則 好,我們已經掌握了連接跟蹤,現在來看一下能夠使這個沒有功能的防火牆變得非常有用的一個附加規則: iptables -P INPUT DROP iptables -A INPUT -i ! eth1 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 規則如何工作 當輸入到現有 INPUT 鏈的末端時,這個單一規則可以讓我們建立與遠程機器的連接。其工作方式如下。假設我們要 ssh 到 remote.host.com。輸入 "ssh remote.host.com" 之後,我們的機器發送出一個包來啟動連接。這個特定包處於 NEW 狀態,防火牆允許它外出,因為我們只阻攔進入防火牆的包,而不是外出的。 當收到來自 remote.host.com 的應答包時,這個包沿著我們的 INPUT 鏈流動。它不匹配第一個規則(因為它來自 eth1),因此它繼續移動到下一個,也是最後的規則。如果它匹配此規則,則接受它,如果不匹配,則它會落到 INPUT 鏈的末端,並對它應用缺省策略 (DROP)。那麼,這個進入應答包會被接受,還是會落到底呢? 答:被接受。當內核檢查這個進入包時,它首先認出這個包是現有連接的一部分。然後,內核需要判定這是 NEW 還是 ESTABLISHED 包。由於這是個進入包,它查看這個連接是否有外出通信流,結果發現有外出通信流(我們發送的初始 NEW 包)。因此,這個進入包被歸入 ESTABLISHED 類,就象其它接收到或發送的與此連接關聯的包。 進入 NEW 包 現在,考慮一下如果遠程機器上的某個人嘗試 ssh 到我們的機器,會發生什麼情況。我們接收到的初始包屬於 NEW 類,它不匹配規則 1,因此它前進到規則 2。由於這個包處於 ESTABLISHED 或 RELATED 狀態,它將跌落到 INPUT 鏈的末端,於是將對它應用缺省策略 DROP。進入 ssh 連接請求將被刪除,而且沒有我們的應答(或 TCP 復位)。 幾乎完美的防火牆 那麼,目前我們的防火牆怎麼樣?如果您不要因特網上的任何人與您連接,但又需要連接到因特網上的站點,那麼此防火牆非常適用於膝上型計算機或工作站。您可以使用 Netscape、konqueror、ftp、ping,執行 DNS 查找及更多操作。您啟動的任何連接都將返回到防火牆。但是,任何來自因特網的未經請求的連接都將被刪除,除非它與您啟動的現有連接相關。只要不需要對外提供任何網絡服務系統,那麼它就是個幾乎完美的防火牆。 基本防火牆腳本 以下是一個簡單腳本,它可以用於建立/拆毀第一個基本工作站防火牆: #!/bin/bash # A basic stateful firewall for a workstation or laptop that isn running any # network services like a web server, SMTP server, ftp server, etc. if [ "$1" = "start" ]

then echo "Starting firewall..." iptables -P INPUT DROP iptables -A INPUT -



Copyright © Linux教程網 All Rights Reserved