iptables實戰系列:構建DMZ
1、 DMZ原理
DMZ是英文“demilitarized zone”的縮寫,中文名稱為“隔離區”,也稱“非軍事化區”。它是為了解決安裝防火墻后外部網絡不能訪問內部網絡服務器的問題,而設立的一個非安全系統與安全系統之間的緩沖區,這個緩沖區位于企業內部網絡和外部網絡之間的小網絡區域內,在這個小網絡區域內可以放置一些必須公開的服務器設施,如企業Web服務器、FTP服務器和論壇等。另一方面,通過這樣一個DMZ區域,更加有效地保護了內部網絡,因為這種網絡部署,比起一般的防火墻方案,對攻擊者來說又多了一道關卡。網絡結構如圖1所示。網絡設備開發商利用這一技術,開發出了相應的防火墻解決方案。DMZ通常是一個過濾的子網,DMZ在內部網絡和外部網絡之間構造了一個安全地帶。
DMZ防火墻方案為要保護的內部網絡增加了一道安全防線,通常認為是非常安全的。同時它提供了一個區域放置公共服務器,從而又能有效地避免一些互聯應用需要公開,而與內部安全策略相矛盾的情況發生。在DMZ區域中通常包括堡壘主機、Modem池,以及所有的公共服務器,但要注意的是電子商務服務器只能用作用戶連接,真正的電子商務后臺數據需要放在內部網絡中。在這個防火墻方案中,包括兩個防火墻,外部防火墻抵擋外部網絡的攻擊,并管理所有內部網絡對DMZ的訪問。內部防火墻管理DMZ對于內部網絡的訪問。內部防火墻是內部網絡的第三道安全防線(前面有了外部防火墻和堡壘主機),當外部防火墻失效的時候,它還可以起到保護內部網絡的功能。而局域網內部,對于Internet的訪問由內部防火墻和位于DMZ的堡壘主機控制。在這樣的結構里,一個黑客必須通過三個獨立的區域(外部防火墻、內部防火墻和堡壘主機)才能夠到達局域網。攻擊難度大大加強,相應內部網絡的安全性也就大大加強,但投資成本也是最高的。
2、構建DMZ
1.構建原則
Linux從2.4內核開始,正式使用iptables來代替以前的ipfwadm和ipchains,實現管理Linux的包過濾功能。Linux的包過濾通過一個叫netfilter的內核部件來實現。netfilter內建了三個表,其中默認表Filter中又包括3個規則鏈,分別是負責外界流入網絡接口的數據過濾的INPUT鏈、負責對網絡接口輸出的數據進行過濾的OUTPUT鏈,以及負責在網絡接口之間轉發數據過濾的FORWARD鏈。
要在Linux系統中構建一個帶DMZ的防火墻,需要利用對這些鏈的設定完成。首先要對從連接外部網絡的網卡(eth0)上流入的數據進行判斷,這是在INPUT鏈上完成。如果數據的目標地址屬于DMZ網段,就要將數據轉發到連接DMZ網絡的網卡(eth1)上;如果是內部網絡的地址,就要將數據轉發到連接內部網絡的網卡(eth2)上。表1顯示了各個網絡之間的訪問許可關系:
根據表,可以明確以下六條訪問控制策略:
◆內網可以訪問外網:內網的用戶顯然需要自由地訪問外網。在這一策略中,防火墻需要進行源地址轉換。
◆內網可以訪問DMZ:此策略是為了方便內網用戶使用和管理DMZ中的服務器。
◆外網不能訪問內網:內網中存放的是公司內部數據,這些數據不允許外網的用戶進行訪問。
◆外網可以訪問DMZ:DMZ中的服務器本身就是要給外界提供服務的,所以外網必須可以訪問DMZ。同時,外網訪問DMZ需要由防火墻完成對外地址到服務器實際地址的轉換。
◆DMZ不能訪問內網:很明顯,如果違背此策略,則當入侵者攻陷DMZ時,就可以進一步進攻到內網的重要數據。
◆DMZ不能訪問外網:此條策略在有的情況下可能會有例外,比如DMZ中放置郵件服務器時,就需要訪問外網,否則將不能正常工作。
2.DMZ的具體實現
根據以上訪問控制策略可以設定Linux防火墻的過濾規則。下面將在一個虛構的網絡環境中,探討如何根據以上六條訪問控制策略建立相應的防火墻過濾規則。這里的討論和具體應用會有所區別,不過這種討論將有助于實際應用。用戶在實際應用時可根據具體的情況進行設置。該虛擬環境的網絡拓撲如圖2所示。
如圖2所示,路由器連接Internet和防火墻。作為防火墻的Linux服務器使用三塊網卡:網卡eth0與路由器相連,網卡eth1與DMZ區的Hub相連,網卡eth2與內網Hub相連。作為一個抽象的例子,我們用“[內網地址]”來代表“192.168.1.0/24”之類的具體數值。同理還有“[外網地址]”和“[DMZ地址]”。
對于防火墻,原則之一就是默認禁止所有數據通信,然后再打開必要的通信。所以在防火墻腳本的最初,需要清空系統原有的規則,然后將INPUT、OUTPUT、FORWARD的默認規則設置為丟棄所有數據包。
(1)防火墻基本設置
對應的防火墻腳本片段如下:
# Flush out the tables and delete alluser-definedchains /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
(2)六種策略的具體實現
1)內網可以訪問外網
對應的防火墻腳本片段如下:
/sbin/iptables -t nat -A POSTROUTING -s [內網地址] -d [外網地址] -oeth0-j SNAT --to [NAT的真實IP]
當數據從連接外網的eth0流出時,要將來自內網的數據包的源地址改成Internet上的真實IP,這樣才能和外網的主機進行通信。“[NAT的真實IP]”表示分配給NAT用戶的真實IP,有幾個就寫幾個,以空格分開,但至少要寫一個。
2)內網可以訪問DMZ
對應的防火墻腳本片段如下:
/sbin/iptables -A FORWARD -s [內網地址] -d [DMZ地址] -i eth2-jACCEPT
以上命令允許所有來自內網、目的地為DMZ的數據包通過。
3)外網不能訪問內網
對應的防火墻腳本片段如下:
/sbin/iptables -t nat -A PREROUTING -s [外網地址] -d [內網地址] -i eth0-jDROP
以上命令將來自外網、去往內網的數據包全部丟棄。
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]-ieth0 --dport 80 -j ACCEPT /sbin/iptables -A FORWARD -p tcp -d [外網地址] -s [HTTP服務器的實際IP]-ieth1 --sport 80 ! --syn -j ACCEPT /sbin/iptables -t nat -A PREROUTING -s [外網地址] -d [DMZ地址] -ieth0-j DROP
該防火墻腳本片段將開放HTTP服務,使得只有訪問DMZ中HTTP服務的數據包才能通過防火墻。
5)DMZ不能訪問內網
對應的防火墻腳本片段如下:
/sbin/iptables -A FORWARD -s [DMZ地址] -d [內網地址] -i eth1 -jDROP
以上命令將丟棄所有從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 [外網地址] -ieth1--dport 25 -j ACCEPT /sbin/iptables -A FORWARD -p tcp -d [郵件服務器的IP] -s [外網地址]-ieth0--sport 25 ! --syn -j ACCEPT
以上命令先允許DMZ中郵件服務器連接外網的SMTP服務端口(25),然后禁止其它從DMZ發往外網的數據包。
針對以上基本策略例舉了實現它們的基本規則。在實際應用中,需要根據具體情況進行設置。只要設置得當,Linux也能成為很好的防火墻。需要補充的是,無論何種防火墻都只能提供有限的保護。設置好防火墻不等于網絡就是安全的,關鍵在于綜合運用各種安全手段。
【編輯推薦】