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

就Linux常見的防火牆套件iptables而言,基本上將封包略分為進來的、出去的與經過的三種,這三種類型的封包在iptables裡由各種不同的鏈(chain)進行處理:INPUT鏈處理進入本機的封包、OUTPUT鏈處理由本機出去的封包,而FORWARD鏈則檢查經過本機的封包。
本文將說明,在上述三種情況下,iptables可以修改封包進行網址的轉換(NAT),還可以控管OSI應用層的封包(l7-filter)。最後再就基礎篇已介紹過安裝的Firewall Builder,圖解說明透過範本建立防火牆規則的幾個簡單步驟。
封包轉址NAT
一般情況下,網路封包從來源端(Source)傳到目的端(Destination),是不會也不需要修改封包內容的。但對於有必要轉換網址的連結而言,提供轉址功能的系統就必須能夠修改封包,才能將它傳到真正的目的地,還必須在封包從目的地回傳後能夠再將封包改回來。iptables內建的NAT(Network Address Translation)功能作的就是這樣的事,在iptables的規則裡,NAT歸類為table。
實際應用上會使用到NAT的狀況大致包括了:
一、ISP只給你一個固定或浮動IP位址,但家裡有多台電腦要上網。這時可以透過NAT功能,讓所有人透過它,共用IP位址瀏覽網際網路。
二、多台伺服器共用一個IP。有時是IP位址數量的限制,有時則是為了平衡負載或其它因素。這部份可以參考LVS(Linux Virtual Server)專案,就平衡負載的目的來說,LVS更能提供全面性的功能。
三、通透式代理伺服器,使用proxy程式連結內部網路與外面的世界,讓內部網路以為連結的是外部機器,其實是在與代理伺服器溝通。這部份可參考Squid代理伺服器專案。
NAT的型態大致可以分成兩種:來源轉址(SNAT;Source NAT)與目的地轉址(DNAT;Destination NAT)。顧名思義,來源轉址是變更第一個封包的來源位址,封包偽裝(Masquerading)即為SNAT的型式;目的地轉址變更第一個封包的目的地位置,像是通訊埠轉送、平衡負載與通透式代表伺服器皆為DNAT的型式。設定規則舉例如下:

//將透過eth0網路卡出去(-o)的封包來源位址(SNAT)全改成 1.2.3.4
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
//將自etho網路卡進來(-i)且目的通訊埠為80的封包,目的地位置(DNAT)全改為5.6.7.8且通訊埠為8080
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 5.6.7.8:8080

OSI應用層的處理

netfilter提供OSI第七層(應用層)過濾的功能已行之有年,但是是到近期才越來越多公司行號開始測試其可行性與實作。

應用層過濾套件l7-filter為netfilter套件的一部份,可以應用在Linux上的方式有二種:
.核心版本:自2008年開始,即有人使用此種方式攔截第七層封包,雖然此法存在的時間比較久,但在這種模式下對主機硬體規格要求較高(特指在連線數量很多的IT環境下),而且很容易造成當機。建置過程中需要下載支援相關封包過濾功能的Kernel版本的原始程式碼、iptables原始程式碼及其Patch檔案等。然後自行執行Kernel的編譯、從開啟相關選項開始,再安裝iptables及其patch檔,最後於iptables規則裡啟用layer7模組,再搭配l7proto使用即可。
.Userspace 版本:目前這個版本尚在開發階段,但較容易安裝,也比較不易造成整個系統的當機。其使用全grep-type的GNU正規表示式。這種方式極有可能成為未來的趨勢,由於許多功能目前尚在實驗階段中,因此,強烈建議不要將此套件安裝在提供重要服務的主機上。

Userspace版本實作流程
一、至SourceForge.net網站取得Userspace版本的l7-filter與通訊協定定義套件:
在http://sourceforge.net/projects/l7-filter/files/,分別下載"l7-filter userspace version"與"Protocol definitions"套件。
二、先將l7-filter套件解壓縮並解開打包檔(tar):
執行『tar xvzf l7-filter-userspace-0.11.tar.gz』指令可同時解開打包(tar)壓縮檔,並於解開後的目錄下執行./configure進行安裝組態設定,然後執行make與make install指令執行編譯與安裝。
三、安裝通訊協定定義檔:
將l7-protocols-2009-05-28.tar.gz檔案解開後,再將解開後的目錄更名為l7-protocols,並移至/etc目錄下。
四、檢查系統核心:
2.6.20(含)以上的kernel:至核心組態檔目錄下(例如:/usr/src/kernels/2.6.32.10-44.fc11.x86_64),執行make menuconfig查看核心清單
•Networking→Networking options→Network packet filtering framework (Netfilter)→Core Netfilter Configuration:在"Netfilter connection tracking support"下,選擇"Layer 3 Dependent Connection tracking (OBSOLETE)"。
•Networking→Networking options→Network packet filtering framework→IP: Netfilter Configuration,啟動"Connection tracking netlink interface"。
如果上述兩項設定已存在且勾選,則無須重新編譯核心。否則,請參考核心編譯相關資料。
五、設定l7-filter組態。
傳送封包至l7-filter
iptables <指定table與chain> -j NFQUEUE --queue-num <佇列編號>
NFQUEUE預設為佇列編號0(與l7-filter相同),因此所有透過你的機器傳送予l7-filter的封包都會在佇列編號0:
# iptables -A FORWARD -j NFQUEUE
六、執行l7-filter
# l7-filter -f l7-filter.conf
執行檔l7-filter指定組態檔(-f)為l7-filter.conf

l7-filter在連線時會檢查應用程式的封包資料內容,確定其使用的通訊協定為何,然後為它設定Netfilter標記。一般來說,l7-filter剛收到的封包為未標記(亦即其標記為0)。在l7-filter能夠辯識使用通訊協定為何前,通常會取得數個封包,然後將新的、無法辯識的連線的封包設定為特殊的標記1。最後,若l7-filter仍無法辯識該連線,就會放棄。而在這種情況下,這些封包將會被標記為特殊值2。否則,便是以其組態檔裡所指定的方式進行標記封包。
實際應用
簡單來說,l7-filter是透過標記的方式,將封包作流向的處理。其實際應用包括三種層面:
一、流量統計
透過標記的方式,看哪些類型的封包佔據你網路頻寬的多寡。例如:
# iptables -t mangle -A POSTROUTING -m mark --mark 3
再使用『iptables -L』進行統計。

二、頻寬控制
利用l7-filter的標記功能,管理者可以搭配tc工具程式控制頻寬。tc工具全名為traffice control,是Linux的QoS工具程式,屬於iproute2套件中的一部份。舉例來說,將所有IMAP通訊協定封包標記為3,則可利用以下指令控制IMAP所使用的頻寬:
# tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
使用此指令時必須很清楚你在作什麼,當網路頻寬不大時,請不要作這件事-趨近於零的頻寬,無異於封鎖此通訊協定。

三、阻擋
雖然l7-filter可以作到封鎖應用程式(OSI應用層)的功能,但強烈建議不要這麼使用。因為,每一種通訊協定都有合法使用的理由,就拿IT最頭痛的P2P通訊協定來說,現在已有相當多開放源碼的軟體與合法自由下載的音樂,採用這種更快、更有效率的方式提供大眾下載使用。而當P2P程式回應該通訊埠遭到阻擋時,來源端可以立即採用像是在TCP與UDP之間作切換、每次操作開啟新的連結,或者使用加密方式連線等,甚至採用其它規避阻擋的方式。如此一來,應用程式每次使用的通訊協定都不同,管理者越來越難以辦識這類的通訊協定,另一方面,更是間接鼓勵P2P程式設計師把這些規避『功能』加到程式中,讓IT管理者越來越難管理這些通訊協定。
這裡的建議是:與其阻擋這類的封包,不如利用Linux QoS功能限制這些通訊協定可使用的頻寬,或利用代理伺服器(Proxy)執行控管。

輕鬆利用Firewall Builder建立防火牆規則

Linux下的防火牆(基礎篇)裡介紹了Firewall Builder的安裝流程,本文則是以圖示簡單說明透過此應用程式建立新的防火牆規則只需要幾個步驟便能快速完成。


▲ 建立新的防火牆規則



點選作業系統的『系統/管理』下(Fedora),啟動Firewall Builder。於應用程式畫面左上的物件函式庫(Object Libraries)清單中選擇使用者自訂(User)。右方會顯示『建立新防火牆』、『匯入已存在組態』與『觀看教學影片』的選項。選擇自建防火牆(圖示步驟一),為物件取一個別名後,選擇執行的防火牆軟體(圖示步驟二):Firewall Builder支援Cisco的FWSM、Cisco Router IOS ACL以及Cisco ASA/Cisco PIX、FreeBSD與Solaris的ipfilter、MacOS的ipfw、Linux與OpenWRT等的iptables、OpenBSD的PF以及HP ProCurve的HP Procurve ACL。選項『Use preconfigured firewall templates(使用預先組態的防火牆範本)』是用來要求Firewall Builder載入已設計好的架構。預先組態的防火牆範本皆附有網路架構與簡單環境說明,使用者如能在此找到與自有網路相近的網路環境,即可以此為基礎,再行細部客製化修改。


▲ 選擇預先組態的防火牆範本


接下來是針對目標平台-也就是防火牆規則要匯入的系統設備,輸入對應的網路卡設定,系統會自動產生可編輯的規則,供使用者作客製化的調整:


▲ 修改範本



將游標停留在要插入的規則之後,選擇畫面上方的加號(介於工具列與規則之間),即可插入規則。將物件函式庫切換至標準函式庫(Standard),可以在Firewall Builder內建的數百種函式庫裡挑選現成的物件,以拖曳的方式在編輯框裡進行處理。要留意的一點是:是標準函式庫具唯讀性,不可修改。編輯完成後即可選擇編譯或編譯與安裝,完成防火牆規則的設定與客製化。
結論
防火牆規則撰寫有既定的順序,這是由於網路封包傳遞有其標準流程,而每種防火牆設備或應用程式亦各有其特定語法與處理流程。在應用越來越多樣的網路時代,也帶來更多的不安全,資訊安全的第一道防線防火牆,是每個網路使用者或多或少都會面臨的話題。對系統網路管理者而言,對網路通訊的基礎認知與擁有一套事半功倍的輔助工具,兩者缺一不可。