2010年6月16日 星期三

以開源碼L7-filter實作L7防火牆

http://www.netadmin.com.tw/article_content.asp?sn=1006040010
文.吳惠麟

隨著網路服務的多樣化,有越來越多的服務,不再採用固定埠的服務方式,轉而採用動態埠的服務方式,亦即每次傳輸所使用的埠均不相同。例如經常令企業頭痛不已的P2P下載,所使用的埠即是採用變動的方式,而有些服務會隱藏常見的通訊埠,譬如利用80埠。
在目前網路災情頻傳的情況下,傳統基本的L4防火牆已無法能夠正常地控管這些服務,而需要更高階的L7防火牆,直接根據應用層的特徵來辨識網路服務,進而控管該網路服務,如禁止使用P2P傳輸。

本文將利用開源碼社群中的L7-filter搭配netfilter機制來實作L7防火牆,直接根據應用層的特徵來控管企業內的網路服務,以補L4防火牆的不足。在本解決方案中,將會使用下表中的開源碼軟體:

何謂netfilter/iptables

netfilter/iptables是Linux系統最有名的L4防火牆(Firewall)軟體。所謂的L4(Level 4),意指OSI模型中的第四層。在1977年,國際標準組織開始發展一套共通標準化的通訊協定標準,並於1984年時頒布OSI(Open system Interconnection)模型,將網路通訊協定區分為7層,各層各司其職,如下圖示。

時至90年代中期,網際網路興起,使得TCP/IP通訊協定成為全世界利用最廣的通訊協定。TCP/IP可視為精簡的OSI模型,將網路通訊分為4層,如下圖示。

TCP/IP模型分為「應用層」、「傳輸層」、「網路層」及「連結層」。「應用層」主要定義點與點的交換方法,如HTTP、FTP等通訊協定。「傳輸層」 主要定義資料傳遞的方法,如TCP(可靠性傳輸)或UDP(不可靠性傳輸),在此層中含有主機IP、埠、MAC等資訊,「網路層」則用來定義IP、 ICMP、ARP等通訊協定,並定義封包路由(ROUTING)的方式,好讓不同網域的主機可相互通訊,而「連結層」定義網路底層的架構資訊,主要的目的 在於傳送與接收實體層所傳送的訊號。

而netfilter僅能針對上述模型中的傳輸層的封包進行控管,此即稱L4防火牆,這也是為什麼使用動態埠的網路服務需要L7防火牆的原因。因為傳統的 L4防火牆僅能利用IP(來源IP或目的IP)、通訊埠(如來源Port)或MAC(來源MAC或目的MAC)來控管往來的封包,當某個網路服務使用動態 埠或偽裝成一般埠如80埠時,傳統的L4防火牆即無能為力。在本文中即是利用L7-filter來為netfilter機制加上L7的過濾功能,讓 netfilter能直接從應用層的封包特徵中定義出網路服務類型再加以控管。

接下來簡單介紹netfilter機制。netfilter分為模心模組與應用程式,以下分別加以說明。

核心模組

netfilter提供各式的核心模組(Module)以掛鈎(Hook)的方式,將模組掛鈎於核心處理封包的流程上,並提供檢查點(Hook Ponit)機制,針對通過的封包實施檢查及過濾。 netfilter提供了五個檢查點,系統架構如下圖所示:

圖中的PREROUING代表當封包進入時即會經過PREROUTING檢查點,這也是封包進入後所遇到的第一個檢查點。接下來,封包會判斷是否已經到達 目的主機,如果確定,則會進入INPUT檢查點,否則即進入FORWARD檢查點。 而INPUT是當封包發現已到達目標主機時即會進入本機並經過INPUT檢查點,否則將進入。FORWARD則是檢查點,繼續往下個目標主機前進。 OUTPUT的作用為當封包經由本機發出即會經過OUTPUT檢查點。

此外,如果封包發現並非到達目標主機,即會經過FORWARD檢查點。至於POSTROUTING,則是當封包要離開系統主機時會經過POSTROUTING檢查點,這也是封包進入後所遇到的最後一個檢查點。

應用程式

netfilter提供iptables應用程式來設定netfilter檢查點的過濾規則。設定規則是以表格(Table)及鏈(Chain)的概念來設定,netfilter總共提供三個表格及五個規則鏈。
Filter:主要提供封包過濾,可過濾TCP、UDP、MAC、ICMP等類型封包,包含INPUT、forward、output等規則鏈。
nat:提供SNAT及DNAT等功能,可用來IP偽裝,讓網域內的多台電腦可共用一個公共IP上網。本表格包含prerouting、postrouting、output等規則鏈。

mangle:主要用來修改封包內容,包含PREROUTING、POSTROUTING、FORWARD、INPUT、OUTPUT等規則鏈。 接下來,簡略說明iptables的語法結構,如下所示: iptables [-t table] command [match][-j target/jump]

相關參數說明如下:

[-t table]:用來指定要設定那個表格的規則,如未指定即預設為filter。 Command:命令,通常後會接鏈名稱。常用命令包括:「-A」可在指定的鏈之後新增一個規則、「-D」可在指定的鏈之後刪除一個規則、「-F」表示清 除規則、「-L」則用來顯示規則。

[match]:比對條件。常用的比對條件有「-d」可指定套用規則的目的主機或IP位址,而「-I」是當封包進入FORWARD,OUTPUT或 POSTROUTING所通過的網路介面名稱(如eth0)。其實netfilter比對條件相當強大,有興趣的讀者請自行參閱手冊。

[-j]:目標(表示設定規則的目的),常用目的選項有ACCEPT表示允許封包通過,DROP表示丟棄封包,RETURN代表直接離開目前規則,直接跳到下個規則比對,而QUEUE表示將封包重導到本機的佇列(Queue)中,通常用來供其他應用程式處理。

再舉一個實際的設定範例,應該就會很清楚。範例內容如下:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT 其中,「-A INPUT」代表在INPUT的鏈上新增一條規則,「-p tcp --dport 80」是比對條件,如果通訊協定為tcp且目的埠為80。「-j ACCEPT」即表示接受。整段的規則為如果封包為tcp型式且目標埠為80,就讓它通過。<…未完.更多精采文章,請見網管人53期雜誌>