用Linux防火牆構建DMZ
作者:余海發 發文時間:2004.11.12


防守在網路安全中的重要性不必多說。保護網路最常見的方法就是使用防火牆。防火牆作為網路的第一道防線,通常放置在外網和需要保護的網路之間。最簡單的情況是直接將防火牆放置在外網和企業網路之間,所有流入企業網路的資料流程量都將通過防火牆,使企業的所有客戶機及伺服器都處於防火牆的保護下。這對於一些中小企業來說是簡單易行的,而且這種解決方法在某些情況下也表現不錯。然而這種結構畢竟比較簡單。企業中有許多伺服器、客戶機等資源需要保護,不同的資源對安全強度的要求也不同。不能用對待客戶機的安全級別來對待伺服器,這樣伺服器將會很危險;同樣,也不能用對待伺服器的安全級別來對待客戶機,這樣用戶會感覺很不方便。

針對不同資源提供不同安全級別的保護,可以考慮構建一個叫做“Demilitarized Zone”(DMZ)的區域。DMZ可以理解為一個不同於外網或內網的特殊網路區域。DMZ內通常放置一些不含機密資訊的公用伺服器,比如Web、Mail、FTP等。這樣來自外網的訪問者可以訪問DMZ中的服務,但不可能接觸到存放在內網中的公司機密或私人資訊等。即使DMZ中伺服器受到破壞,也不會對內網中的機密資訊造成影響。

許多防火牆產品都提供了DMZ的介面。硬體防火牆由於使用專門的硬體晶片,所以在性能和流量上有絕對的優勢。軟體防火牆的性價比非常好,一般企業使用起來效果不錯。如果使用Linux防火牆,其成本將更低。因此這裏將要介紹的是在Linux防火牆上劃分DMZ區域的方法。

構建DMZ的策略

Linux從2.4內核開始,正式使用iptables來代替以前的ipfwadm和ipchains,實現管理Linux的包過濾功能。Linux的包過濾通過一個叫netfilter的內核部件來實現。netfilter內建了三個表,其中默認表Filter中又包括3個規則鏈,分別是負責外界流入網路介面的資料過濾的INPUT鏈、負責對網路介面輸出的資料進行過濾的OUTPUT鏈,以及負責在網路介面之間轉發資料過濾的FORWARD鏈。要構建一個帶DMZ的防火牆,需要利用對這些鏈的設定完成。首先要對從連接外部網路的網卡(eth0)上流入的資料進行判斷,這是在INPUT鏈上完成。如果資料的目標位址屬於DMZ網段,就要將資料轉發到連接DMZ網路的網卡(eth1)上;如果是內部網路的位址,就要將資料轉發到連接內部網路的網卡(eth2)上。表1顯示了各個網路之間的訪問關係。

表1 網路間訪問關係表


內網 外網 DMZ
內網 / Y Y
外網 N / Y
DMZ N N /


根據表1,可以明確以下六條訪問控制策略。

1.內網可以訪問外網
內網的用戶顯然需要自由地訪問外網。在這一策略中,防火牆需要進行源位址轉換。

2.內網可以訪問DMZ
此策略是為了方便內網用戶使用和管理DMZ中的伺服器。

3.外網不能訪問內網
很顯然,內網中存放的是公司內部資料,這些資料不允許外網的用戶進行訪問。

4.外網可以訪問DMZ
DMZ中的伺服器本身就是要給外界提供服務的,所以外網必須可以訪問DMZ。同時,外網訪問DMZ需要由防火牆完成對外位址到伺服器實際位址的轉換。

5.DMZ不能訪問內網
很明顯,如果違背此策略,則當入侵者攻陷DMZ時,就可以進一步進攻到內網的重要資料。

6.DMZ不能訪問外網
此條策略也有例外,比如DMZ中放置郵件伺服器時,就需要訪問外網,否則將不能正常工作。

DMZ的實現

根據以上訪問控制策略可以設定Linux防火牆的過濾規則。下面將在一個虛構的網路環境中,探討如何根據以上六條訪問控制策略建立相應的防火牆過濾規則。這裏的討論和具體應用會有所區別,不過這種討論將有助於實際應用。用戶在實際應用時可根據具體的情況進行設置。該虛擬環境的網路拓撲如圖1。

圖1 DMZ網路拓撲圖


如圖1所示,路由器連接Internet和防火牆。作為防火牆的Linux伺服器使用三塊網卡:網卡eth0與路由器相連,網卡eth1與DMZ區的Hub相連,網卡eth2與內網Hub相連。作為一個抽象的例子,我們用“[內網位址]”來代表“192.168.1.0/24”之類的具體數值。同理還有“[外網地址]”和“[DMZ地址]”。

對於防火牆,原則之一就是默認禁止所有資料通信,然後再打開必要的通信。所以在防火牆腳本的最初,需要清空系統原有的規則,然後將INPUT、OUTPUT、FORWARD的默認規則設置為丟棄所有資料包。

對應的防火牆腳本片段如下:

代碼:

# Flush out the tables and delete all user-defined chains
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat -X

# Drop every packet
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP


接下來,逐一解釋六種策略的實現。

1.內網可以訪問外網
對應的防火牆腳本片段如下:
/sbin/iptables -t nat -A POSTROUTING -s [內網地址] -d [外網地址] -o eth0 -j SNAT --to [NAT的真實IP]

當資料從連接外網的eth0流出時,要將來自內網的資料包的源位址改成Internet上的真實IP,這樣才能和外網的主機進行通信。“[NAT的真實IP]”表示分配給NAT用戶的真實IP,有幾個就寫幾個,以空格分開,但至少要寫一個。

2.內網可以訪問DMZ
對應的防火牆腳本片段如下:
/sbin/iptables -A FORWARD -s [內網地址] -d [DMZ地址] -i eth2 -j ACCEPT
以上命令允許所有來自內網、目的地為DMZ的資料包通過。

3.外網不能訪問內網
對應的防火牆腳本片段如下:
/sbin/iptables -t nat -A PREROUTING -s [外網地址] -d [內網地址] -i eth0 -j DROP
以上命令將來自外網、去往內網的資料包全部丟棄。

4.外網可以訪問DMZ
為了保護DMZ中的伺服器,外網對DMZ的訪問也要加以限制。通常的思路是,只允許外網訪問DMZ中伺服器所提供的特定服務,比如HTTP。
對應的防火牆腳本片段如下:
/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -d [分配給HTTP伺服器的Internet上的真實IP] -s [外網地址] -i eth0 -j DNAT --to [HTTP伺服器的實際IP]
/sbin/iptables -A FORWARD -p tcp -s [外網地址] -d [HTTP伺服器的實際IP] -i eth0 --dport 80 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d [外網地址] -s [HTTP伺服器的實際IP] -i eth1 --sport 80 ! --syn -j ACCEPT
/sbin/iptables -t nat -A PREROUTING -s [外網地址] -d [DMZ地址] -i eth0 -j DROP

該防火牆腳本片段將開放HTTP服務,使得只有訪問DMZ中HTTP服務的資料包才能通過防火牆。

5.DMZ不能訪問內網
對應的防火牆腳本片段如下:
/sbin/iptables -A FORWARD -s [DMZ地址] -d [內網地址] -i eth1 -j DROP
以上命令將丟棄所有從DMZ到內網的資料包。

6.DMZ不能訪問外網
對應的防火牆腳本片段如下:
/sbin/iptables -t nat -A POSTROUTING -p tcp --dport 25 -d [外網地址] -s [郵件伺服器的IP] -o eth0 -j SNAT --to [分配給SMTP伺服器的Internet上的真實IP]
/sbin/iptables -A FORWARD -p tcp -s [郵件伺服器的IP] -d [外網地址] -i eth1 --dport 25 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d [郵件伺服器的IP] -s [外網地址] -i eth0--sport 25 ! --syn -j ACCEPT

以上命令先允許DMZ中郵件伺服器連接外網的SMTP服務埠(25),然後禁止其他從DMZ發往外網的資料包。

針對以上基本策略例舉了實現它們的基本規則。在實際應用中,需要根據具體情況進行設置。只要設置得當,Linux也能成為很好的防火牆。需要補充的是,無論何種防火牆都只能提供有限的保護。設置好防火牆不等於網路就是安全的,關鍵在於綜合運用各種安全手段。

http://tech.ccidnet.com/pub/article/c322_a176695_p1.html
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 末三 的頭像
    末三

    五顆星星的故事

    末三 發表在 痞客邦 留言(0) 人氣()