提示:防火牆是提供網絡安全性的重要手段之一,RedHat6.1提供了用於實現過濾型防火牆的工具 包——ipchains。實現防火牆的策略一般有兩種:在第一種方式下,首先允許所有的包,然後在禁止有 危險的包通過防火牆;第二種方式則相反,首先禁止所有的包,然後再根據所需要的服務允許特定的包 通過防火牆。相比較而言,第二種方式更能保證網絡的安全性。但對於第二種方式,要求使用者知道 Server/Client 交互的基本原理和特定服務所對應的具體端口。本文將從一個具體的實列出發,討論怎 樣采用第二種方式構建企業的防火牆系統。 一、Server/Client的交互原理 首先讓我們看一下服務器/客戶機的交互原理。服務器提供某特定功能的服務總是由特定的後台程 序提供的。在TCP/IP網絡中,常常把這個特定的服務綁定到特定的TCP或UDP端口。之後,該後台程序就 不斷地監聽(listen)該端口,一旦接收到符合條件的客戶端請求,該服務進行TCP握手後就同客戶端建 立一個連接,響應客戶請求。與此同時,再產生一個該綁定的拷貝,繼續監聽客戶端的請求。 舉一個具體的例子:假設網絡中有一台服務器A(IP地址為a.b.c.1)提供WWW服務,另有客戶機 B(a.b.c.4)、C(a.b.c.7)。首先,服務器A運行提供WWW服務的後台程序(比如Apache)並且把該服務綁 定到端口80,也就是說,在端口80進行監聽。當B發起一個連接請求時,B將打開一個大於1024的連接端 口(1024內為已定義端口),假設為1037。A在接收到請求後,用80端口與B建立連接以響應B的請求,同 時產生一個80端口綁定的拷貝,繼續監聽客戶端的請求。假如A又接收到C的連接請求(設連接請求端口 為1071),則A在與C建立連接的同時又產生一個80端口綁定的拷貝繼續監聽客戶端的請求。如下所示, 每個連接都是唯一的。 服務器 客戶端 連接1:a.b.c.1:80 <=> a.b.c.4:1037 連接2:a.b.c.1:80 <=> a.b.c.7:1071 二、服務端口 每一種特定的服務都有自己特定的端口,一般說來小於1024的端口多為保留端口,或者說是已定義 端口,低端口分配給眾所周知的服務(如WWW、FTP等等),從512到1024的端口通常保留給特殊的UNIX TCP/IP應用程序,具體情況請參考/etc/services文件或RFC1700。 三、網絡環境 假設網絡環境如下:某一單位,租用DDN專線上網,網絡拓撲如下: +--------------+ 內部網段 eth1+--------+eth0 DDN +------------firewall<===============>Internet 198.168.80.0 +--------+ +--------------+ eth0: 198.199.37.254 eth1: 198.168.80.254 以上的IP地址都是Internet上真實的IP,故沒有用到IP欺騙。並且我們假設在內部網中存在以下服務器: dns服務器:dns.yourdomain.com 由firewall兼任 www服務器:www.yourdomain.com 198.168.80.11 ftp服務器:ftp.yourdomain.com 198.168.80.12 bbs服務器:bbs.yourdomain.com 198.168.80.13 email服務器:mail.yourdomain.com 198.168.80.14 下面我們將用ipchains一步一步地來建立我們的包過濾防火牆。 四、實現步驟 說明:有關ipchains的詳細命令用法,請參考有關HOWTO文檔。在本例中,我們將在eth0和eth1的 input chain設置過濾規則。 1. 在/etc/rc.d/目錄下用toUCh命令建立firewall文件,執行chmod u+x firewll以更改文件屬性 ,編輯/etc/rc.d/rc.local文件,在末尾加上 /etc/rc.d/firewall 以確保開機時能自動執行該腳本。 2. 刷新所有的ipchains #!/bin/sh echo "Starting ipchains rules..." #Refresh all chains /sbin/ipchains -F 3.設置WWW包過濾 說明:WWW端口為80,采用tcp或udp協議。 規則為:eth1=>允許所有來自Intranet的WWW包;eth0=> 僅允許目的為內部網WWW服務器的包。 #Define HTTP packets #Allow www request packets from Internet clients to www servers /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 1024: -d 198.168.80.11/32 www -i eth0 -j ACCEPT /sbin/ipchains -A input -p udp -s 0.0.0.0/0 1024: -d 198.168.80.11/32 www -i eth0 -j ACCEPT #Allow response from Intranet www servers to request Internet clients /sbin/ipchains -A input -p tcp -s 198.168.80.11/32 www -d 0.0.0.0/0 1024: -i eth1 -j ACCEPT /sbin/ipchains -A input -p udp -s 198.168.80.11/32 www -d 0.0.0.0/0 1024: -i eth1 -j ACCEPT #Allow www request packets from Intranet clients to Internet www servers /sbin/ipchains -A input -p tcp -s 198.168.80.0/24 1024: -d 0.0.0.0/0 www -i eth1 -j ACCEPT /sbin/ipchains -A input -p udp -s 198.168.80.0/24 1024: -d 0.0.0.0/0 www -i eth1 -j ACCEPT #Allow www response packets from Internet www servers to Intranet clients /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 www -d 198.168.80.0/24 1024: -i eth0 -j ACCEPT /sbin/ipchains -A input -p udp -s 0.0.0.0/0 www -d 198.168.80.0/24 1024: -i eth0 -j ACCEPT 4.設置ftp包過濾 說明:ftp端口為21,ftp-data端口為20,均采用tcp協議。 規則為:eth1=>允許所有來自Intranet 的ftp、ftp-data包;eth0=>僅允許目的為內部網ftp服務器的包。 #Define FTP packets #Allow ftp request packets from Internet clients to Intranet ftp server /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 1024: -d 198.168.80.12/32 ftp -i eth0 -j ACCEPT /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 1024: -d 198.168.80.12/32 ftp-data -i eth0 -j ACCEPT #Allow ftp response packets from Intranet ftp server to Internet clients /sbin/ipchains -A input -p tcp -s 198.168.80.12/32 ftp -d 0.0.0.0/0 1024: -i eth1 -j ACCEPT /sbin/ipchains -A input -p tcp -s 198.168.80.12/32 ftp-data -d 0.0.0.0/0 1024: -i eth1 -j ACCEPT #Allow ftp request packets from Intranet clients to Internet ftp servers /sbin/ipchains -A input -p tcp -s 198.168.80.0/24 1024: -d 0.0.0.0/0 ftp -i eth1 -j ACCEPT /sbin/ipchains -A input -p tcp -s 198.168.80.0/24 1024: -d 0.0.0.0/0 ftp-data -i eth1 -j ACCEPT #Allow ftp response packets from Internet ftp servers to Intranet clients /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 ftp -d 198.168.80.0/24 1024: -i eth0 -j ACCEPT /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 ftp-data -d 198.168.80.0/24 1024: -i eth0 -j ACCEPT 5.設置telnet包過濾 說明:telnet端口為21,采用tcp協議。 規則為:eth1=>允許所有來自Intranet的telnet包; eth0=>僅允許目的為bbs服務器的包;為了提高網絡安全性,禁止所有對firewall的telnet請求。 #Define telnet packets #Allow telnet request packets from Internet clients to Intranet bbs server /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 1024: -d 198.168.80.13/32 telnet -i eth0 -j ACCEPT #Allow telnet response packets from bbs server to Internet clients /sbin/ipchains -A input -p tcp -s 198.168.80.13/32 telnet -d 0.0.0.0/0 1024: -i eth1 -j ACCEPT #Allow telnet request packets from Intranet clients to Internet telnet servers /sbin/ipchains -A input -p tcp -s 198.168.80.0/24 1024: -d 0.0.0.0/0 telnet -i eth1 -j ACCEPT #Allow telent response packets from Internet telnet servers to Intranet clients /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 telnet -d 198.168.80.0/24 1024: -i eth0 -j ACCEPT 6.設置smtp包過濾 說明:smtp端口為21,采用tcp協議。 規則為:eth1=>允許所有來自Intranet的smtp包;eth0=>僅允 許目的為email服務器的smtp請求。 #Define smtp packets #Allow smtp request packets from Internet smtp servers to Intranet email server /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 1024: -d 198.168.80.14/32 smtp -i eth0 -j ACCEPT #Allow smtp response packets from Intranet email server to Internet smtp servers /sbin/ipchains -A input -p tcp -s 198.168.80.14/32 smtp -d 0.0.0.0/0 1024: -i eth1 -j ACCEPT #Allow smtp request packets from Intranet clients to Internet smtp servers /sbin/ipchains -A input -p tcp -s 198.168.80.0/24 1024: -d 0.0.0.0/0 smtp -i eth1 -j ACCEPT #Allow smtp response packets from Internet smtp servers to Intranet clients /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 smtp -d 198.168.80.0/24 1024: -i eth0 -j ACCEPT 7.設置POP-3包過濾 說明:POP-3端口為110,采用tcp或udp協議。 規則為:eth1=>允許所有來自Intranet的POP-3包; eth0=>允許所有目的為Intranet(email server 除外)的POP-3包。 #Define pop-3 packets #Allow pop-3 request packets from Intranet clients to Internet pop-3 servers /sbin/ipchains -A input -p tcp -s 198.168.80.0/24 1024: -d 0.0.0.0/0 pop-3 -i eth1 -j ACCEPT /sbin/ipchains -A input -p udp -s 198.168.80.0/24 1024: -d 0.0.0.0/0 pop-3 -i eth1 -j ACCEPT #Allow pop-3 response packets from Internet pop-3 servers to Intranet clients (except email server) /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 pop-3 -d 198.168.80.0/24 1024: -i eth0 -j ACCEPT /sbin/ipchains -A input -p udp -s 0.0.0.0/0 pop-3 -d 198.168.80.0/24 1024: -i eth0 -j ACCEPT 9.設置domain包過濾 說明:domain端口為53,采用tcp或udp協議。 規則為:允許所有來自Intranet和Internet的domain請 求。筆者在用網絡監視軟件測試時,發現domain的請求端口都是大於1100的,但是找不到相關的解釋。 #Donmain name server #Allow domain request packets from Intranet clients to Internet domain servers /sbin/ipchains -A input -p tcp -s 198.168.80.0/24 1100: -d 0.0.0.0/0 domain -i eth1 -j ACCEPT /sbin/ipchains -A input -p udp -s 198.168.80.0/24 1100: -d 0.0.0.0/0 domain -i eth1 -j ACCEPT #Allow domain response packets from Internet domain servers to Intranet clients /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 domain -d 198.168.80.0/24 1100: -i eth0 -j ACCEPT /sbin/ipchains -A input -p udp -s 0.0.0.0/0 domain -d 198.168.80.0/24 1100: -i eth0 -j ACCEPT 10.設置icmp包過濾 說明:icmp包通常用於網絡測試等,故允許所有的icmp包通過。(另:icmp包通常帶來的危害為ping of death,但是高版本的Linux內核已經包含了相應的措施來避免ping of death) #Define icmp packets /sbin/ipchains -A input -p icmp -j ACCEPT 11.設置缺省包過濾規則 說明:除了以上所允許通過的包以外,禁止其他包通過。 #Define all rules on input chain /sbin/ipchains -A input -j DENY -l 通過以上個步驟,我們建立了一個相對完整的防火牆。該防火牆禁止除了提供基本服務以外的包通 過。但是該防火牆還有不完善的地方,比如,某些搜索引擎會打開一個小於1024的但不常用的端口的連 接,這樣的包就無法通過該防火牆,從而使用戶不能使用該搜索引擎。但是提高了網絡的安全性,消除 了安全隱患,所謂魚與熊掌不可兼得,安全性重要還是服務重要就要看不同的情況了。