不必擔心iptables設定繁複 防火牆設定簡化套件─ufw

2008-12-25
若想要自行架設網站,最好安裝一套防火牆設備,以免遭到駭客的侵擾。但是Linux內建的iptables防火牆套件,指令與參數十分繁複,使用上非常不便。建議採用本文所介紹的ufw(Uncomplicated Firewall),它是iptables防火牆的前端處理與設定介面,操作將會輕鬆不少。
Linux的用途相當多元化,幾乎各種想得到的場合,都有人採用Linux當作電腦或其他設備的作業系統。對於一般公司行號的網路管理者或是市井小民而言,採用Linux的最大理由,就是能以最低的費用架設網站。無論是對外的官方網站、部落格、FTP或是線上討論區,都可以使用Linux直接完成。

不過在網路攻擊事件頻傳的今天,自行架設網站若沒有進行任何防護措施,幾乎等於是直接將網站的資料內容拱手送人。一些公司或組織即使採用了相當多的防禦措施,還是不免會被駭客入侵。由此可見,如果以Linux架設網站卻又不加以思考網路安全的問題,對於電腦系統本身將會造成多大的危害啊!

資金較為充裕的公司行號,可能會直接採購專業的硬體防火牆作為阻隔惡意攻擊的第一道防線。但對於一般人而言,在無法負擔專業設備的高昂售價情況下,只好想辦法在作業系統上執行軟體防火牆,期望可以發揮一些阻絕作用。目前大多數的Linux發行版本都會提供防火牆軟體,讓使用者可以設定並作為系統安全最基本的防護措施。其中最廣為人知並被大量採用的,多半便是iptables這套防火牆軟體。

Linux核心在2.4的時期,使用的防火牆為ipchains。而2.6系列的核心則是使用iptables。如今大多數的發行版本預設都是使用2.6系列版本的核心,所以大多數的Linux防火牆都是使用2.6系列核心所支援的iptables機制。利用iptables設定防火牆,可以在網路安全上提供十分強大的保護功能。但是iptables的指令與參數十分繁複,不但不容易記憶,一不小心也可能會下錯參數造成設定錯誤的問題。例如設定iptables時須先指定表格名稱,然後要定義規則所屬的規則鏈。

光是理解這些基本的名詞,可能已經花費不少時間,實際進行設定,可能還得經過多次的錯誤嘗試,才能徹底了解規則的設定方式。這樣的問題會讓初學者相當困擾,尤其是已經習慣圖形介面的使用者,在面臨文字介面的操作方式時,通常已經覺得很恐懼。如果指令過於複雜,更可能拉長學習的時間形成瓶頸。

有鑑於此,強調易學易用的Ubuntu,從上一個版本8.04版開始,內建提供一套名為ufw的程式。ufw即為「Uncomplicated Firewall」的縮寫,直譯則是「不複雜的防火牆」。雖然名為防火牆,但事實上ufw本身並不是防火牆軟體,而是一套iptables防火牆的前端處理與設定介面。ufw同時也支援套件整合與已開啟通訊埠的動態偵測,同時顧及使用上的便利性與功能性。

應用場合

ufw可以同時應用在一般較為單純的桌面操作環境,或是在伺服器用途上。如果有需要的話,甚至可以在叢集系統中利用ufw進行防火牆設定。舉例而言,桌面系統會有使用防火牆作為基本防護的用途。當新軟體被安裝時,使用者即可利用ufw進行簡單的防火牆設定,以開啟這些軟體所提供的網路服務。在伺服器用途的主機上,則可以使用ufw設定防火牆,以便隨時監控已開放連線的通訊埠及其相關狀態。至於叢集系統,則可以在需要安裝特定程式時啟用ufw的防火牆設定,以便讓叢集中不同主機可以同時存取此應用程式。

ufw可以讓使用者以明確的方式指定通訊埠的開放或關閉狀態,而為了可以完全與系統進行整合,設定防火牆與應用程式互動時,這些應用程式最好能夠提供相關資訊以指明會使用的通訊協定和通訊埠號。但即使應用程式不提供這些資訊,也不會影響ufw的運作,因為ufw仍然可以直接由使用者進行相關資訊的指定動作,不一定非要從應用程式取得不可。

基本原則

由於防火牆的設定通常是依照規則的先後順序進行套用,如果套用成功,便不再檢查後續規則,所以在安排防火牆規則時需要特別小心,以免設定錯誤而發生預期外的狀況。例如原先想開放所有人存取WWW服務,但將IP 1.2.3.4排除在外。正確的設定方式是,先指定IP 1.2.3.4不得存取WWW服務,後面再加上所有人都可以存取WWW服務的設定。如果順序相反,則所有人都可以存取WWW服務的規則會先被套用,此時即使是IP 1.2.3.4前來要求WWW服務的連線,也會因為合乎規則而連線成功。

另外一點要注意的是,設定防火牆時最好人就在主機前面,或是可以立即回到主機前進行操作的地方。這是因為防火牆設定只要一個設定錯誤,很可能會立即阻擋所有連線,造成系統管理員無法再次以遠端連線方式連接主機進行修改的問題。

對於這一點,ufw提供了相當友善的功能支援,也就是在啟用防火牆之前,即可先行增加規則以避免錯誤發生。如果非要使用遠端連線方式進行防火牆設定與操作,先執行「sudo ufw allow proto tcp from any to any port 22」指令,再開啟防火牆。如此一來,因為已經先打了預防針(SSH通訊協定預設使用的TCP port 22已經開啟),便不至於發生使用者無法連回主機的憾事發生。

有人可能會覺得納悶,一般啟用防火牆時不是會先清除防火牆規則嗎?為什麼ufw可以先行設定規則再啟用防火牆?這是因為ufw在啟用時並不會清除防火牆規則,加入或移除規則時也不會先清除防火牆規則。但在修改規則或改變防火牆的預設政策時,防火牆規則將會事先被清除,這一點需要特別注意。

ufw其實是iptables-restore指令的前端介面,所有規則都會存放在「/etc/ufw/before.rules」、「/etc/ufw/after.rules」與「/var/lib/ufw/user.rules」等檔案。通常並不需要修改「/etc/ufw/before.rules」與「/etc/ufw/after.rules」檔案,但如果真有需要,使用者也可以直接修改before.rules、after.rules檔案。這兩個檔案的文法格式為標準的iptables-restore格式,所以如果想修改這兩個檔案,最好先確定自己已經理解iptables-restore指令的格式。

▲ufw的規則設定檔放置於「/etc/ufw/」與「/var/lib/ufw」目錄中

ufw所設定的防火牆會依照「before.rules→user.rules→after.rules」的順序執行命令,所以如果希望正確設定防火牆的行為模式,必須依照先後的套用關係決定規則放置的檔案位置。但因為一般並不需要修改before.rules與after.rules,所以使用者可以將重點放在user.rules身上。

ufw也支援IPv6,其相關的設定檔則是「/etc/ufw/before6.rules」、「/etc/ufw/after6.rules」、「/var/lib/ufw/user6.rules」等等。這些檔案的套用順序與IPv4的檔案相同,一樣是「before6.rules→user6.rules→after6.rules」。

ufw也提供狀態查詢指令,此指令只會顯示ufw本身所加入的規則,並不會顯示「/etc/ufw/」目錄下的設定檔案內容。「/etc/ufw/sysctl.conf」檔案則是ufw在系統啟動時會讀取的設定檔,決定開機時是否直接啟用ufw。此設定還會在後面討論ufw指令時進行說明。

預設政策

ufw的防火牆設定內有一些預設政策,如果使用者沒有修改過這些政策,便會以ufw預設的機制進行管理。這些預設政策包括:

1. 所有本地迴路的封包都設為可接受(不阻擋封包的傳遞)。
2. 所有對外封包都會被接受。
3. 內送封包預設為可接受。
4. 被丟棄的封包會被記錄。
5. 安裝時防火牆並不會啟用。

ufw操作說明

ufw本身是以命令列介面進行操作,且由於防火牆設定需要root權限才能進行,所以在執行所有ufw設定命令時,須先以sudo指令取得超級使用者權限。如果打算連續執行ufw命令,但覺得每一行ufw指令前方都得加上sudo指令有些麻煩,也可先執行「sudo -i」命令切換至root身分,再繼續後續動作。

實際設定ufw之前,可以在ufw的參數列中加入「--dry-run」參數,表示這一行設定僅為測試用途,只顯示指令執行結果但並不實際修改防火牆的設定。執行ufw的防火牆設定之前,必須啟用ufw,其指令為「ufw enable」。若要關閉ufw,命令則為「ufw disable」。ufw的啟用或關閉其實便是修改前面所提及的「/etc/ufw/sysctl.conf」檔案。設定為啟用時,「/etc/ufw/sysctl.conf」檔案內的ENABLE選項會被設定為「yes」,反之則設定為「no」。若需要啟動ufw的記錄功能,可以執行「ufw logging on」命令,停止記錄時則是使用「ufw logging off」。

▲使用「--dry-run」參數可顯示指令執行結果

ufw可以直接設定內送封包的處理政策,也就是「default」指令。如果設定為「ufw default allow」,即表示系統預設接受所有內送封包,符合額外設定的規則才會阻擋。若是設定為「ufw default deny」,則所有內送封包預設都會被阻擋,只有符合另行設定的規則的時候,才會被傳送至主機內部。

如果系統已開啟特定服務,可以直接使用ufw設定此服務是否對外開放。設定服務有兩種方式,比較簡單的方法為直接輸入「ufw allow|deny <service>」,其中allow表示此服務對外開放,deny則是拒絕外部存取。即為服務的名稱或是通訊埠編號,例如www或80都是相同的意思。如果服務名稱列在「/etc/services」檔案中,無論直接輸入服務名稱或是通訊埠編號都可以接受。但如果服務名稱並不存在於「/etc/services」檔案中,則只能使用通訊埠編號進行設定。

除了上述兩種方式進行的設定以外,亦可使用「port/protocol」的方式加以設定。例如「80/tcp」即表示針對TCP 80埠進行設定。如果服務程式本身有提供所謂的meta-data,ufw亦可直接以程式名稱作為服務設定值,例如「ufw allow Apache」即表示Apache程式可以接受外部而來的連線。ufw的另一種設定方式則稍微複雜一些,但也不是那麼難以理解。這種方式的設定指令格式如下:

ufw allow|deny [proto <protocol>] [from <address>
[port ]] [to <address> [port <port>]]

與前面的說明相同,allow或deny表示此規則的處理方式。前者允許封包進入主機,後者則是直接將封包丟棄。[proto <protocol>表示要使用的通訊協定為何,若是TCP則設定為「proto tcp」,UDP則是「proto udp」。[from <address> [port <port>]]表示特定來源位址的處理方式,此處的port指的是來源埠號。[to <address> [port <port>]]則與from指令為相反用途,檢查封包的目的位址與埠號是否符合之用。

from或to的位址欄位可以是單一IP位址,也可以用NetMask指定連續位址。例如192.168.1.1表示針對192.168.1.1的處理,192.168.1.0/24則表示是針對192.168.1.0~192.168.1.255共256個位址所進行的處理。

防火牆設定完成後,可以使用「ufw status」指令查看目前防火牆的設定情況。要注意的是,status指令只有在ufw已經啟用的情況下(ufw enable)才有用途,若ufw為disable的情況,則status指令只能用來查詢ufw是否已經被載入。status指令會顯示防火牆規則的來源位址、目的位址與處理動作,執行後即可馬上了解目前整個防火牆的設定與運作狀態。

▲規則設定完成後可以使用status指令查看防火牆目前的設定狀況

套件整合

部分外部套件會提供套件資訊給ufw,讓ufw可以直接取得套件的相關資訊並進行防火牆規則的設定。套件資訊會放置在「/etc/ufw/applications.d」目錄中,其格式類似Windows系統上的INI檔。例如Apache套件的資訊可能會以下列方式儲存:

[Apache]
title=Web Server
description=Apache v2 is the next generation of the
omnipresent Apache web server.
ports=80/tcp

[Apache Secure] title=Web Server (HTTPS)
description=Apache v2 is the next generation of the
omnipresent Apache web servver.
ports=443/tcp

[Apache Full] title=Web Server (HTTP,HTTPS)
description=Apache v2 is the next generation of the
omnipresent Apache web servver.
ports=80,443/tcp

其中ports欄位的表示方式與ufw在命令列環境操作時的使用方式相同,唯一的差別在於,此處只能使用數字表示。事實上,這些套件的相關資訊都會在套件安裝時自動加入,前提是安裝套件時,ufw已經被啟用。

▲經由套件整合的方式,ufw可以直接使用套件名稱設定規則

欲查詢應用程式的相關資訊或是進行設定,可以使用「ufw app」指令進行。如果想知道系統上已安裝的套件為何,可以透過「ufw app list」指令進行查詢。若想了解套件的防火牆相關資訊,可以使用「ufw app info 套件名稱」指令。套件名稱若以all取代,則表示顯示所有套件的相關資訊。如果套件資訊的檔案有經過修改,防火牆本身並不會立即得知,此時須使用「ufw app update 套件名稱」指令通知防火牆。例如套件所使用的通訊埠有所變更,或是通訊協定從TCP變更為UDP等等。

▲app指令可以查詢或設定套件相關的資訊

以套件方式加入規則至防火牆亦有預設政策,其指定方式為「ufw app default 政策」。政策若是allow,表示套件預設規則為允許連接,所以新加入的套件規則都會是開放存取的方式。政策若是設定為deny,則表示套件預設為關閉存取的狀態。設定過套件的預設政策後,使用「ufw app update --add-new 套件名稱」指令,即可更新防火牆裡的套件相關資訊,並同時以套件預設政策新增一條規則。

要注意的是,套件預設政策若未設定,則會是SKIP狀態,也就是封包直接丟棄。如果套件預設政策是SKIP,則執行「ufw app update --add-new 套件名稱」指令時,並不會在防火牆之中新增任何規則。也就是說,「ufw app update --add-new 套件名稱」指令只有在套件預設政策為ALLOW或DENY時才有作用。

刪除規則

使用ufw新增防火牆規則,須視情況決定所需要下達的指令格式與參數。如果某一條防火牆規則已經不再適用,可以考慮將此規則予以移除。在ufw之中,移除防火牆規則的方法是直接在設定規則的命令中加入delete關鍵字。例如「ufw allow proto tcp from 11.22.33.44」的規則,可以使用「ufw allow proto tcp from 11.22.33.44」指令予以移除。

▲在規則前方加上delete指令,即可刪除防火牆規則

由於新增規則時會直接在「/var/lib/ufw/user.rules」(或「/var/lib/ufw/user6.rules」)檔案中新增一行指令,所以如果已經忘記當初新增ufw規則時所執行的指令,也可以直接開啟user.rules檔案,找到相對應的那一行,直接刪除即可。刪除後,切記將ufw關閉(使用「ufw disable」指令),重新設定預設政策(使用「ufw default allow|deny」指令),再重新啟動ufw即可(使用「ufw enable」指令)。因為ufw並不會隨時監視規則設定檔的內容是否有變更,所以要使用這種方式重新啟動ufw,才會讀取最新的設定值。

結語

目前ufw只能設定由外部通往主機內部的連線,還無法設定主機往外連線的防火牆規則。而且一些較為複雜的設定方法,暫時也無法透過ufw來實現。不過,目前ufw的開發團隊正在努力擴充ufw的功能,不久的將來,ufw將可以直接用來進行Router、Gateway等裝置的設定動作,亦可支援NAT設定、QoS等等。即使功能上無法達到滿足所有使用者需求的地步,ufw仍然不失為一項在設定防火牆時不可或缺的好工具。

ufw (Uncomplicated Firewall) 軟體小檔案

軟體版本:1.8.11
軟體性質:GNU General Public License (GPL)
使用限制:無
官方網址:http://wiki.ubuntu.com/UbuntuFirewall
下載網址:內建於Ubuntu 8.04以後版本

點圖放大

追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!