基於LINUX操作系統的防火牆技術及其具體實現

[摘要]本文介紹了LINUX下常用的防火牆規則配置軟件Ipchains;從實現原理、配置方法以及功能特點的角度描述了LINUX防火牆的三種功能;並給出了一個LINUX防火牆實例作爲參考。

 

[關鍵字]LINUX防火牆、ipchains 、包過濾、代理、IP僞裝

 


1      前言


      防火牆作爲網絡安全措施中的一個重要組成部分,一直受到人們的普遍關注。LINUX是這幾年一款異軍突起的操作系統,以其公開的源代碼、強大穩定的網絡功能和大量的免費資源受到業界的普遍讚揚。LINUX防火牆其實是操作系統本身所自帶的一個功能模塊。通過安裝特定的防火牆內核,LINUX操作系統會對接收到的數據包按一定的策略進行處理。而用戶所要做的,就是使用特定的配置軟件(如ipchains)去定製適合自己的“數據包處理策略”。


2      LINUX防火牆配置軟件—Ipchains


      Ipchains是LINUX 2.1及其以上版本中所帶的一個防火牆規則管理程序。用戶可以使用它來建立、編輯、刪除系統的防火牆規則。但通常,需要自己創建一個防火牆規則腳本 /etc/rc.d/rc.firewall,並使系統啓動時自動運行這個腳本。
一個LINUX防火牆系統的安全機制是通過Input、Output、Forward這三個“防火鏈”來實現的。而用戶正是使用ipchains在這三個“鏈”上分別創建一套“防火規則”,來完成對到來數據包層層限制的目的。
      其中,每個鏈都包括一組由用戶創建的過濾規則,數據包依次到達每個鏈,並比較其中的每條規則,直到找出匹配規則並執行相應策略(如通過、拒絕等),否則執行默認策略。實際中,數據包在到達Input鏈之前還要進行測試和正常性檢查,在到路由表之前還要被判斷是否被僞裝,這些,在本圖中都被省略了。


Ipchains 經常使用的命令行格式如下:
Ipchains –A chain [–i interface] [–p protocol] [[!] -y]
[–s source-ip [port]] [-d destination-ip [port]] –j policy [-l]
對各選項的說明如下表:
-A <chain>      添加一規則到鏈尾。chain可爲input、output、forward。
-i <interface>      指定本規則適用的網絡接口。通常有eth0、eth1、lo、ppp0等。
-p <protocol>      指定本規則適用的IP協議,如tcp、udp、icmp等。
[!] –y      -y表明tcp握手中的連接請求標誌位SYN; ! –y 表示對該請求的響應。
-s src-ip [port]      指明數據包的源IP地址,port表示本規則適用的端口號。
-d dst-ip [port]      指明數據包的目的IP地址及端口號。
-j policy      指定本規則對匹配數據包的處理策略:ACCEPT、DENY或REJECT。
-l      在系統日誌/var/log/messages中記錄與該規則匹配的數據包。

 

3      LINUX防火牆的幾種常見功能


      由於每一個用戶的要求和所處的環境都不一樣,LINUX防火牆會根據用戶的設置實現各種不同的功能。但一般說來,以下三種功能是大多數用戶最常用到的。


3.1 包過濾


      對數據包進行過濾可以說是任何防火牆所具備的最基本的功能,而LINUX防火牆本身從某個角度也可以說是一種“包過濾防火牆”。在LINUX防火牆中,操作系統內核對到來的每一個數據包進行檢查,從它們的包頭中提取出所需要的信息,如源IP地址、目的IP地址、源端口號、目的端口號等,再與已建立的防火規則逐條進行比較,並執行所匹配規則的策略,或執行默認策略,這個過程在圖1中已經形象的表現出來。
      值得注意的是,在制定防火牆過濾規則時通常有兩個基本的策略方法可供選擇:一個是默認允許一切,即在接受所有數據包的基礎上明確地禁止那些特殊的、不希望收到的數據包;還有一個策略就是默認禁止一切,即首先禁止所有的數據包通過,然後再根據所希望提供的服務去一項項允許需要的數據包通過。一般說來,前者使啓動和運行防火牆變得更加容易,但卻更容易爲自己留下安全隱患。
通過在防火牆外部接口處對進來的數據包進行過濾,可以有效地阻止絕大多數有意或無意地網絡攻擊,同時,對發出的數據包進行限制,可以明確地指定內部網中哪些主機可以訪問互聯網,哪些主機只能享用哪些服務或登陸哪些站點,從而實現對內部主機的管理。可以說,在對一些小型內部局域網進行安全保護和網絡管理時,包過濾確實是一種簡單而有效的手段。


3.2 代理


      LINUX防火牆的代理功能是通過安裝相應的代理軟件實現的。它使那些不具備公共IP的內部主機也能訪問互聯網,並且很好地屏蔽了內部網,從而有效保障了內部主機的安全。爲了清楚地描述這一重要功能的實現過程,特假設以下典型情況,如圖2所示:
 
    steven爲內部網中一臺IP是192.168.0.2的主機,其上安裝有IE5.0瀏覽器,並配置爲使用防火牆主機192.168.0.1:8080作爲代理。firewall就是我們討論的LINUX防火牆,有兩個網絡接口,分別是內部接口eth1=192.168.0.1、外部接口eth0=202.117.120.1。在firewall主機上安裝有Web代理軟件“squid”,並配置其代理端口爲8080。www.263.net爲263網站的Web服務器,IP爲211.100.31.131,Web服務端口80。
如果要從steven主機訪問263的主頁,其具體的通信過程如圖中所示:
(1)IE通過steven的非專用端口1110 (在1024~65535之間隨機產生)與防火牆的代理端口8080建立連接,請求“http://www.263.net”頁面。
(2)squid代理接收到請求後,先查找域名“www.263.net”,得到地址211.100.31.131(該步驟省略),然後通過防火牆端口1050與該地址的80端口建立一個連接,請求頁面。
(3)www.263.net服務器接到請求後將頁面傳給squid代理。
(4)防火牆代理得到頁面後,把數據複製到(1)中所建立的連接上,IE得到數據並將“www.263.net”頁面顯示出來。
      通過以上描述,可以清楚地瞭解到內部主機、LINUX代理防火牆以及外部服務器之間是如何進行數據傳輸的,那麼,在LINUX防火牆內部,那些“防火鏈”又是如何工作的呢? 
      steven主機發來的數據包經由內部接口eth1進來後,首先接受INPUT鏈的“檢查”:系統內核從包頭中提取出信息,與INPUT鏈中所有適用於eth1接口的過濾規則逐個比較,直到匹配通過。之後,該數據包被轉發給本地的代理進程。同樣,代理進程發送給遠程Web服務器的數據包在從防火牆外部接口發送出去之前,也要經過OUTPUT鏈的“檢查”,即與OUTPUT鏈中所有適用於eth0接口的規則一一比較。返回的過程正好與上述相反,在此就不再贅述。


爲了實現以上過程,我們必須在防火牆規則腳本中添加以下規則:
ipchains –A input –i eth1 –p tcp –s 192.168.0.2 1110 –d 192.168.0.1 8080 –j ACCEPT
ipchains –A output –i eth0 –p tcp –s 202.117.120.1 1050 –d 211.100.31.131 80 –j ACCEPT
ipchains –A input –i eth0 –p tcp !-y –s 211.100.31.131 80 –d 202.117.120.1 1050 –j ACCEPT
ipchains –A output –i eth1 –p tcp ! –y –s 192.168.0.1 8080 –d 192.168.0.2 1110 –j ACCEPT
    從上文對代理功能的原理和實現的敘述中,我們可以看出,LINUX防火牆實際上扮演了一個“代理網關”的角色。內部主機和遠程服務器分別都只與防火牆進行連接,而真正的“起點”和“終點”之間卻毫無聯繫。


3.3 IP僞裝


      IP僞裝(IP Masquerade)是LINUX操作系統自帶的又一個重要功能。通過在系統內核增添相應的僞裝模塊,內核可以自動地對經過的數據包進行“僞裝”,即修改包頭中的源目的IP信息,以使外部主機誤認爲該包是由防火牆主機發出來的。這樣做,可以有效解決使用內部保留IP的主機不能訪問互聯網的問題,同時屏蔽了內部局域網。這一點,與前面所講的代理所達到的目的是很類似的。
關於IP僞裝在LINUX防火牆內部的具體實現過程。
      steven主機的IE進程直接與遠程的Web服務器建立一個連接。當數據包到達防火牆的內部接口後,照樣要例行INPUT鏈的檢查。之後,數據包被送到FORWARD鏈,接受系統內核的“僞裝處理”,即將包頭中的源IP地址改爲防火牆外部接口eth0的地址,並在系統中做下記錄,以便一會兒對其迴應包的目的IP進行“恢復”。這樣,當該數據包順利從外部接口出來時,其包頭中源IP已被改爲202.117.120.1。遠程服務器會認爲這是從防火牆的合法地址發來的,從而對其做出響應。當遠程服務器返回的迴應包到達防火牆時,先經過INPUT鏈,然後會根據系統關於IP僞裝的記錄對數據包的目的IP進行恢復,即將202.117.120.1改爲192.168.0.2,最後再經過OUTPUT鏈返回到steven主機。


    爲了實現這個過程,我們必須在防火牆規則腳本中添加以下規則:
ipchains –A input –i eth1 –p tcp –s 192.168.0.2 1110 –d 211.100.31.131 80 –j ACCEPT
ipchains –A output –i eth0 –p tcp –s 202.117.120.1 1050 –d 211.100.31.131 80 –j ACCEPT
ipchains –A input –i eth0 –p tcp !-y –s 211.100.31.131 80 –d 202.117.120.1 1050 –j ACCEPT
ipchains –A output –i eth1 –p tcp ! –y –s 211.100.31.131 80 –d 192.168.0.2 1110 –j ACCEPT
  ipchains –A forward –i eth0 –s 192.168.0.2 1110 –d 211.100.31.131 80 –j MASQ
      與代理功能比較而言,IP僞裝不需要安裝相應的代理軟件,數據包的僞裝對用戶來說都是“透明”的,並且整個過程都是在IP層實現,因此實現速度較快。缺點是不能對經過的數據包作詳細的記錄。
以上介紹了LINUX防火牆在實際的設置中常用到的三種功能。但一般說來,用戶在創建自己的防火牆規則腳本時,可以根據自己的需要將這三種功能組合起來實現。


4      一個LINUX防火牆實例


      以下是我前一段時間爲某辦公室搭建的LINUX防火牆的實際配置,給出以供參考。
    
      有兩個局域網,LAN1地址:202.117.120.65/255.255.255.248
爲公共網絡IP,LAN2地址爲192.168.0.0/255.255.255.0,爲內部保留地址。LINUX防火牆有兩個內部接口:202.117.120.70接LAN1;192.168.0.1接LAN2。
      現對防火牆進行配置,使LAN2的主機通過IP僞裝訪問互聯網,但只允許使用外部Web代理服務器202.117.112.34的1252端口。LAN1中的主機被限制使用幾種常用的互聯網服務(DNS、SMTP、POP3、HTTP和FTP)。


下面就是創建的防火牆規則腳本:


#/etc/rc.d/rc.firewall
#!/bin/sh
# eth0---External_interface
# eth1---LAN1_interface
# eth2---LAN2_interface
echo "Starting firewalling . . ."
#Flush any existing rules from all chains
ipchains -F
#Set the default policy to deny
ipchains -P input DENY
ipchains -P output REJECT
ipchains -P forward REJECT
#Enable traffic on the loopback interface
ipchains -A input -i lo -j ACCEPT
ipchains -A output -i lo -j ACCEPT
#Enable the traffic on the eth1
ipchains -A input -i eth1 -j ACCEPT
ipchains -A output -i eth1 -j ACCEPT
#the traffic on the eth2 only enablling using the WEB PROXY
ipchains -A input -i eth2 -p tcp -s 192.168.0.0/24 1024:65535 -d 202.117.112.34 1252 -j ACCEPT
ipchains -A output -i eth2 -p tcp ! -y -s 202.117.112.34 1252 -d 192.168.0.0/24 1024:65535 -j ACCEPT
#Forwarding rules
ipchains -A forward -i eth0 -s 202.117.120.64/29  -j ACCEPT
ipchains -A forward -i eth0 -s 192.168.0.0/24  -j MASQ
ipchains -A forward -i eth1 -d 202.117.120.64/29 -j ACCEPT
#Enable outgoing the packets from LAN on the External_Interface
ipchains -A output -i eth0 -j ACCEPT
#Enable incoming some ICMP messages on eth
# 1.Dest_Unreachable,Service_Unavailable
ipchains -A input -i eth0 -p icmp -s any/0 3 -d 202.117.120.64/29 -j ACCEPT
# 2.Time_Exceeded
ipchains -A input -i eth0 -p icmp -s any/0 11 -d 202.117.120.64/29 -j ACCEPT
# 3.Allow outgoing pings to anywhere
ipchains -A input -i eth0 -p icmp -s any/0 0 -d 202.117.120.64/29 -j ACCEPT
#Enable Proxy of 202.117.112.34:1252
ipchains -A input -i eth0 -p tcp ! -y -s 202.117.112.34 1252 -j ACCEPT
#DNS (53) (DNS:202.117.112.3)—client modes
ipchains -A input -i eth0 -p udp -s 202.117.112.3 53 -d 202.117.120.64/29 1024:65535 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s 202.117.112.3 53 -d 202.117.120.64/29 1024:65535 -j ACCEPT
#SMTP(25)Enable sending mail through a remote SMTP gateway
ipchains -A input -i eth0 -p tcp ! -y -s any/0 25 -d 202.117.120.64/29 1024:65535 -j ACCEPT
#POP(110)--Enable receiving mail from a remote POP server
ipchains -A input -i eth0 -p tcp ! -y -s any/0 110 -d 202.117.120.64/29 1024:65535 -j ACCEPT
#HTTP(80) --Enable accessing remote WEB sites as a client
ipchains -A input -i eth0 -p tcp ! -y -s any/0 80 -d 202.117.120.64/29 1024:65535 -j ACCEPT
#FTP(20,21) --Enable accessing remote FTP servers
ipchains -A input -i eth0 -p tcp ! -y -s any/0 21 -d 202.117.120.64/29 1024:65535 -j ACCEPT
ipchains -A input -i eth0 -p tcp -s any/0 20 -d 202.117.120.64/29 1024:65535 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 1024:65535 -d 202.117.120.64/29 1024:65535 -j ACCEPT
echo "done"
exit 0

 

 

5  結束語


      本文着重從防火牆內部工作過程的角度分別對LINUX防火牆的包過濾、代理以及IP僞裝功能進行了剖析,同時涉及到了一些網絡配置、用ipchains具體實現等方面的內容。文末給出的實例已在實際中調試通過。
   


 

參考文獻


1  Robert L.Ziegler,《Linux防火牆》人民郵電出版社,2000.10
2  W.Richard Stevens,《TCP/IP詳解 卷一:協議》機械工業出版社,2000.4.1
3  Rusty Russell,“Linux IPCHAINS-HOWTO”,netfilter.samba.org,Jul 4,2000
5      Rawn Shah,“Using your old Pentiums and Linux to create a Firewall”,Independent
6      technologist and freelance journalist,September,1999

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章