前言
各大企業或是政府機關,為符合有效率的管理以及提升生產率等前提下,持續的e化各種文件及作業流程,同時,在商業利益或是自我優越感等目的的驅使下,駭客入侵、木馬程式及網路病毒和蠕蟲攻擊等動作時有所聞,因而使得網路安全的話題在近年來逐漸地受到各企業及機關的高度重視。

網路安全牽涉的層面相當的廣大,有安全策略原則的訂定,相關應變措施採取,安全設備的種類購置,以及完善的佈署方式等;安全策略原則的訂定及相關應變措施,屬於軟性的觀念,根據企業本質的不同或是預算上的限制,進而影響最終所需的安全設備;對於一位資訊主管而言,需要在有限的預算下,完成網路安全的最佳佈署;對於工程師而言,則需要具備了解各個網路安全設備或軟體技術的知識和技術;因此,Ben哥將會在本雜誌一一介紹各種不同的網路安全設備。首先,就從大家最熟悉的防火牆開始。

本技術文件實驗所需的設備清單如下:
1) Linux機器乙台。

本技術文件實驗所需的軟體清單如下:
1) Linux機器:iptables。本命令的原始碼可於www.netfilter.org下載。

本技術文件讀者所需基本知識如下:
1) 簡單的OSI七層架構。
2) IP網路、廣播位址,子網路遮罩的了解及計算。
3) TCP三向交握及UDP的了解。
4) iptables命令的使用方法。

防火牆的定義
防火牆的英文為Firewall,在我們的生活中,其主要目的為防止火災的蔓延,這與我們在網路上要防止不良的流量,蔓延進入某個我們想保護的網路,在意義上有異曲同工之妙。

以OSI七層的角度來看,一般的防火牆,可以檢視第四層(傳輸層 – Transport Layer)以下的封包內容,也就是Fast Ethernet、IP、TCP或是UDP等通訊協定。

防火牆的種類
防火牆大致上可分為兩種:狀態性 (Stateful)和非狀態性(stateless);非狀態性防火牆可以逐一檢視每一個封包,因此亦可稱之為封包過濾 (packet filter),但卻不能進一步的分析出每個封包之間的關連性;相對的,狀態性防火牆可加以記錄封包內的資料(例如,TCP表頭中的SYN、ACK序號等),以便將不同封包之間的關係串連起來。因此,狀態性防火牆能分辨出不同的連結 (session),以便做更精細的防範。

另外,在近幾年,各防火牆廠商們為了增加單一防火牆的可用性,陸續發展出兩大重要功能:虛擬防火牆 (Virtual Firewall)以及通透式防火牆 (Transparent Firewall 或 Layer 2 Firewall),提供了防火牆的用戶能夠在大型的網路環境中,更簡單快速的佈署防火牆,未來Ben哥將會用Cisco的ASA或是PIX,針對這幾點於專欄中以實作的方式加以介紹!

淺談Linux的防火牆
從核心版本2.2.x的ipchains,到目前以核心版本2.4.x及2.6.x為基礎的iptables,Linux在防火牆上的進步可以說是突飛猛進,ipchains隸屬於非狀態性的防火牆,而iptables則為狀態性防火牆;而且iptables為一個完全重新撰寫的防火牆,與ipchains沒有關連。

因此,Ben哥建議目前使用ipchains來建立防火牆的讀者們,能夠學習並使用iptables的機制,主要有三個原因:
1.iptables為狀態性防火牆。
2.iptables有三個表(filter、nat、mangle)可用來處理各種不同需求的封包。
3.iptables有更多的鏈(chains)可供選擇。

準備Linux的防火牆
有關基礎的防火牆設定,讀者們可以在CCNA或是Linux LPI等相關基礎網路課程中學習到,礙於篇幅限制,Ben哥在此不便多加贅述,如果讀者們有需求的話,可以寄信給Ben哥,Ben哥可以在往後的文章中,作一個詳細的介紹,與讀者們分享設定Linux核心和防火牆的相關命令的經驗。

如何判別目前所使用的核心支援netfilter防火牆呢?

1.檢視dmesg的標準輸出是否包含”ip_”的字串,如果有的話,則表示此核心已支援Netfilter功能。(如下圖)


2.如果Netfilter的功能是以模組的方式存在,則可以檢視/lib/modules/<目前系統使用的核心版本>/kernel/net/ipv4的目錄下,是否有netfilter的目錄。


實驗環境介紹
在Linux Guide第十二期的特別企劃中,Ben哥介紹過如何『實作Cisco路由器與Linux的動態路由』,Ben哥將會以先前的實驗環境為基礎,架設Linux的防火牆。本實驗環境已經包含動態路由,因此路由機制一切無誤。以下為實驗的網路拓墣架構:


實驗環境中有兩台以Linux為平台內建有iptables的路由器,一台為Cisco 2600系列路由器,提供我們將防火牆規則應用於不同的平台上。

Ben哥把每台機器上的路由表列出,方便不會使用動態路由的讀者,也可以手動加入靜態路由使網路暢通無誤,順利繼續下面的實驗。
在Linux_NAT的機器上,由三種命令 (route, netstat, 以及 ip route)所呈現出來的路由表如下圖:


在Cisco 2600系列路由器上的路由表:


在Linux_router的機器上,由三種命令 (route, netstat, 以及 ip route)所呈現出來的路由表:


在此提醒各位讀者,在Linux的機器上,從 ip route的指令輸出結果,才有辦法得知路由是從哪裡以及從何種路由協定學習得來的。

實驗目標
假設我們的實驗為一個中小企業的網路環境,Linux_NAT為該企業對外連接Internet的Linux路由器,Linux_router為連接企業合作夥伴的Linux路由器,因此我們可以根據公司所訂定的網路運行政策或原則,使用Linux的Netfilter來控制網路流量;在此Ben哥簡單的強調一個觀念,防火牆只是一個工具,安全政策則是決定使用何種設備的關鍵。

假設企業的網路安全政策如下:
1.內部員工可以經由Linux_NAT出去到Internet。
2.企業合作夥伴不能經由公司的網路出去到Internet,以確保公司對外頻寬的順暢。
3.企業合作夥伴只能瀏覽公司內部的網頁伺服器 (IP位址 192.168.10.100)。

現在,我們就根據前述的政策,一一的來架構防火牆規則。

1.內部員工可以經由Linux_NAT出去到Internet。
根據 RFC 1918 – Address Allocation For Private Addresses以及IANA (Internet Assigned Number Authority) 的規定,10.0.0.0 – 10.255.255.255、172.16.0.0 – 172.31.255.255、以及192.168.0.0 – 192.168.255.255 皆為私有IP位址 (Private IP Addresses),企業可以在其內部網路中自由設定和使用 (PS:詳細原理請讀者們參閱相關的文件)。基於此,NAT (Network Address Translation)的網路機制勢必需要用到,因此Linux_NAT就必須對經過它而要轉發出去的封包,改變其來源IP位址(Source IP Address),如此,目的地伺服器所回應的封包,才有辦法被路由回來。

(注意:本實驗因為實驗環境的限制,無法使用公共IP位址 (Public IP Address),僅以10.1.32.95的IP作代表,但就NAT的運用角度來看,是完全一模一樣的。)

我們可以從Cisco 2621路由器上ping中華電信的DNS伺服器的IP位址:168.95.1.1(如下圖)。


出現幾個如『•』的符號,就表示不能ping到該IP位址。此時,我們設定規則於Netfilter的nat表中,回頭再看看能不能由Cisco 2621 ping到168.95.1.1。所需命令如下圖所示:


我們再次從Cisco 2621上看能不能ping到168.95.1.1。


出現幾個『!』符號即表示ping到了該IP位址,至此第一項網路政策算是設定好並符合要求了。

2.企業合作夥伴不能經由公司的網路出去Internet,以確保公司對外頻寬的順暢。
以目前的狀況而言,位於企業合作夥伴那一端的網路,是可以經由Linux_NAT端進而出去至Internet,可以由tracert (Windows作業系統的路由循跡命令)來證明。


對於Netfilter而言,封包可以分為input、output、以及forward三種型態,這些型態決定了封包經過核心內部的路徑,從企業合作夥伴端所發出的封包,對Linux_NAT的機器而言是一種「forward封包」,為了不讓合作夥伴網路所發出的封包經過Linux_NAT的機器,必須對Netfilter中的filter表,下丟棄封包的命令。


iptables命令中如果沒有指定對哪一個表下規則時,其預設值為filter表,現在,我們就來試試看,從企業合作夥伴的IP位址為192.168.30.100所發出的封包,是否還能經由Linux_NAT路由器出去到Internet。


tracert顯示封包到達了192.168.30.1(Linux_router)、192.168.20.2(Cisco 2621路由器)、及192.168.10.1(Linux_NAT)三個位址,但是卻在Linux_NAT之後就出不去了,顯示我們剛剛下的Netfilter規則,成功的阻擋了來自企業合作夥伴的網路封包。

除此之外,我們也可以使用Netfilter的紀錄封包功能,紀錄經過封包的狀況,表示封包的確也經過Linux_NAT中Netfilter內,filter表中的FORWARD鏈。


3.企業合作夥伴只能瀏覽公司內部的網頁伺服器 (IP位址 192.168.10.100)。
控管合作夥伴的路由器為Linux_router,所以我們可以在Linux_router下一個防火牆規則,只准合作夥伴存取企業網頁伺服器,但是在還沒下規則前,合作夥伴員工是可以ping到192.168.10.1(Linux_NAT路由器)以及192.168.10.100(網頁伺服器)。


現在,我們於Linux_router下兩道防火牆規則,以限制合作夥伴僅能存取網頁伺服器。


第一道規則:接受(ACCEPT)來源IP位址為192.168.30/24,目的地IP位址為192.168.10.100,通訊協定為TCP,並且目的地連接埠為80的封包。因此,只要符合第一道規則,就不會被下一道規則檢視,可以順利通過;反之不符合第一道規則的封包,只要來源IP位址於192.168.30.0/24的網段,即被丟棄(DROP)。

我們可以由合作夥伴的員工電腦來檢視規則是否正確。首先我們ping不到192.168.10.100,原因是被第二道規則所擋下,但是卻可以使用文字介面的瀏覽器(lynx)來檢視192.168.10.100的網頁。



成功的瀏覽了192.168.10.100所提供的網頁服務。

Linux上防火牆的圖形介面介紹
事實上,如果讀者們不是很熟悉Linux中iptables命令的使用方式,Ben哥在這裡介紹一個不錯的圖形管理程式,就是fwbuilder (http://www.fwbuilder.org/),可以從http://www.fwbuilder.org/nightly_builds/取得讀者們所需要的版本或是原始碼。

Fwbuilder是一個相當有彈性的防火牆圖形介面,它不僅可以產生Netfilter的規則,也可以產生Cisco的FWSM (FireWall Service Module,用於Cisco高階第三層交換機6500及7600系列) 及PIX的規則,更有趣的是,每次我們改變某台機器的設定後,它會使用RCS來做版本控管,相當實用。

以下是一些圖形介面的簡單展示:


以上告訴讀者們fwbuilder所支援的防火牆有:FWSM、ipfilter、ipfw、iptables、PF、PIX。


以上顯示了所支援的作業系統平台:FreeBSD、Cisco FWSM、Linksys/Sevasoft、Linux 2.4/2.6、Mac OS X、OpenBSD、Cisco PIX、Solaris。


以上顯示了fwbuilder相當友善的圖形介面,方便使用者簡單快速的設立防火牆規則。

結論
Linux的強大功能,讓我們能夠輕鬆的結合802.1Q (於Linux Guide第十一期中介紹過)、動態路由 (於Linux Guide第十二期中介紹過)、以及Netfilter狀態性防火牆於一台機器中,藉由一致的通訊協定,達到與商業性網路設備的完善結合,並以最經濟、最穩定以及最方便的方式,提供企業一個整合的網路安全防護解決方案。

礙於篇幅關係,Ben哥無法詳細的交代所有細節,所以較重視幫助讀者們在觀念上的建立;其實這只是Linux實際運用的冰山一角而已,不管在OSI七層中的任何一層,Linux都有強大的支援,功能不勝枚舉,應用產品多不勝多,剩下所需要的也是最重要的,就是讀者們能不能去實地瞭解和發掘而已。