第十五章 防火牆的工作原理
"黑客會打上我的主意嗎?"這麼想就對了,黑客就想鑽雞蛋縫的蒼蠅一樣,看到一絲從係統漏洞發出的光亮就會蠢蠢欲動!好,如何保護你的網絡呢?計算機的高手們也許一張嘴就提議你安裝網絡的防火牆,那麼第一個問題就來了:到底什麼是防火牆呢?
什麼是防火牆?
防火牆就是一種過濾塞(目前你這麼理解不算錯),你可以讓你喜歡的東西通過這個塞子,別的玩意都統統過濾掉。在網絡的世界裏,要由防火牆過濾的就是承載通信數據的通信包。
天下的防火牆至少都會說兩個詞:Yes或者No。直接說就是接受或者拒絕。最簡單的防火牆是以太網橋。但幾乎沒有人會認為這種原始防火牆能管多大用。大多數防火牆采用的技術和標準可謂五花八門。這些防火牆的形式多種多樣:有的取代係統上已經裝備的TCP/IP協議棧;有的在已有的協議棧上建立自己的軟件模塊;有的幹脆就是獨立的一套操作係統。還有一些應用型的防火牆隻對特定類型的網絡連接提供保護(比如SMTP或者HTTP協議等)。還有一些基於硬件的防火牆產品其實應該歸入安全路由器一類。以上的產品都可以叫做防火牆,因為他們的工作方式都是一樣的:分析出入防火牆的數據包,決定放行還是把他們扔到一邊。
所有的防火牆都具有IP地址過濾功能。這項任務要檢查IP包頭,根據其IP源地址和目標地址作出放行/丟棄決定。看看下麵這張圖,兩個網段之間隔了一個防火牆,防火牆的一端有台UNIX計算機,另一邊的網段則擺了台PC客戶機。
當PC客戶機向UNIX計算機發起telnet請求時,PC的telnet客戶程序就產生一個TCP包並把它傳給本地的協議棧準備發送。接下來,協議棧將這個TCP包"塞"到一個IP包裏,然後通過PC機的TCP/IP棧所定義的路徑將它發送給UNIX計算機。在這個例子裏,這個IP包必須經過橫在PC和UNIX計算機中的防火牆才能到達UNIX計算機。
現在我們"命令"(用專業術語來說就是配製)防火牆把所有發給UNIX計算機的數據包都給拒了,完成這項工作以後,"心腸"比較好的防火牆還會通知客戶程序一聲呢!既然發向目標的IP數據沒法轉發,那麼隻有和UNIX計算機同在一個網段的用戶才能訪問UNIX計算機了。
還有一種情況,你可以命令防火牆專給那台可憐的PC機找茬,別人的數據包都讓過就它不行。這正是防火牆最基本的功能:根據IP地址做轉發判斷。但要上了大場麵這種小伎倆就玩不轉了,由於黑客們可以采用IP地址欺騙技術,偽裝成合法地址的計算機就可以穿越信任這個地址的防火牆了。不過根據地址的轉發決策機製還是最基本和必需的。另外要注意的一點是,不要用DNS主機名建立過濾表,對DNS的偽造比IP地址欺騙要容易多了。
服務器TCP/UDP端口過濾
僅僅依靠地址進行數據過濾在實際運用中是不可行的,還有個原因就是目標主機上往往運行著多種通信服務,比方說,我們不想讓用戶采用telnet的方式連到係統,但這絕不等於我們非得同時禁止他們使用SMTP/POP郵件服務器吧?所以說,在地址之外我們還要對服務器的TCP/UDP端口進行過濾。
比如,默認的telnet服務連接端口號是23。假如我們不許PC客戶機建立對UNIX計算機(在這時我們當它是服務器)的telnet連接,那麼我們隻需命令防火牆檢查發送目標是UNIX服務器的數據包,把其中具有23目標端口號的包過濾就行了。這樣,我們把IP地址和目標服務器TCP/UDP端口結合起來不就可以作為過濾標準來實現相當可靠的防火牆了嗎?不,沒這麼簡單。
客戶機也有TCP/UDP端口
TCP/IP是一種端對端協議,每個網絡節點都具有唯一的地址。網絡節點的應用層也是這樣,處於應用層的每個應用程序和服務都具有自己的對應"地址",也就是端口號。地址和端口都具備了才能建立客戶機和服務器的各種應用之間的有效通信聯係。比如,telnet服務器在端口23偵聽入站連接。同時telnet客戶機也有一個端口號,否則客戶機的IP棧怎麼知道某個數據包是屬於哪個應用程序的呢?