防火牆的工作原理(一)
Kevin Whistler“黑客會打上我的主意嗎?”這麼想就對了,黑客就想鑽雞蛋縫的蒼蠅一樣,看到一絲從系統漏洞發出的光亮就會蠢蠢欲動!好,如何保護你的網絡呢?計算機的高手們也許一張嘴就提議你安裝網絡的防火牆,那麼第一個問題就來了:到底什麼是防火牆呢? |
什麼是防火牆? |
防火牆就是一種過濾塞(目前你這麼了解不算錯),你可以讓你喜歡的東西通過這個塞子,别的玩意都統統過濾掉。在網絡的世界裡,要由防火牆過濾的就是承載通信資料的通信包。 |
天下的防火牆至少都會說兩個詞: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棧怎麼知道某個資料包是屬于哪個應用程式的呢? |
由于曆史的原因,幾乎所有的TCP/IP客戶程式都使用大于1023的随機配置設定端口号。隻有UNIX計算機上的root使用者才可以通路1024以下的端口,而這些端口還保留為伺服器上的服務所用。是以,除非我們讓所有具有大于1023端口号的資料包進入網絡,否則各種網絡連接配接都沒法正常工作。 |