前言 防火牆在校園內一直被認為陌晦高深,很少有系管師有勇氣進行計劃性的實驗,基本上這份講義也可以當成測試報告來閱讀,是筆者秉持我不入地獄、誰入地獄的精神,冒著生命危險,蠻干出來的成果,也藉此拋磚引玉,希望能帶動國內能力高於筆者許多的眾家高手,一起來進行有利於校園網絡的公益研究!
一、什麼是防火牆 防火牆是一套能夠在兩個或兩個以上的網絡之間,明顯區隔出實體線路聯機的軟硬件設備組合。被區隔開來的網絡,可以透過封包轉送技術來相互通訊,透過防火牆的安全管理機制,可以決定哪些數據可以流通,哪些資料無法流通,藉此達到網絡安全保護的目的。 防火牆產品可以概略歸類為硬件式防火牆和軟件式防火牆,但實際上無論是硬件式或軟件式防火牆,它們都需要使用硬件來作為聯機介接,也需要使用軟件來設定安全政策,嚴格說兩者間的差別並不太大。我們只能從使用的硬件與操作系統來加以區分,硬件式防火牆是使用專有的硬件,而軟件式防火牆則使用一般的計算機硬件,硬件式防火牆使用專有的操作系統,而軟件式防火牆則使用一般的操作系統。 防火牆依照其運作方式來分類,可以區分為封包過濾式防火牆 (Packet Filter) 、應用層網關式防火牆 (Application-Level Gateway,也有人把它稱為 Proxy 防火牆)、電路層網關式防火牆 (Circuit-Level Gateway)。其中被廣為采用的是封包過濾式防火牆,本文要介紹的 iptables 防火牆就是屬於這一種。 封包過濾是最早被實作出來的防火牆技術,它是在 TCP/IP 四層架構下的 IP 層中運作。封包過濾器的功能主要是檢查通過的每一個 IP 數據封包,如果其標頭中所含的數據內容符合過濾條件的設定就進行進一步的處理,主要的處理方式包含:放行(accept)、丟棄(drop)或拒絕(reject)。要進行封包過濾,防火牆必須要能分析通過封包的來源 IP 與目的地 IP,還必須能檢查封包類型、來源埠號與目的埠號、封包流向、封包進入防火牆的網卡接口、TCP的聯機狀態等數據。 防火牆由於種種理由價格一直居高不下,對於貧窮的中小學來講要采購一台防火牆,簡直是不可能的任務,而由於 Linux 的風行,使用 Linux 來充作軟件式防火牆,似乎是不錯的解決之道,本文擬介紹以 Linux 上最新最強大的 iptables 防火牆軟件,建置出適合學校使用的過濾規則,讓缺錢的學校能有一套好用的防火牆來看守校園網絡的大門。
二、Linux 防火牆演變簡史 Linux 最早出現的防火牆軟件稱為 ipfw,ipfw 能透過 IP 封包標頭的分析,分辨出封包的來源 IP 與目的地 IP、封包類型、來源埠號與目的埠號、封包流向、封包進入防火牆的網卡界面......等,並藉此分析結果來比對規則進行封包過濾,同時也支持 IP 偽裝的功能,利用這個功能可以解決 IP 不足的問題,可惜這支程序缺乏彈性設計,無法自行建立規則組合(ruleset)作更精簡的設定,同時也缺乏網址轉譯功能,無法應付越來越復雜的網絡環境,而逐漸被淘汰。 取而代之的 ipchains,不但指令語法更容易理解,功能也較 ipfw 優越;ipchains 允許自訂規則組合(ruleset),稱之為 user-define chains,透過這種設計,我們可以將彼此相關的規則組合在一起,在需要的時候跳到該組規則進行過濾,有效將規則的數量大幅縮減,以往 ipfw 僅能進行循序過濾,導致規則又臭又長的毛病,就不藥而愈了。除了這個明顯的好處以外,ipchains 並能結合本身的端口對應功能和 redir 程序的封包轉送機制,模擬出網址轉譯的能力,而滿足 NAT 的完整需求,堪稱為一套成熟的防火牆作品。 防火牆軟件的出現,確實曾經讓駭客們晚上睡不著覺,因為防火牆的阻隔能夠有效讓內部網絡不設防的單機不致於暴露在外,也能有效降低服務器的能見度,減少被攻擊的機會,駭客過去所用的網絡探測技術因此受到嚴格的挑戰,越來越多的攻擊對象躲藏在防火牆後方,讓駭客難以接近,因此必須針對新的情勢,研究出新的探測技術,藉以規避防火牆的檢查,達到發現目標並進而攻擊入侵的目的,新的技術非常多,本文並不擬進一步討論,請自行參考 CERT 組織的技術文件,網址是 www.cert.org ,想看中文請連到 www.cert.org.tw。 iptables 作為 ipchains 的新一代繼承人,當然也針對駭客不斷推陳出新的探測技術擬出一些因應之道,那就是對封包的聯機狀態,作出更詳細的分析,例如:是否為新聯機或響應封包、是否為轉向聯機、聯機是否失去響應,聯機時間是否過長......等等,透過這樣的分析能對一些可能被駭客利用的弱點加以阻隔(請詳見後文的說明),另外也開發出真正的封包改寫能力,不需要透過其它程序的協助來仿真網址轉譯,除此之外,iptables 也獲得系統核心的直接支持,不需要像 ipchains 那樣需要自行重新編譯核心。 iptables 優越的性能使它取代了 ipchains,成為網絡防火牆的主流,而 ipchains 並未被淘汰,目前 ipchains 已經轉型成單機防火牆,在安裝新版 Linux 時,會自動被安裝啟用,以保護單機上未被使用的通訊端口。
三、iptables 防火牆概論 iptables 防火牆的指令非常類似於 ipchains,使用過 ipchains 的人應該很容易上手,但是 iptables 的機制與 ipchains 有很大的不同,使用 ipchains 的概念來設定規則,將會使防火牆無法正常運作。ipchains 跟 iptables 最大的不同在於對 INPUT、FORWARD 、OUTPUT 三個網絡函式的定義不同,這三個網絡函式是 TCP/IP 驅動程序的一部分,結構如下圖所示,是介於網卡驅動程序和應用程序的中間,Linux 核心預設會啟用 INPUT、OUTPUT 和 LOOPBACK,而 FORWARD 函式則必須自行啟用,可以使用下面指令,或直接修改 /etc/sysconfig/network 組態檔: echo "1" > /proc/sys/net/ipv4/ip_forward 左圖為 ipchains 概念下的運作圖 從上圖可以知道 ipchains 如何處理封包的流動,分述如下: • IP INPUT:所有封包都由 IP INPUT 函式負責處理,所以設定過濾規則時,幾乎都是設定在 INPUT 規則煉上。 • IP FORWARD:目的 IP 非本機的 IP,這些封包需要進一步作轉送處理,此函式用來處理 IP 偽裝和 Port 轉送。 • IP OUTPUT:所有流出的封包都由這個函式處理,通常不需設定任何規則。 iptables 除了上述三支函式以外,還使用兩個新的函式:Prerouting、Postrouting。現在來比較一下 iptables 的運作模式(loopback 接口與上圖相同,所以省略不畫): 從上圖可以知道 iptables 如何處理封包的流動,分述如下: • IP INPUT:只有要到達本機的封包才會 由 INPUT 函式處理,所以會讓來自內部網絡的封包無條件放行,來自外部網絡的封包則過濾是否為 響應封包,若是則放行。 • PREROUTING:需要轉送處理的封包由此函式負責處理,此函式用來做目的地 IP 的轉譯動作(DNAT)。 • IP FORWARD:所有轉送封包都在這裡處理,這部分的過濾規則最復雜。 • POSTROUTING:轉送封包送出之前,先透過這個函式進行來源 IP 的轉譯動作(SNAT)。 • IP OUTPUT:從本機送出去的封包由這個函式處理,通常會放行所有封包。 iptables 和 ipchains 都可以自行定義規則群組(rule-set),規則群組被稱為規則煉(chains),前面所描述的函式,也都有相對應的規則煉(INPUT、FORWARD、OUTPUT、Prerouting、Postrouting),為了有別於自行定義的規則煉,這些規則煉我們就稱為內建規則煉,其運作流程仿真如下圖: 從上面兩張假想圖,學員們不難了解 ipchains 為什麼要叫做 chains,因為它是將所有規則串接成一個序列逐一檢查過濾,就像一條鐵鏈一樣一個環接一個環,在過濾過程中只要符合其中一條規則就會立即進行處理,如果處理動作是跳到某個規則群組,則繼續檢查群組內之規則設定,但如果處理動作是 ACCEPT、REJECT、DROP、REDIRECT 或 MASQUERADE,則會中斷過濾程序,而不再繼續檢查後面的規則設定,在這樣的結構之下,有時候規則順序的對調會產生完全相反的結果,這一點在設定防火牆時不能不謹慎。 而 iptables 是采用規則堆棧的方式來進行過濾,當一個封包進入網卡,會先檢查 Prerouting,然後檢查目的 IP 判斷是否需要轉送出去,接著就會跳到 INPUT 或 Forward 進行過濾,如果封包需轉送處理則檢查 Postrouting,如果是來自本機封包,則檢查 OUTPUT 以及 Postrouting。過程中如果符合某條規則將會進行處理,處理動作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,還多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些處理動作不會中斷過濾程序,某些處理動作則會中斷同一規則煉的過濾,並依照前述流程繼續進行下一個規則煉的過濾(注意:這一點與 ipchains 不同),一直到堆棧中的規則檢查完畢為止。透過這種機制所帶來的好處是,我們可以進行復雜、多重的封包過濾,簡單的說,iptables 可以進行縱橫交錯式的過濾(tables)而非煉狀過濾(chains)。 雖然 iptables 為了擴充防火牆功能,而必須采用比較復雜的過濾流程,但在實際應用時,同一規則煉下的規則設定還是有先後順序的關系,因此在設定規則時還是必須注意其中的邏輯。
四、訂定校園網絡安全政策 在實際設定防火牆之前,我們必須根據校園網絡的安全需求,先擬定一份安全政策,擬定安全政策前必須搜集以下資料: 1. 找出需要過濾保護的服務器 2. 條列出被保護的服務器將提供何種網絡服務 3. 一般工作站,需要何種等級的保護 4. 了解網絡架構與服務器擺放位置 根據這些數據,我們可以決定安全政策,以石牌國小為例: 1. 校內使用 NAT 虛擬網絡,IP 數量需要兩組 C,所有 IP 均需作 IP 偽裝 2. 校園內安全