作者:老薯條 ,2010 年 11 月投稿。
隨著 internet 的風行,相關的資安問題也層出不窮,除了傳統的病毒及網路釣魚等威脅外,不當使用 P2P 軟體所衍生的資安問題也日漸受到重視,在本文中,筆者將應用開源碼社群中的 IPP2P 搭配 netfilter(linux 系統上最有名的防火牆軟體,即一般人所熟知的 iptables)機制,來建構一個可控管 P2P 軟體的防火牆系統。在本方案中所使用到的軟體如下表所示:
Netfilter 機制是 linux 系統上最有名的 L4 (Level 4) 防火牆,其中 netfilter 指的是核心處理的模組,而 iptables 即為設定管理 Netfilter 的使用者程式。所謂 L4 意指 Netfilter 運作 OSI (Open system Interconnection) 模型的第四層(國際標準組織所提出的共通標準化的通訊協定標準),OSI 模型共分七層,各層各司其職,概述如下(由下而上):
主要定義底層傳輸介面的電氣媒體 (MEDIA),傳輸方法 (TRANSMISSION METHOD) 與佈線方式 (TOPOLOGY) 等等。
定義如何確保資料正確傳輸,及將資料切割並加上來源與目的地位址與資料長度等訊息,包裝成頁框 (FRAME),在此層中具有 MAC 資訊。
負責資料繞徑 (ROUTING ),包括轉換地 (TRANSLATES ADDRESSES),尋找最佳路徑 (BEST ROUTING) 與管理流量 (TRAFFIC),在此層中具有 IP 等資訊。
確保資料到達順序與正確性,在此層中具有埠等資訊。
定義連結建立與結束的對話。
處理資料格式,包括格式轉換,加密 (ENCRYPTION) 與解密 (DECRYPTION),壓縮 (COMPRESSION) 與還原。
定義供應用程式存取的介面與功能。
由上可知,netfilter 即是運作在傳輸層中,所能掌握的資訊即為 IP、埠及 MAC 等相關資訊。這也是為什麼 netfilter 要控管 P2P 軟體需要新增 IPP2P 模組的原因。在未新增 IPP2P 模組之前,netfilter 僅能以 IP 位址(來源或目的),埠資訊(來源或目的),MAC 資訊(來源或目的)控管來往的封包。如此對於使用固定埠的網路服務或許有控管的能力,但對於未使用固定埠的網路服務(如某些 P2P 軟體會使用動態埠【即每次使用會使用不同埠】)卻無能為力。所以欲控管如 P2P 等軟體,我們需要利用解析應用層的資訊,來辨識 P2P 的服務。在新增 IPP2P 模組之前,我們必需先修正 (patch) 核心,讓核心具有應用層解析的能力,這需要 L7-FILTER 的幫忙。先讓 netfilter 具有分析應用層封包的能力,後再使用 IPP2P 的模組,藉由分析應用層封包的特徵碼來辨識 P2P 軟體並加以控管。Netfilter分為核心模組與應用程式,以下先簡單說明 NETFILTER 機制:
Netfilter 利用掛鉤 (HOOK) 的方式,將相關的核心模組掛鉤 (HOOK) 於核心處理封包的流程上,針對通過的封包實施檢查及過濾。系統架構如下圖所示:
Netfilter 提供 iptables 應用程式,用來設定 Netfilter 檢查點的過濾規則。設定規則是以表格 (table) 及鏈 (chain) 的概念來設定,Netfilter 總共提供了三個表格及五個規則鏈。
以下簡略說明 iptables 的語法結構,如下例:Iptables [-t table] command [match][-j target/jump]
如下為一設定範例:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT:在 INPUT 的鏈 (chain) 上新增一規則
-p tcp --dport 80:比對條件(表示如果通訊協定為 tcp 且目的埠為 80)
-j ACCEPT:即表示接受
(整段的規則為如果封包為 tcp 型式且目標埠為 80 即讓它通過)
基本上要建造一個可控管 P2P 軟體的防火牆,我們需要下列的工作:
L7-FILTER 為 Netfilter 標準外掛的模組,利用特徵碼的方式來加強 Netfilter 解析 L7 應用層的封包能力來辨識出不同的應用程式。至此,讀者可能會有個疑問,既然 L7-FILTER 已可辨識 L7 應用程式,那應該可辨識出 P2P 軟體,為何還需要 IPP2P,這涉及到兩套軟體實作的方式,L7-FILTER 是採用正規表示法來比對每個 L7 應用程式的連接 (CONNECT) 前 20 個 byte 的方式,而 IPP2P 則是將常用的 P2P 軟體特徵碼直接寫入程式中,這意謂著 IPP2P 將會比 L7-FILTER 模組更能精確地辨識出 P2P 軟體並加以控制。根據 L7-FILTER 官方網址的說明,以 Kernel 2.6.28 的相容性最佳,因此本次我們將採用 2.6.28 的核心來編譯。相關步驟如下:
IPP2P 為 netfilter 標準的外掛模組,主要目的在於控管 P2P 軟體。根據官方網站所述,支援的 P2P 軟體如下表:
參數 P2P / 軟體 / 通訊協定 --edk / eDonkey, eMule, Kademlia / TCP and UDP --kazaa / KaZaA, FastTrack / TCP and UDP --gnu / Gnutella / TCP and UDP --dc / Direct Connect / TCP only --bit / BitTorrent, extended BT / TCP and UDP --apple / AppleJuice / TCP only --winmx / WinMX / TCP only --soul / SoulSeek / TCP only --ares / Ares, AresLite / TCP only
安裝步驟如下:
ifndef $(IPTABLES_SRC)
IPTVER =1.4.3
IPTABLES_SRC = $(wildcard /home/johnwu/iptables-$(IPTVER))
endif
其中 /home/johnwu/iptables-$(IPTVER) 為 iptables 原始碼所在的目錄 筆者的測試環境為 IPP2P 主機當成 NAT 主機,其餘客戶端主機均透過此主機連到外面去,在此即不多說 NAT 原理,有興趣的讀者可自行參閱相關文件。請依序下達下列指令:
echo "1">/proc/sys/net/ipv4/ip_forward #開啟主機 ip forward功能
/usr/local/iptables143/sbin/iptables -t nat -A POSTROUTING -o XXX.XXX.XXX.XXX -s 192.168.2.0/24 -j MASQUERADE #利用 MASQUERADE 功能設定 NAT 功能。在本例中,對外實際 IP 為 XXX.XXX.XXX.XXX,而 192.168.2.0 網域的內部主機均能以此真實 IP 上網。請讀者自行依據本身環境自行調整。在設定完成後,讀者可將內部主機的閘道器 (gateway) 指向此台主機,如果可正常上網即表示設定正確。
/usr/local/iptables143/sbin/iptables -A FORWARD -m ipp2p --ipp2p -j DROP #設定阻檔全部支援的 P2P 軟體,或者讀者可視個別情況來決定欲阻擋的 P2P 軟體,如:iptables -A FORWARD -m ipp2p --bit -j DROP(設定阻檔個別的p2p軟體,如本例即為阻檔 BitTorrent)
在讀者設定完成後,可利用 iptables –L 查看是否有下列的資訊,如下圖示:
至此,讀者可將本機的預設閘道器 (gateway) 指向 ipp2p 所在的主機,後即可開啟 BT 軟體來測試是否可阻檔 P2P 軟體,限於時間及設備因素,筆者僅測試 BitTorrent 此款軟體。其餘的 bittorrent 軟體就請讀者自行測試了。