加入RUN!PC粉絲團
最近新增的精選文章
 
最多人點閱的精選文章
 
 
精選文章 - 中小企業專區
分享到Plurk
分享到FaceBook
 
Linux下的防火牆(基礎篇)
文‧圖/Sylar 2011/7/26 下午 04:49:07

RedHat體系下的分支套件-包括RedHat、CentOS與Fedora,使用iptables作為預設防火牆套件。該套件來自netfilter.org專案,netfilter.org除防火牆外亦提供相當多與網路(封包處理)相關的應用,其iptables的功能除了用來作為本機防護,亦足以擔任獨立防火牆軟體、防堵不應該進來或出去的封包,以及建立封包控管。內建的域名轉換(NAT;network address translation)功能選項也是坊間常見的應用方式。域名轉換即為大家所熟知的轉址功能,通常是用來建立外部網際網路IP位址與內部網路裡的虛擬IP位址間的對應關係,避免外部網路的主機直接連線到內部重要主機,尤其是提供服務且存有重要資料的那些系統。

防火牆的設定對系統與網路管理人員來說並非輕鬆的事,除了對網路架構與封包運作模式要有一定程度的瞭解外,各種防火牆應用的設定亦有其規則必須遵循,這對一般使用者而言就更吃力了,因此本文先自容易入門的圖形介面(GUI)防火牆設定『Firewall Builder』切入,再介紹底層實際運作的防火牆套件『iptables』。
圖形界面防火牆設定
Firewall Builder是一套多功能的防火牆設定應用程式。其容易瞭解的圖形介面優勢,以及內建的上百種規則,讓各種技術層級的人能夠在最短時間為系統建立防護。
防火牆的規則訂定,必須對網路與通訊協定等專業知識有所瞭解,但以Linux為桌面環境的使用者多半不具備這樣的能力。事實上,在作業系統安裝時,便可以勾選防火牆等級,設定低、中或高階,安裝之後也可以在管理選單中以勾選的方式加入分支套件已預設好的常用服務進行開通或阻擋。對於想進一步瞭解防火牆設定的使用者,或對系統防護有特殊需求的系統與使用者而言,可以透過圖形界面(例如Gnome或KDE)完成這些設定。圖形介面的防火牆設定軟體FirewallBuilder,可以讓新手快速入門,對熟於網路規則的系統或網路管理者來說,更能靈活運用、事半功倍,省去因手誤錯置設定或解除不明狀況所產生之問題的時間。
▲Firewall Builder可管理多重防火牆(圖片取自官網)

.Objects(物件):Firewall Builder建立在物件的基礎上。使用者為IP網路、IP位址建立物件,再將這些物件用在防火牆規則上,以物件來表示它們。
.Libraries(函式庫):物件會存放在函式庫裡,Firewall Builder預設物件有二:User與Standard,分別儲存使用者建立(User)的物件與預先定義好的標準(Standard)物件,例如TCP與UDP服務物件,標準物件為系統內建的唯讀函式庫。
.Compile(編譯):建立防火牆規則的Policy後,必須執行Policy編譯。這個動作會將你在Firewall Builder裡制定的規則轉換成目標防火牆平台的命令語法,只要更動過防火牆的規則就必須重新編譯它。

由編譯概念可得知,透過Firewall Builder完成的防火牆組態,可編譯為各種系統或設備專用的語法,再將之套用在需要防火牆規則的平台上,其支援的平台包括Linux iptables、CISCO路由器的存取控制清單(ACL)/ASA/PIX/Firewall Service Module(FWSM)、OpenBSD pf、FreeBSD ipfw與ipfilter以及HP Procurve ACL。使用者可以在這些平台與裝置上,透過Firewall Builder建置一套自已的防禦規則,只需要透過幾個簡單的步驟,就可以輕鬆架設客製化的防火牆:
一、建立防火牆
透過New Firewall精靈程式,可以利用預先定義好的範本或使用SNMP探測防火牆介面組態協助定義,也可以匯入現有的防火牆規則,或者以全手動的方式建立新的防火牆。
二、定義物件
如果要客製化防火牆的規則,必須先建立一個與裝置、網路以及使用的服務相符的物件。Firewall Builder有上百個預先定義好的物件,例如提供TCP服務的HTTP、FTP等,若你用SNMP探測出它們,Firewall Builder就會自動依防火牆規則為你建立物件。
三、設定防火牆策略
預先定義的防火牆範本含括了基本的規則,可以使用者需求修改成想要的設定,除此之外,也可以自建一套防火牆策略、使用新建立的物件,組態符合網路與環境需求的規則。
四、編譯規則
編譯規則可產生防火牆規則的組態檔,這個組態檔裡將會擁有與防火牆平台型態相符的正確語法。編譯的過程中,Firewall Builder會檢查規則是否有錯誤,再產生最佳化後的指令。
五、進行組態檔的佈署
可以用內建的安裝功能,將產生的組態檔放到目標裝置裡,或者手動佈署組態檔。若目標裝置在遠端,Firewall Builder會以安全連線的方式(SSH與SCP)執行必要的傳輸動作。

安裝Firewall Builder
Fedora系統下的安裝,可以在yum的軟體倉儲設定目錄下(通常是/etc/yum.repos.d/)加入Firewall Builder的yum設定,內容如下:
-----box-----
[fwbuilder]
name=Firewall Builder
failovermethod=priority
baseurl=http://packages.fwbuilder.org/rpm/stable/fedora-$releasever-$basearch
enabled=1

[fwbuilder-testing]
name=Firewall Builder Test Builds
failovermethod=priority
baseurl=http://packages.fwbuilder.org/rpm/testing/fedora-$releasever-$basearch
enabled=0
-----end-----

再匯入金鑰:
-----box-----
wget http://www.fwbuilder.org/PACKAGE-GPG-KEY-fwbuilder.asc => 取回金鑰
rpm --import PACKAGE-GPG-KEY-fwbuilder.asc => 匯入金鑰
-----end-----

即可透過指令『yum install fwbuilder』安裝Firewall Builder。安裝完成後,可於『系統/管理』清單下,找到Firewall Builder項目開始建立新的防火牆規則或匯入已存在的規則查看並修改之。
要提醒的一點是:對系統與網路管理者而言,應該要能夠在沒有圖形界面輔助下完成防火牆規則設定,因為實務上在提供服務的Linux系統裡經常省去圖形介面的安裝,且網路狀態變化萬千,深入瞭解這些規則才能夠讓防火牆與各種不同的企業需求密切配合,在必要時彈性運用、解決問題。
防火牆套件iptables
隸屬於netfilter.org組織下的iptables,主要功能為網路封包過濾與轉址。在RedHat體系下的分支套件多半預設以此為防火牆套件,在大部份分支套件下,亦可手動透過套件管理程式自軟體倉儲處下載安裝iptables。
設定檔與選項
套件iptables的主要組態檔為iptables(通常置於/etc/sysconfig目錄下)。其內容是根據使用者安裝時所選擇的防火牆等級,或於安裝後與其它通訊協定的客製化設定所決定。


▲ iptables簡單組態檔範例



範例組態檔設定說明:<br /> .filter:filter是iptables預設的table,含括三個內建的『鏈(chaines)』:INPUT(處理目的地為本機端點的封包)、FORWARD(處理路由經過這台機器的封包)與OUTPUT(處理本機產生的封包)。
除filter外,iptables還提供轉址用的NAT table(由PREROUTING、OUTPUT與POSTROUTING三個內建元件組成)、改寫封包的MANGLE table,以及與連線追蹤有關的RAW table。
.-A:語法為-A chain <規則定義>。針對指定的chain,加入處理的規則,例如在INPUT鏈裡,針對進來的封包為新建立連結的狀態時,應接受或拒絕,或在FOWRWARD鏈裡,拒絕所有封包。
.-m:意義同--match,語法-m <模組>。例如此規則處理狀態模組,接收到狀態為新連結、已建立連結的封包時,應予以接受或進行下一個判斷。
.--state:指定狀態。透過-m設定使用狀態模組後,可執行狀態的指定,其狀態包括INVALID(此封包非已知連結)、NEW(新建立連結的封包)、ESTABLISHED(雙向已建立連結的封包)、RELATED(建立新連結、但又與已存在之連結有關的封包,例如FTP的資料傳輸)、SNAT(原始來源位址不同於回應的目的地位址)與DNAT(原始的目的地位址不同於回應來源位址)。
.-p:語法為-p <通訊協定>。檢查規則裡或封包裡的特定通訊協定。可指定的通訊協定種類包括了tcp、udp、udplite、icmp、esp、ah、sctp或all(全部),也可以用數字的方式指定:/etc/protocols裡的項目皆可指定,數字0則代表全部的意思,若省略未指定通訊協定亦代表必須相符於所有的通訊協定之意。在通訊協定前加上!(驚嘆號)表示相反。
.--dport:與--destination-port用法同,語法為--dport <通訊埠>。指定的是目標通訊埠,亦可指定一段通訊埠的範圍。服務與通訊協定的對應可參考/etc/services。
.-i:語法為-i <介面名稱>。經由INPUT、FORWARD與PREROUTING鏈(chains)接收封包的介面名稱。在名稱後面加上+(加號)可以指定所有以此開頭的名稱,若省略此選項,則所有介面名稱皆為相符的狀況。
.-j:語法為-j <指標>。指定此規則套用的指標,例如當封包相符於規則裡所訂定的條件時,應接受或拒絕或執行其它動作。指標可以是使用者定義的鏈、可以是內建特定的指標等等。若省略這個選項的設定,那麼與規則相符的封包將不會作任何處理。

命令列下的iptables
在命令列下使用iptables,可令規則套用在『當下』的系統狀態下,語法與上述組態檔類似,例如:允許每個用戶端主機最多可以擁有兩條telnet連結:
-----box-----
# iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT => 於命令列添加一條防火牆規則
# service iptables status => 查看當下防火牆規則
<略>
7 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:23 flags:0x17/0x02 #conn/32 > 2 reject-with icmp-port-unreachable
-----end-----

Fedora系統下,使用service iptables status可以查看防火牆的『狀態』。不同於其它服務僅顯示停止或啟用等,iptables在此會詳細顯示防火牆當下對封包進行什麼樣的處理。由於iptables的指令可於命令列上執行,套用在當下防火牆規則上,因此不見得與組態檔裡的固定設定相符,管理者必須留意在命令列執行過的iptables規則,如測試成功,應寫入組態檔中,避免因『系統重開機』或『iptables服務重新啟動』後該規則不被套用,反之,透過命令列擋掉的連結,若確定為惡意來源也應該寫入組態檔,避免下次重開機後再度允許該連結。

結論
在防火牆領域,即便是最基礎理論與應用,也並非幾篇文章三言兩語能說得清。僅守『沒必要開啟的服務就停用、用不到的通訊埠就關閉』的原則,可以大大減低問題發生的機率。就系統與網路安全而言,防火牆也僅為其中一環,更安全的使用環境除了仰賴網路與資訊安全人員時時關心與更新最新資訊,還需要使用者良好習慣的配合。