防守在網絡安全中的重要性不必多說。保護網絡最常見的方法就是使用防火牆。防火牆作為網絡的第一道防線,通常放置在外網和需要保護的網絡之間。最簡單的情況是直接將防火牆放置在外網和企業網絡之間,所有流入企業網絡的數據流量都將通過防火牆,使企業的所有客戶機及服務器都處於防火牆的保護下。這對於一些中小企業來說是簡單易行的,而且這種解決方法在某些情況下也表現不錯。然而這種結構畢竟比較簡單。企業中有許多服務器、客戶機等資源需要保護,不同的資源對安全強度的要求也不同。不能用對待客戶機的安全級別來對待服務器,這樣服務器將會很危險;同樣,也不能用對待服務器的安全級別來對待客戶機,這樣用戶會感覺很不方便。
針對不同資源提供不同安全級別的保護,可以考慮構建一個叫做“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 網絡間訪問關系表
根據表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也能成為很好的防火牆。需要補充的是,無論何種防火牆都只能提供有限的保護。設置好防火牆不等於網絡就是安全的,關鍵在於綜合運用各種安全手段。
(T115)