Linux -- 系統安全之Iptables防火牆(2)

1、iptables防水牆的實現方式及iptables命令的格式
web


iptables防火牆介紹瀏覽器

netfilter/iptables是Linux系統提供的一個很是優秀的防火牆工具,它徹底免費、功能強大、使用靈活、佔用系統資源少,能夠對通過的數據進行很是細緻的控制。本節首先介紹有關iptables防火牆的基本知識,包括netfilter框架、iptables防火牆結構與原理、iptables命令格式等內容。安全

netfilter框架服務器

Linux內核包含了一個強大的網絡子系統,名爲netfilter,它能夠爲iptables內核防火牆模塊提供有狀態或無狀態的包過濾服務,如NAT、IP假裝等,也能夠因高級路由或鏈接狀態管理的須要而修改IP頭信息。netfilter位於Linux網絡層和防火牆內核模塊之間,如圖9-1所示。網絡

114008797.jpg

雖然防火牆模塊構建在Linux內核,而且要對流經IP層的數據包進行處理,但它並無改變IP協議棧的代碼,而是經過netfilter模塊將防火牆的功能引入IP層,從而實現防火牆代碼和IP協議棧代碼的徹底分離。netfilter模塊的結構如圖9-2所示。框架

114018622.jpg

對IPv4協議來講,netfilter在IP數據包處理流程的5個關鍵位置定義了5個鉤子(hook)函數。當數據包流經這些關鍵位置時,相應的鉤子函數就被調用。從圖9-2中能夠看到,數據包從左邊進入IP協議棧,進行IP校驗之後,數據包被第一個鉤子函數PRE_ROUTING處理,而後就進入路由模塊,由其決定該數據包是轉發出去仍是送給本機。ssh

若該數據包是送給本機的,則要通過鉤子函數LOCAL_IN處理後傳遞給本機的上層協議;若該數據包應該被轉發,則它將被鉤子函數FORWARD處理,而後還要經鉤子函數POST_ROUTING處理後才能傳輸到網絡。本機進程產生的數據包要先通過鉤子函數LOCAL_OUT處理後,再進行路由選擇處理,而後通過鉤子函數POST_ROUTING處理後再發送到網絡。tcp

說明:內核模塊能夠將本身的函數註冊到鉤子函數中,每當有數據包通過該鉤子點時,鉤子函數就會按照優先級依次調用這些註冊的函數,從而可使其餘內核模塊參與對數據包的處理。這些處理能夠是包過濾、NAT以及用戶自定義的一些功能。ide


iptables防火牆內核模塊函數

netfilter框架爲內核模塊參與IP層數據包處理提供了很大的方便,內核的防火牆模塊正是經過把本身的函數註冊到netfilter的鉤子函數這種方式介入了對數據包的處理。這些函數的功能很是強大,按照功能來分的話主要有4種,包括鏈接跟蹤、數據包過濾、網絡地址轉換(NAT)和對數據包進行修改。其中,NAT還分爲SNAT和DNAT,分別表示源網絡地址轉換和目的網絡地址轉換,內核防火牆模塊函數的具體分佈狀況如圖9-3所示。

由圖9-3能夠看出,防火牆模塊在netfilter的LOCAL_IN、FORWARD和LOCAL_OUT 3個位置分別註冊了數據包過濾函數,數據包通過這些位置時,防火牆模塊要對數據包進行過濾。這三個位置也稱爲三條鏈,名稱分別爲INPUT、FORWARD和OUTPUT,它們共同組成了一張過濾表,每條鏈能夠包含各類規則,每一條規則都包含0個或多個匹配以及一個動做。當數據包知足全部的匹配時,則過濾函數將執行設定的動做,以便對數據包進行過濾的。

114124688.jpg

注意:這些規則的次序是很重要的,過濾函數對數據包執行了某一規則動做後,對數據包的處理即告結束,即便這個數據包還知足後面其餘規則的全部匹配,也不會執行那些規則所設定的動做。

從圖9-3中能夠看出,除了過濾表之外,在PRE_ROUTING、LOCAL_OUT和POST_ ROUTING 3個位置各有一條有關NAT的鏈,名稱分別爲PREROUTING、OUTPUT和POSTROUTING,它們組成了NAT表。NAT鏈裏面也能夠包含各類規則,它指出瞭如何對數據包的地址進行轉換。

此外,5個鉤子函數位置的mangle鏈還組成了一張mangle表,這個表的主要功能是根據規則修改數據包的一些標誌位,例如TTL、TOS等,也能夠在內核空間爲數據包設置一些標誌。防火牆內的其餘規則或程序(如tc等)能夠利用這種標誌對數據包進行過濾或高級路由。

以上介紹的是iptables防火牆的內部結構,Linux系統還提供了iptables防火牆的用戶接口,它能夠在上述各張表所包含的鏈中添加規則,或者修改、刪除規則,從而能夠根據須要構建本身的防火牆。具體來講,用戶是經過輸入iptables命令來實現上述功能的。


iptables命令格式

在RHEL 5中,iptables命令由iptables-1.3.5-1.2.1軟件包提供,默認時,系統已經安裝了該軟件包,所以,用戶能夠直接輸入iptables命令對防火牆中的規則進行管理。iptables命令至關複雜,具體格式以下所示。

iptables [-t 表名] <命令> [鏈名] [規則號] [規則] [-j 目標]

-t選項用於指定所使用的表,iptables防火牆默認有filter、nat和mangle 3張表,也能夠是用戶自定義的表。表中包含了分佈在各個位置的鏈,iptables命令所管理的規則就是存在於各類鏈中的。該選項不是必需的,若是未指定一個具體的表,則默認使用的是filter表。

命令選項是必需要有的,它告訴iptables要作什麼事情,是添加規則、修改規則仍是刪除規則。有些命令選項後面要指定具體的鏈名稱,而有些能夠省略,此時,是對全部的鏈進行操做。還有一些命令要指定規則號。具體的命令選項名稱及其與後續選項的搭配形式以下所示。


iptables命令格式中的規則部分由不少選項構成,主要指定一些IP數據包的特徵。例如,上一層的協議名稱、源IP地址、目的IP地址、進出的網絡接口名稱等,下面列出構成規則的常見選項。

-p<協議類型>:指定上一層協議,能夠是icmp、tcp、udp和all。

-s<IP地址/掩碼>:指定源IP地址或子網。

-d<IP地址/掩碼>:指定目的IP地址或子網。

-i<網絡接口>:指定數據包進入的網絡接口名稱。

-o<網絡接口>:指定數據包出去的網絡接口名稱。

注意:上述選項能夠進行組合,每一種選項後面的參數前能夠加"!",表示取反。

對於-p選項來講,肯定了協議名稱後,還能夠有進一步的子選項,以指定更細的數據包特徵。常見的子選項以下所示。

-p tcp --sport <port>:指定TCP數據包的源端口。

-p tcp --dport <port>:指定TCP數據包的目的端口。

-p tcp --syn:具備SYN標誌的TCP數據包,該數據包要發起一個新的TCP鏈接。

-p udp --sport <port>:指定UDP數據包的源端口。

-p udp --dport <port>:指定UDP數據包的目的端口。

-p icmp --icmp-type <type>:指定icmp數據包的類型,能夠是echo-reply、echo-request等。

上述選項中,port能夠是單個端口號,也能夠是以port1:port2表示的端口範圍。每一選項後的參數能夠加"!",表示取反。

上面介紹的這些規則選項都是iptables內置的,iptables軟件包還提供了一套擴展的規則選項。使用時須要經過-m選項指定模塊的名稱,再使用該模塊提供的選項。

最後,iptables命令中的-j選項能夠對知足規則的數據包執行指定的操做,其後的"目標"能夠是如下內容。

-j ACCEPT:將與規則匹配的數據包放行,而且該數據包將再也不與其餘規則匹配,而是跳向下一條鏈繼續處理。

-j REJECT:拒絕所匹配的數據包,並向該數據包的發送者回復一個ICMP錯誤通知。該處理動做完成後,數據包將再也不與其餘規則匹配,並且也不跳向下一條鏈。

-j DROP:丟棄所匹配的數據包,不回覆錯誤通知。該處理動做完成後,數據包將再也不與其餘規則匹配,並且也不跳向下一條鏈。

-j REDIRECT:將匹配的數據包重定向到另外一個位置,該動做完成後,會繼續與其餘規則進行匹配。

-j LOG:將與規則匹配的數據包的相關信息記錄在日誌(/var/log/message)中,並繼續與其餘規則匹配。

-j <規則鏈名稱>:數據包將會傳遞到另外一規則鏈,並與該鏈中的規則進行匹配。

除了上述目標動做外,還有一些與NAT有關的目標,將在9.4節中講述。全部的目標也能夠經過查看iptables命令的手冊頁得到。


2、用iptables命令配置主機防火牆、網絡防火牆

iptables主機防火牆

主機防火牆主要用於保護防火牆所在的主機免受外界的***,當一臺服務器爲外界提供比較重要的服務,或者一臺客戶機在不安全的網絡環境中使用時,都須要在計算機上安裝防火牆。本節主要介紹iptables主機防火牆規則的配置,包括iptables防火牆的運行與管理、RHEL 5默認防火牆規則的解釋、用戶根據須要添加本身的防火牆規則等內容。

9.2.1  iptables防火牆的運行與管理

RHEL 5默認安裝時,已經在系統中安裝了iptables軟件包,能夠用如下命令查看。

[root@localhost ~]# rpm -qa | grep iptables  iptables-1.3.5-1.2.1  iptables-ipv6-1.3.5-1.2.1  #

通常狀況下,iptable開機時都已經默認運行,但與其餘一些服務不一樣,iptables的功能是管理內核中的防火牆規則,不須要常駐內存的進程。若是對防火牆的配置作了修改,而且想保存已經配置的iptables規則,可使用如下命令。

# /etc/rc.d/init.d/iptables save

此時,全部正在使用的防火牆規則將保存到/etc/sysconfig/iptables文件中,能夠用如下命令查看該文件的內容。

 
 
  1. # more /etc/sysconfig/iptables  

  2. # Generated by iptables-save v1.3.5 on Fri Jan 16 14:58:31 2009  

  3. *filter  

  4. :INPUT ACCEPT [0:0]  

  5. :FORWARD ACCEPT [0:0]  

  6. :OUTPUT ACCEPT [2237:2371316]  

  7. :RH-Firewall-1-INPUT - [0:0]  

  8. -A INPUT -j RH-Firewall-1-INPUT   

  9. -A FORWARD -j RH-Firewall-1-INPUT   

  10. -A RH-Firewall-1-INPUT -i lo -j ACCEPT   

  11. -A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT   

  12. -A RH-Firewall-1-INPUT -p esp -j ACCEPT   

  13. -A RH-Firewall-1-INPUT -p ah -j ACCEPT   

  14. -A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT   

  15. -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT   

  16. -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT   

  17. -A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT   

  18. -A RH-Firewall-1-INPUT -p tcp -m state --state NEW 
    -m tcp --dport 21 -j ACCEPT   

  19. -A RH-Firewall-1-INPUT -p tcp -m state --state NEW 
    -m tcp --dport 22 -j ACCEPT   

  20. -A RH-Firewall-1-INPUT -p tcp -m state --state NEW 
    -m tcp --dport 80 -j ACCEPT   

  21. -A RH-Firewall-1-INPUT -p tcp -m state --state NEW 
    -m tcp --dport 25 -j ACCEPT   

  22. -A RH-Firewall-1-INPUT -p tcp -m state --state NEW
    -m tcp --dport 808 -j ACCEPT   

  23. -A RH-Firewall-1-INPUT -p tcp -m state --state NEW 
    -m tcp --dport 8080 -j ACCEPT 

能夠看到,/etc/sysconfig/iptables文件中包含了一些iptables規則,這些規則的形式與iptables命令相似,但也有區別。

注意:通常不建議用戶手工修改這個文件的內容,這個文件只用於保存啓動iptables時,須要自動應用的防火牆規則。

能夠看到,/etc/sysconfig/iptables文件中包含了一些iptables規則,這些規則的形式與iptables命令相似,但也有區別。

注意:通常不建議用戶手工修改這個文件的內容,這個文件只用於保存啓動iptables時,須要自動應用的防火牆規則。

以上看到的其實是默認安裝RHEL 5時該文件中的內容,其所肯定的規則的解釋見9.2.2小節。還有一種保存iptables規則的方法是使用iptables-save命令,格式以下:

# iptables-save > abc

此時,正在使用的防火牆規則將保存到abc文件中。若是但願再次運行iptables,可使用如下命令。

# /etc/rc.d/init.d/iptables start

上述命令其實是清空防火牆全部規則後,再按/etc/sysconfig/iptables文件的內容從新設定防火牆規則。還有一種復原防火牆規則的命令以下:

# iptables-restore < abc

此時,由iptables-save命令保存在abc文件中的規則將從新載入到防火牆中。若是使用如下命令,將中止iptables的運行。

# /etc/rc.d/init.d/iptables stop

RHEL 5開機時默認的防火牆規則

在Linux系統中,能夠經過使用iptables命令構建各類類型的防火牆。RHEL 5操做系統默認安裝時,iptables防火牆已經安裝,而且開機後會自動添加了一些規則,這些規則其實是由/etc/sysconfig目錄中的iptables文件決定的。能夠經過"iptables -L"命令查看這些默認添加的規則。

 
 
  1. # iptables -L  

  2. Chain INPUT (policy ACCEPT)                 #INPUT鏈中的規則  

  3. target                prot opt source                destination           

  4. RH-Firewall-1-INPUT  all  --  anywhere             anywhere         #規則1  

  5.  

  6. Chain FORWARD (policy ACCEPT)               # FORWARD鏈中的規則  

  7. target                prot opt source               destination            

  8. RH-Firewall-1-INPUT  all  --  anywhere             anywhere             #規則2  

  9.  

  10. Chain OUTPUT (policy ACCEPT)                # OUTPUT鏈中的規則  

  11. target                prot opt source               destination           

  12.  

  13. Chain RH-Firewall-1-INPUT (2 references)    #自定義的
    RH-Firewall-1-INPUT鏈  

  14.                                              中的規則,
    被其餘鏈引用兩次  

  15. target        prot opt  source               destination           

  16. ACCEPT     all   --  anywhere             anywhere     
    #規則3  

  17. ACCEPT     icmp --  anywhere             anywhere    
    icmp any          #規則4  

  18. ACCEPT     esp  --  anywhere             anywhere      
    #規則5  

  19. ACCEPT     ah   --  anywhere             anywhere        
    #規則6  

  20. ACCEPT     udp  --  anywhere             224.0.0.251   
    udp dpt:mdns     #規則7  

  21. ACCEPT     udp  --  anywhere             anywhere     
    udp dpt:ipp       #規則8  

  22. ACCEPT     tcp   --  anywhere             anywhere    
    tcp dpt:ipp      #規則9  

  23. ACCEPT     all  --  anywhere  anywhere  state RELATED,
    ESTABLISHED  #規則10  

  24. ACCEPT     tcp   --  anywhere  anywhere    state NEW 
    tcp dpt:ftp    #規則11  

  25. ACCEPT     tcp   --  anywhere  anywhere     state NEW 
    tcp dpt:ssh   #規則12  

  26. ACCEPT     tcp   --  anywhere   anywhere     state NEW 
    tcp dpt:http #規則13  

  27. ACCEPT     tcp   --  anywhere    anywhere    state NEW 
    tcp dpt:smtp  #規則14  

  28. REJECT     all    --  anywhere      anywhere  
    reject-with icmp-host-   

  29.                                                  
    prohibited     #規則15  

因爲上面的iptables命令沒有用-t選項指明哪一張表,也沒有指明是哪一條鏈,所以默認列出的是filter表中的規則鏈。由以上結果能夠看出,filter表中總共有4條鏈。其中,INPUT、FORWARD和OUTPUT鏈是內置的,而RH-Firewall-1-INPUT鏈是用戶本身添加的。

1.規則列

在前面列出的防水牆規則中,每一條規則列出了5項內容。target列表示規則的動做目標。prot列表示該規則指定的上層協議名稱,all表示全部的協議。opt列出了規則的一些選項。source列表示數據包的源IP地址或子網,而destination列表示數據包的目的IP地址或子網,anywhere表示全部的地址。除了上述5列之外,若是存在,每一條規則的最後還要列出一些子選項,如RH-Firewall-1-INPUT鏈中的規則4等。

若是執行iptables命令時加了-v選項,則還能夠列出每一條規則當前匹配的數據包數、字節數,以及要求數據包進來和出去的網絡接口。若是加上-n選項,則不對顯示結果中的IP地址和端口作名稱解析,直接以數字的形式顯示。還有,若是加上"--line-number"選項,能夠在第一列顯示每條規則的規則號。

2.規則解釋

INPUT鏈中的規則1其target列的內容是RH-Firewall-1-INPUT,opt列是all,source和destination列均爲anywhere,表示全部的數據包都交給自定義的RH-Firewall-1-INPUT鏈去處理。FORWARD鏈的規則2與規則1徹底同樣。OUTPUT鏈中沒有規則。

在自定義的RH-Firewall-1-INPUT鏈中,列出了不少的規則,規則3表示接收全部的數據包。須要注意的是,若是在iptables中加-v選項列出這條規則時,將會看到in列是lo,即要求數據包是從環回接口中進來的,而不是任意網絡接口進來的數據包都接收。

規則4表示全部icmp數據包都接收,即其餘計算機ping本機時,予以接收,並且在OUTPUT鏈中沒有規則,所以本機的ICMP回覆數據包也能順利地進入網絡,被對方收到。規則5和規則6表示接收全部的esp和ah協議的數據包,這兩種協議屬於IPv6協議。

規則7表示目的地址是224.0.0.251,目的端口是mdns的UDP數據包容許經過。224.0.0.251是一種組播地址,mdns是端口號的一種名稱。若是執行iptables命令時加了-n選項,則會顯示數字5353,它是組播地址的DNS端口。

規則8和規則9表示容許全部目的端口是ipp的UDP和TCP數據包經過,ipp是端口631的名稱解析,它是用於網絡打印服務的端口。規則10表示全部狀態是RELATED和ESTABLISHED的數據包經過,RELATED狀態表示數據包要新建一個鏈接,並且這個要新建的鏈接與現存的鏈接是相關的,如FTP的數據鏈接。ESTABLISHED表示本機與對方創建鏈接時,對方迴應的數據包。

規則11至規則14表示容許目的端口是ftp、ssh、http和smtp,狀態是NEW的TCP數據包經過,狀態爲NEW即意味着這個TCP數據包將與主機發起一個TCP鏈接。這幾條規則的端口對應的都是最多見的網絡服務,它們的端口號分別是2一、2二、80和25。最後一條規則15表示拒絕全部的數據包,並向對方迴應icmp-host-prohibited數據包。

3.補充解釋

須要再次提醒的是,這些規則是有次序的。當一個數據包進入RH-Firewall-1-INPUT鏈後,將依次與規則3至規則15進行比較。按照這些規則的目標設置,若是數據包能與規則3至14中的任一條匹配,則該數據包將被接收。若是都不能匹配,則確定能和規則15匹配,因而數據包被拒絕。

因爲RH-Firewall-1-INPUT鏈是被INPUT鏈調用的,若是要返回到INPUT鏈,須要執行名爲RETURN的目標動做。

說明:在FORWARD鏈中也調用了RH-Firewall-1-INPUT鏈,即數據包若是不是發送給本機的,當通過FORWARD鏈時,還要進入RH-Firewall-1-INPUT鏈,與規則3到規則15再次進行匹配。

管理主機防火牆規則

能夠有不少功能種類的防火牆,有些是安裝在某一臺主機上,主要用於保護主機自己的安全;有些是安裝在網絡中的某一節點,專門用於保護網絡中其餘計算機的安全;也有一些能夠爲內網的客戶機提供NAT服務,使內網的客戶機共用一個公網IP,以便節省IP地址資源。下面首先介紹一下主機防火牆的應用示例。

當一臺服務器爲外界提供比較重要的服務,或者一臺客戶機在不安全的網絡環境中使用時,都須要在計算機上安裝防火牆,以最大限度地防止主機受到外界的***。9.2.2小節介紹的開機時默認的防火牆設置很是典型,用戶能夠根據本身主機的功能關閉已經開放的端口,或者開放更多的端口,以便容許符合更多規則的數據包經過。

例如,爲了使主機能爲外界提供telnet服務,除了配置好telnet服務器外,還須要開放TCP23號端口。由於在默認的防火牆配置中,並不容許目的端口爲23的TCP數據包進入主機。爲了開放TCP23號端口,能夠有兩種辦法,一種是在RH-Firewall-1-INPUT鏈中加入相應的規則,還有一種是把規則加到INPUT鏈中。但須要注意的是,規則是有次序的,若是使用如下命令,則是沒有效果的。

# iptables -A RH-Firewall-1-INPUT -p tcp --dport 23 -j ACCEPT

上述命令執行後,能夠再次查看規則狀況。

 
 
  1. # iptables -L -n --line-number  

  2. …  

  3. Chain RH-Firewall-1-INPUT (2 references)  

  4. num  target       prot opt  source            destination           

  5. …  

  6. 11   ACCEPT     tcp  --  0.0.0.0/0        0.0.0.0/0    
    state NEW tcp dpt:80   

  7. 12   ACCEPT     tcp  --  0.0.0.0/0        0.0.0.0/0   
    state NEW tcp dpt:25   

  8. 13   REJECT     all  --  0.0.0.0/0        0.0.0.0/0   
    reject-with icmp-host-   

  9.                                                     
    prohibited    

  10. 14   ACCEPT     tcp  --  0.0.0.0/0        0.0.0.0/0 
    tcp dpt:23  

  11.                                                    
    # 新添加的規則  

能夠看到,新添加的規則位於最後的位置。因爲全部的數據包均可以與目標動做爲REJECT的規則號爲13的規則匹配,而REJECT表明的是拒絕,所以數據包到達新添加的規則前確定已被丟棄,這條規則是不會被使用的。爲了解決這個問題,須要把上述規則插入到現有的規則中,要位於規則13的前面。下面是正確的開放TCP23號端口的命令。

# iptables -I RH-Firewall-1-INPUT 11 -p tcp --dport 23 -j ACCEPT

以上命令中,"-I RH-Firewall-1-INPUT 11"表示在RH-Firewall-1-INPUT鏈原來的規則11前面插入一條新規則,規則內容是接受目的端口爲23的TCP數據包。爲了刪除前面添加的無效規則,能夠執行如下命令。

# iptables -D RH-Firewall-1-INPUT 15

15是第一次添加的那條無效規則此時的規則號,也多是其餘的數值,可根據具體顯示結果加以改變。若是但願新加的規則與原來的規則十一、12等相似,能夠執行如下命令。

 
 
  1. # iptables -I RH-Firewall-1-INPUT 11 -m state 
    --state NEW -p tcp --dport 23 -j ACCEPT 

以上是在RH-Firewall-1-INPUT鏈中添加規則,以開放TCP23號端口。還有一種開放TCP23號端口的方法是在INPUT鏈中添加規則,具體命令以下所示。

 
 
  1. # iptables -I INPUT 1 -p tcp --dport 23 -j ACCEPT  

  2. # iptables -L --line-number  

  3. Chain INPUT (policy ACCEPT)  

  4. num  target             prot opt    source          destination           

  5. 1    ACCEPT                 tcp   --    anywhere    
    anywhere    tcp dpt:telnet   

  6. 2    RH-Firewall-1-INPUT    all   --    anywhere    anywhere  

  7. … 

注意:添加的規則也要位於原來規則2的前面,不然,任何數據包都匹配規則2,將會跳到RH-Firewall-1-INPUT鏈,而且再也不回來。所以,添加在規則2後面的規則都是無效的。

前面介紹的是在RHEL5默認防火牆規則的基礎上添加用戶本身的防火牆規則,以開放TCP23號端口。在不少的時候,用戶可能但願從最初的狀態開始,構建本身的防火牆。爲了從零開始設置iptables防火牆,能夠用如下命令清空防火牆中全部的規則。

# iptables -F

而後再根據要求,添加本身的防火牆規則。通常狀況下,保護防火牆所在主機的規則都添加在INPUT內置鏈中,以擋住外界訪問本機的部分數據包。本機向外發送的數據包只通過OUTPUT鏈,通常不予限制。若是不但願本機爲外界數據包提供路由轉發功能,能夠在FORWARD鏈中添加一條拒絕一切數據包經過的規則,或者乾脆在內核中設置不轉發任何數據包。

經常使用的主機防火牆規則

當設置主機防火牆時,通常採起先放行,最後所有禁止的方法。也就是說,根據主機的特色,規劃出容許進入主機的外界數據包,而後設計規則放行這些數據包。若是某一數據包與放行數據包的規則都不匹配,則與最後一條禁止訪問的規則匹配,被拒絕進入主機。下面列出一些主機防火牆中經常使用的iptables命令及其解釋,這些命令添加的規則都放在filter表的INPUT鏈中。

示例1:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

功能:容許目的端口爲80的TCP數據包經過INPUT鏈。

說明:這種數據包通常是用來訪問主機的Web服務,若是主機以默認的端口提供Web服務,應該用這條規則開放TCP80端口。

使用圖形界面管理主機防火牆規則

爲了使初學者也能構建iptables主機防火牆,在RHEL 5中,還爲用戶提供了配置主機防火牆的圖形界面。在RHEL 5桌面環境下,選擇"系統"|"管理"|"安全級別和防火牆"命令後,將出現圖9-4所示的對話框。

在圖9-4中,名爲"信任的服務"的列表框中列出了常見的網絡服務名稱,前面打勾的服務所對應的網絡端口是開放的,容許外界的用戶訪問。若是用戶須要開放更多的端口,能夠在列出的服務名稱前的框內單擊鼠標,打上勾後再單擊"應用"按鈕便可。

此外,窗口中還提供了啓用或禁用防水牆的選擇菜單,如圖9-5所示。還有,若是在圖9-4中單擊了"其餘端口"標籤,將在下面出現如圖9-5所示的一個列表框和"添加"、"刪除"按鈕,用於添加和刪除"信任的服務"列表框中未列出的端口。

120350610.jpg

120401370.jpg

在圖9-5中,若是單擊"添加"按鈕,將出現圖9-6所示的對話框。此時,能夠輸入須要開放的端口號,並選擇TCP或UDP協議,而後單擊"肯定"按鈕,將返回到圖9-5所示的防火牆設置對話框,而後在"其餘端口"列表框中將出現所添加的端口號和協議名稱。單擊"刪除"按鈕能夠刪除列表框中選中的端口。爲了使添加或刪除端口生效,須要單擊圖9-5中的"應用"按鈕,此時將出現圖9-7所示的對話框,要求用戶確認該操做。

120427386.jpg

120438814.jpg

以上是經過圖形界面管理主機防火牆規則,實際的結果和命令方式是同樣的。例如,若是剛纔在圖9-6所示的窗口中輸入8080端口並選擇TCP協議,而後再到終端查看防火牆中的規則時,將會發現以下結果。

[root@localhost sysconfig]# iptables -L --line-number  …  11   ACCEPT     tcp  --  anywhere     anywhere   state NEW tcp dpt:http   12   ACCEPT     tcp  --  anywhere     anywhere   state NEW tcp dpt:smtp   13   ACCEPT     tcp  --  anywhere     anywhere   state NEW tcp dpt:webcache   14   REJECT   all  --  anywhere   anywhere  reject-with icmp-host-   prohibited   #

從以上結果能夠看出,與初始的設置相比,規則13原來是沒有的,它是剛纔經過圖形界面操做後添加的。也就是說,剛纔的圖形界面操做至關於輸入瞭如下命令。

 
 
  1. iptables -I RH-Firewall-1-INPUT 13 -m state -
    -state NEW -m tcp -p tcp --dport 8080 -j ACCEPT 

說明:實際上,RHEL5提供的防火牆圖形界面管理功能很是有限,遠不如命令方式功能豐富。


iptables網絡防火牆配置

與主機防火牆不同,網絡防火牆主要用於保護內部網絡的安全,此時,通常由一臺專門的主機承擔防火牆角色,有時還要承擔網絡地址轉換(NAT)的功能,其配置要比主機防火牆複雜。本節主要講述有關網絡防火牆的過濾配置,以及經過給數據包作標誌的方法進行策略路由的例子。

保護服務器子網的防火牆規則

與主機防火牆不同,保護網絡的防火牆通常有多個網絡接口,並且絕大部分的規則應該添加在filter表的FORWARD鏈中,其配置要比主機防火牆複雜得多。爲了使iptables承擔網絡防火牆的角色,首先要確保Linux可以在各個網絡接口之間轉發數據包,其方法是輸入如下命令,使ip_forward文件的內容爲1。

echo "1">/proc/sys/net/ipv4/ip_forward

上述命令的結果在系統重啓後會失效。爲了使系統在每次開機後能自動激活IP數據包轉發功能,須要編輯配置文件/etc/sysctl.conf,它是RHEL 5的內核參數配置文件,其中包含了ip_forward參數的配置。具體方法是確保在/etc/sysctl.conf文件中有如下一行:

net.ipv4.ip_forward = 1

即原來的值若是是0的,現把它改成1。而後執行如下命令使之生效:

# sysctl -p

上述命令的功能是實時修改內核運行時的參數。IP數據包轉發功能激活後,就能夠設置網絡防火牆規則了。下面以圖9-8所示的網絡結構爲例,介紹iptables網絡防火牆的配置方法。

在圖9-8中,安裝了iptables的Linux主機安裝了3塊網卡。其中,eth0的IP地址是192.168.0.1,它經過一臺網關設備與Internet鏈接;eth1的IP地址是10.10.1.1,它與子網10.10.1.0/24鏈接;eth2的IP地址是10.10.2.1,它鏈接的子網是10.10.2.0/24。

125641145.jpg

現假設10.10.1.0/24子網裏運行的是爲外界提供網絡服務的服務器,而10.10.2.0/24子網裏的計算機是用戶上網用的客戶機。對於服務器來講,它向外提供服務的端口號是固定的,爲了保證其安全,應該只開放這些端口,即只容許目的端口是這些端口的數據包進入服務器子網,其他的數據包一概禁止。下面是一些在防火牆上執行的保護服務器子網的iptables命令。

iptables -A FORWARD -p tcp --dport 22 -i eth0 -o eth1 -j ACCEPT  iptables -A FORWARD -p tcp --dport 25 -i eth0 -o eth1 -j ACCEPT  iptables -A FORWARD -p udp --dport 53 -i eth0 -o eth1 -j ACCEPT  iptables -A FORWARD -p tcp --dport 80 -i eth0 -o eth1 -j ACCEPT

假設服務器子網採用默認端口爲外界提供了SSH、SMTP、DNS和HTTP服務,以上4條命令在filter表的FORWARD鏈中加入了4條規則,容許從eth0網進入、到eth1網卡,而且協議和目的端口分別是TCP2二、TCP2五、UDP53和TCP80的數據包經過,這些協議和端口對應了該子網提供的網絡服務。

以上4條命令肯定了從eth0到eth1轉發數據包的規則。這些數據包是進入服務器子網的數據包,而從服務器子網出去的數據包目前仍是暢通無阻的,由於FORWARD鏈中尚未規則對eth1到eth0的數據包作任何限制。

須要注意的是,前面的規則規定了放行哪些數據包後,最後必需要有一條規則拒絕全部的數據包。不然,即便數據包與前面全部的規則都不匹配,最後也照樣能被轉發。所以,爲了達到保護服務器子網的目的,還須要執行如下命令。

iptables -A FORWARD -i eth0 -o eth1 -j DROP

以上命令把從網卡eth0到eth1的數據包所有丟棄,固然,這些數據包是那些與前面的規則都不匹配的數據包。此外,也能夠用如下命令指定FORWARD鏈的默認目標動做來代替上述命令。

iptables -P FORWARD DROP

上面命令的意思是與全部規則都不匹配的數據包將採用DROP目標動做予以丟棄,對於只保護服務器子網的防火牆來講,能夠這樣作。

注意:因爲圖9-8的網絡結構中還要爲10.10.2.0/24子網的客戶機提供上網服務。若是設定默認目標動做爲DROP,須要添加明確的規則放行該子網的數據包。

另外,若是發現某些計算機,如IP爲11.22.33.44的計算機對服務器子網有***行爲,防火牆能夠不轉發這些數據,把它阻擋在防火牆的外面,命令以下:

iptables -A FORWARD -i eth0 -o eth1 -s 11.22.33.44 -j DROP

或者若是發現服務器子網發往某一臺主機,如55.66.77.88的數據流量特別大,出現了異常狀況,能夠執行如下命令,限制其流量。此時,數據流嚮應該是從eth1到eth0。

 
 
  1. iptables -A FORWARD -i eth1 -o eth0 -d 55.66.
    77.88 -m limit --limit 60/m --limit-burst 80 -j ACCEPT 

網卡eth0收到的是來自Internet的數據包,所以,對它們做了嚴格的限制。但對於來自10.10.2.0/24子網的數據包來講,其限制應該相對寬鬆,由於它是內網。下面是幾條有關內網到服務器子網的轉發規則的設置命令。

iptables -A FORWARD -i eth2 -o eth1 -m multiport --dport 1:1024,2049,32768 -j ACCEPT  iptables -A FORWARD -i eth2 -o eth1 -s 10.10.2.2 -j ACCEPT  iptables -A FORWARD -i eth2 -o eth1 -s 10.10.2.3 -j ACCEPT

上面的第一條命令容許來自eth2網卡的數據包轉發到服務器子網eth1網卡,前提是數據包的目的端口號是1至102四、2049或者32768。1至1024包含了大部分網絡服務默認使用的端口,2049和32768是NFS服務器工做時須要開放的端口。第二條和第三條命令容許源IP地址是10.10.2.2或10.10.2.3數據包經過,這兩臺計算機多是由管理員使用的。

也有一些服務要使用1024號以上的端口,能夠採用相似的命令加入規則,以開放這些端口。最後,若是不是採用-P選項指定默認的DROP策略,還須要在FORWARD鏈中加入如下命令,以拒絕全部不匹配的數據包。

iptables -A FORWARD -i eth2 -o eth1 -j DROP

上面的這條命令也能夠和前面的"iptables -A FORWARD -i eth0 -o eth1 -j DROP"命令合併在一塊兒,成爲如下命令。

iptables -A FORWARD -o eth1 -j DROP

顯然,上面這條命令指定的規則應該放在最後的位置。另外,每一臺主機還能夠根據本身的特色設置本身的主機防火牆,以提供更多的保護。

護內部客戶機的防火牆規則

上個小節介紹的是針對服務器子網的防火牆配置,側重點是如何對其進行保護。所以,規則排列的特色是先放行指定的數據包,再拒絕全部的數據包。但對於圖9-8中的子網10.10.2.0/24來講,配置的原則應該是不同的,由於這個子網中的計算機是用戶上網的計算機,爲了給用戶提供儘可能多的上網功能,應該放行全部的數據包,但事先要對部分有問題的數據包進行拒絕。

要限制的數據包分爲兩類,一類是限制用戶對Internet上某些內容的訪問,還有一類是不容許Internet上的某些內容進入該子網。前者的數據包是從網卡eth2到eth0,然後者應該是從eth0到eth2。例如,若是不但願內網的計算機使用QQ,可使用如下命令進行限制。

iptables -A FORWARD -p UDP --dport 8000 -i eth2 -o eth0 -j DROP

說明:UDP協議8000號端口是QQ客戶端登陸服務器時使用的目的端口,該命令限制內網的計算機向外發送目的端口是8000的數據包。

下面的這條命令與上面命令功能相同,但它限制的是進來的數據包,客戶端發起登陸請求的數據包仍是能經過的,效果不如上面那條命令好。

iptables -A FORWARD -p UDP --sport 8000 -i eth0 -o eth2 -j DROP

但實際上,目前QQ也能夠經過TCP協議的80和443端口進行登陸,而這兩個端口是不能封的,不然,用戶的瀏覽器將不能訪問網站。所以,比較可靠的方法是封鎖訪問QQ服務器IP地址的數據包,具體命令以下:

iptables -A FORWARD -p tcp -d 60.191.124.236 -i eth2 -o eth0 -j DROP  iptables -A FORWARD -p tcp -d 58.60.15.38 -i eth2 -o eth0 -j DROP  …

60.191.124.236和58.60.15.38等IP址是QQ服務器的地址,有幾十個IP,並且是動態變化的,須要即時蒐集更新。此外,若是有些網站或者其餘服務器也不容許內網的用戶訪問,能夠查出其IP地址後,使用相似的命令進行限制。有些計算機病毒或***程序要使用固定的端口進行傳播或通訊,爲了保護內網不受這些程序的影響,須要把這部分端口封掉,例子命令以下所示。

 
 
  1. iptables -A FORWARD -i eth0 -o eth2 -m multiport 
    --dport 135:139,445,593,5554 -j DROP 

135至139是Windows網絡共享使用的端口號,爲了防止內網數據可能會泄露,通常要封掉該端口,使內網和Internet之間不能進行Windows網絡共享。其餘幾個端口都是        病毒或***程序端口,若是有最新的病毒或***使用其餘端口,應該在上述命令中添加       進去。

有些蠕蟲病毒發做時會產生大量的ICMP數據包,能夠設置拒絕ICMP數據包的規則。但因爲ping命令也是使用ICMP數據包工做的,若是設置拒絕轉發ICMP數據包,內網將不能ping外網的任何主機,會給網絡維護帶來不便,所以比較好的辦法是限制ICMP數據包的注量,命令以下所示。

 
 
  1. iptables -A FORWARD -p icmp -m limit --limit
    50/m --limit-burst 60 -j ACCEPT 

前面的規則限制了10.10.2.0/24子網與Internet之間的部分數據包,管理員能夠根據具體狀況隨時添加更多的規則或刪除、修改部分規則。最後,還應該添加使全部數據包都能經過的規則,具體命令以下所示。

iptables -A FORWARD  -i eth2 -o eth0 -j ACCEPT  iptables -A FORWARD  -i eth0 -o eth2 -j ACCEPT

因爲還有一個與服務器相連的eth1網卡,它默認時是不容許數據包經過的,所以上述命令要指明是在eth2和eth0網卡之間能夠經過全部的數據包。

mangle表應用舉例

前面介紹的防火牆規則其所在的規則鏈都位於filter表,下面再看一個有關mangle表的使用例子。mangle表的主要功能是根據規則修改數據包的一些標誌位,以便其餘規則或程序能夠利用這種標誌對數據包進行過濾或策略路由。

圖9-9所示的是一種典型的網絡結構,內網的客戶機經過Linux主機連入Internet,而Linux主機與Internet鏈接時有兩條線路,它們的網關如圖所示。現要求對內網進行策略路由,全部經過TCP協議訪問80端口的數據包都從ChinaNet線路出去,而全部訪問UDP協議53號端口的數據包都從Cernet線路出去。

130257916.jpg

這是一個策略路由的問題,爲了達到目的,在對數據包進行路由前,要先根據數據包的協議和目的端口給數據包作上一種標誌,而後再指定相應規則,根據數據包的標誌進行策略路由。爲了給特定的數據包作上標誌,須要使用mangle表,mangle表共有5條鏈,因爲須要在路由選擇前作標誌,所以應該使用PREROUTING鏈,下面是具體的命令。

 
 
  1. iptables -t mangle -A PREROUTING -i eth0 -p tcp 
    --dport 80 -j MARK --set-      mark 1  

  2. iptables -t mangle -A PREROUTING -i eth0 -p udp 
    --dprot 53 -j MARK --set-      mark 2 

以上命令在mangle表的PREROUTING鏈中添加規則,爲來自eth0接口的數據包作標誌,其匹配規則分別是TCP協議、目的端口號是80和UDP協議、目的端口號是53,標誌的值分別是1和2。數據包通過PREROUTING鏈後,將要進入路由選擇模塊,爲了對其進行策略路由,執行如下兩條命令,添加相應的規則。

ip rule add from all fwmark 1 table 10  ip rule add from all fwmark 2 table 20

以上兩條命令表示全部標誌是1的數據包使用路由表10進行路由,而全部標誌是2的數據包使用路由表20進行路由。路由表10和20分別使用了ChinaNet和Cernet線路上的網關做爲默認網關,具體設置命令以下所示。

ip route add default via 10.10.1.1 dev eth1 table 10  ip route add default via 10.10.2.1 dev eth2 table 20

以上兩條命令在路由表10和20上分別指定了10.10.1.1和10.10.2.1做爲默認網關,它們分別位於ChinaNet和Cernet線路上。因而,使用路由表10的數據包將經過ChinaNet線路出去,而使用路由表20的數據包將經過Cernet線路出去。

上面介紹了有關mangle表在策略路由上的應用,有關策略路由的具體內容,可參見8.3節。


3、用iptables防火牆實現動態地址轉換(NAT)的配置方法

ptables防火牆的NAT配置

NAT(Network Address Translation,網絡地址轉換)是一項很是重要的Internet技術,它可讓內網衆多的計算機訪問Internet時,共用一個公網地址,從而解決了Internet地址不足的問題,並對公網隱藏了內網的計算機,提升了安全性能。本章主要介紹利用iptables防火牆實現NAT的方法。

 NAT簡介

NAT並非一種網絡協議,而是一種過程,它將一組IP地址映射到另外一組IP地址,並且對用戶來講是透明的。NAT一般用於將內部私有的IP地址翻譯成合法的公網IP地址,從而可使內網中的計算機共享公網IP,節省了IP地址資源。能夠這樣說,正是因爲NAT技術的出現,才使得IPv4的地址至今還足夠使用。所以,在IPv6普遍使用前,NAT技術仍然還會普遍地應用。

1.NAT的工做原理

NAT的工做原理如圖9-10所示。

130812192.jpg

內網中IP爲10.10.1.10的計算機發送的數據包其源IP地址是10.10.1.10,但這個地址是Internet的保留地址,不容許在Internet上使用,Internet上的路由器是不會轉發這樣的數據包的。爲了使這個數據包能在Internet上傳輸,須要把源IP地址10.10.1.10轉換成一個能在Internet上使用的合法IP地址,如218.75.26.35,才能順利地到達目的地。

這種IP地址轉換的任務由NAT服務器完成,運行NAT服務的主機通常位於內網的出口處,至少須要有兩個網絡接口,一個設置爲內網IP,一個設置爲外網合法IP。NAT服務器改變出去的數據包的源IP地址後,須要在內部保存的NAT地址映射表中登記相應的條目,以便回覆的數據包能返回給正確的內網計算機。

固然,從Internet回覆的數據包也並非直接發送給內網的,而是發給了NAT服務器中具備合法IP地址的那個網絡接口。NAT服務器收到回覆的數據包後,根據內部保存的NAT地址映射表,找到該數據包是屬於哪一個內網IP的,而後再把數據包的目的IP轉換回來,還原成原來的那個內網地址,最後再經過內網接口路由出去。

以上地址轉換過程對用戶來講是透明的,計算機10.10.1.10並不知道本身發送出去的數據包在傳輸過程當中被修改過,只是認爲本身發送出去的數據包能獲得正確地響應數據包,與正常狀況沒有什麼區別。

經過NAT轉換還能夠保護內網中的計算機不受到來自Internet的***。由於外網的計算機不能直接發送數據包給使用保留地址的內網計算機,只能發給NAT服務器的外網接口。在內網計算機沒有主動與外網計算機聯繫的狀況下,在NAT服務器的NAT地址映射表中是沒法找到相應條目的,所以也就沒法把該數據包的目的IP轉換成內網IP。

說明:在有些狀況下,數據包還可能會通過屢次的地址轉換。

2.動態NAT

以上介紹的NAT也稱爲源NAT,即改變數據包的源IP地址,一般也稱爲靜態NAT,它用於內網的計算機共用公網IP上網。還有一種NAT是目的NAT,改變的是數據包的目的IP地址,一般也稱爲動態NAT,它用於把某一個公網IP映射爲某一內網IP,使二者創建固定的聯繫。當Internet上的計算機訪問公網IP時,NAT服務器會把這些數據包的目的地址轉換爲對應的內網IP,再路由給內網計算機。

3.端口NAT

另外還有一種NAT稱爲端口NAT,它可使公網IP的某一端口與內網IP的某一端口創建映射關係。當來自Internet的數據包訪問的是這個公網IP的指定端口時,NAT服務器不只會把數據包的目的公網IP地址轉換爲對應的內網IP,並且會把數據包的目的端口號也根據映射關係進行轉換。

除了存在單獨的NAT設備外,NAT功能還一般被集成到路由器、防火牆等設備或軟件中。iptables防火牆也集成了NAT功能,能夠利用NAT表中的規則鏈對數據包的源或目的IP地址進行轉換。下面兩個小節將分別介紹在iptables防火牆中實現源NAT和目的NAT的方法。

使用iptables配置源NAT

在前面的有關章節中,已經介紹了路由和過濾數據包的方法,它們都不牽涉到對數據包的IP地址進行改變。但源NAT須要對內網出去的數據包的源IP地址進行轉換,用公網IP代替內網IP,以便數據包能在Internet上傳輸。iptables的源NAT的配置應該是在路由和網絡防火牆配置的基礎上進行的。

iptables防火牆中有3張內置的表,其中的nat表實現了地址轉換的功能。nat表包含PREROUTING、OUTPUT和POSTROUTING 3條鏈,裏面包含的規則指出瞭如何對數據包的地址進行轉換。其中,源NAT的規則在POSTROUTING鏈中定義。這些規則的處理是在路由完成後進行的,可使用"-j SNAT"目標動做對匹配的數據包進行源地址轉換。

在圖9-10所示的網絡結構中,假設讓iptables防火牆承擔NAT服務器功能。此時,若是但願內網10.10.1.0/24出去的數據包其源IP地址都轉換外網接口eth0的公網IP地址218.75.26.35,則須要執行如下iptables命令。

 
 
  1. # iptables -t nat -A POSTROUTING -s 10.10.
    1.0/24 -o eth0 -j SNAT --to-source 218.75.26.35 

以上命令中,"-t nat"指定使用的是nat表,"-A POSTROUTING"表示在POSTROUTING鏈中添加規則,"--to-source 218.75.26.35"表示把數據包的源IP地址轉換爲218.75.26.35,而根據-s選項的內容,匹配的數據包其源IP地址應該是屬於10.10.1.0/24子網的。還有,"-o eth0"指定了只有從eth0接口出去的數據包才作源NAT轉換,由於從其餘接口出去的數據包可能不是到Internet的,不須要進行地址轉換。

以上命令中,轉換後的公網地址直接是eth0的公網IP地址。也可使用其餘地址,例如,218.75.26.34。此時,須要爲eth0建立一個子接口,並把IP地址設置爲218.75.26.34,使用的命令以下所示。

# ifconfig eth0:1 218.75.26.34 netmask 255.255.255.240

以上命令使eth0接口擁有兩個公網IP。也可使用某一IP地址範圍做爲轉換後的公網地址,此時要建立多個子接口,並對應每個公網地址。而"--to-source"選項後的參數應該以"a.b.c.x-a.b.c.y"的形式出現。
前面介紹的是數據包轉換後的公網IP是固定的狀況。若是公網IP地址是從ISP服務商那裏經過撥號動態得到的,則每一次撥號所獲得的地址是不一樣的,而且網絡接口也是在撥號後才產生的。在這種狀況下,前面命令中的"--to-source"選項將沒法使用。爲了解決這個問題,iptables提供了另外一種稱爲IP假裝的源NAT,其實現方法是採用"-j MASQUERADE"目標動做,具體命令以下所示。

# iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o ppp0 -j MASQUERADE

以上命令中,ppp0是撥號成功後產生的虛擬接口,其IP地址是從ISP服務商那裏得到的公網IP。"-j MASQUERADE"表示把數據包的源IP地址改成ppp0接口的IP地址。

注意:除了上面的源NAT配置外,在實際應用中,還須要配置其餘一些有關iptables網絡防火牆的規則,同時,路由的配置也是必不可少的。

使用iptables配置目的NAT

目的NAT改變的是數據包的目的IP地址,當來自Internet的數據包訪問NAT服務器網絡接口的公網IP時,NAT服務器會把這些數據包的目的地址轉換爲某一對應的內網IP,再路由給內網計算機。這樣,使用內網IP地址的服務器也能夠爲Internet上的計算機提供網絡服務了。

如圖9-11所示,位於子網10.10.1.0/24的是普通的客戶機,它們使用源NAT訪問Internet。而子網10.10.2.0/24是服務器網段,裏面的計算機運行着各類網絡服務,它們不只要爲內網提供服務,並且要爲Internet上的計算機提供服務。但因爲使用的是內網地址,所以須要在NAT服務器配置目的NAT,才能讓來自Internet的數據包能順利到達服務器網段。

132140146.jpg

假設IP爲10.10.2.3的計算機須要爲Internet提供網絡服務,此時,能夠規定一個公網IP地址,使其與10.10.2.3創建映射關係。假設使用的公網IP是218.75.26.34,則配置目的NAT的命令以下:

 
 
  1. # iptables -t nat -A PREROUTING -i eth0 -d 
    218.75.26.34/32 -j DNAT --to 10.10.2.3 

以上命令是在PREROUTING鏈中添加規則,這條鏈位於路由模塊的前面,所以是在路由前改變了數據包的目的IP,這將對路由的結果形成影響。因爲網絡接口eth0與Internet鏈接,所以,"-i eth0"保證了數據包是來自Internet的數據包。"-d 218.75.26.34/32"表示數據包的目的地是到218.75.26.34主機,而這個IP應該是eth0某個子接口的地址,這樣才能由NAT服務器接收數據包,不然,數據包將會由於無人接收而丟棄。

"-j DNAT"指定了目標動做是DNAT,表示要對數據包的目的IP進行修改,它的子選項"--to 10.10.2.3"表示修改後的IP地址是10.10.2.3。因而,目的IP修改後,接下來將由路由模塊把數據包路由給10.10.2.3服務器。

以上是讓一個公網IP徹底映射到內網的某個IP上,此時同10.10.2.3主機直接位於Internet,而且使用218.75.26.34地址是沒有區別的。所以這種方式雖然達到了地址轉換的目的,但實際上並無帶來多大好處,由於使用NAT的主要目的是爲了可以共用公網IP地址,以節省日益緊張的IP地址資源。爲了達到共用IP地址的目的,可使用端口映射。

端口映射是把一個公網IP地址的某一端口映射到內網某一IP地址的某一端口上去。它使用起來很是靈活,兩個映射的端口其端口號能夠不同,並且同一個公網IP的不一樣端口能夠映射到不一樣的內網IP地址上去。

例如,假設主機10.10.2.3只爲外網提供Web服務,所以,只須要開放80端口,而主機10.10.2.9爲外網提供了FTP服務,所以須要開放21號端口。在這種狀況下,徹底能夠把公網IP地址218.75.26.34的80號和21號端口分別映射到10.10.2.3和10.10.2.9的80號和21號端口,以便兩臺內網服務器能夠共用一個公網IP。具體命令以下所示。

 
 
  1. # iptables -t nat -A PREROUTING -i eth0 -d 
    218.75.26.34/32 -p tcp --dport 80 -j DNAT --to 10.10.2.3:80  

  2. # iptables -t nat -A PREROUTING -i eth0 -d 
    218.75.26.34/32 -p tcp --dport 21 -j DNAT --to 10.10.2.9:21 

以上命令中,目的地址是218.75.26.34的TCP數據包。當目的端口是80時,將轉發給10.10.2.3主機的80端口;當目的端口是21時,將轉發給10.10.2.9主機的21號端口。固然,兩個映射的端口徹底能夠不同。例如,若是還有一臺主機10.10.2.8也經過80端口提供Web服務,而且映射的IP地址也是218.75.26.34,此時須要把218.75.26.34的另外一個端口,如8080,映射到10.10.2.8的80端口,命令以下:

 
 
  1. # iptables -t nat -A PREROUTING -i eth0 -d 
    218.75.26.34/32 -p tcp --dport 8080 -j DNAT --to 10.10.2.8:80 

注意:上面介紹的只是有關iptables中的DNAT配置,在實際應用中,還須要其餘一些配置的配合才能真正成功。例如,filter表的3個鏈應該容許相應的數據包經過,應該爲每個外網IP建立eth0接口的子接口等。

此外,對於FTP服務來講,因爲21號端口只是創建控制鏈接時用到的端口,真正傳輸數據時要使用其餘端口。並且在被動方式下,客戶端向FTP服務器發起鏈接的端口號是隨機的,所以,沒法經過開放固定的端口來知足要求。爲了解決這個問題,能夠在Linux系統中載入如下兩個模塊。

modprobe ip_conntrack_ftp  modprobe ip_nat_ftp

這兩個模塊能夠監控FTP控制流,以便能事先知道將要創建的FTP數據鏈接所使用的端口,從而能夠容許相應的數據包經過,即便防火牆沒有開放這個端口。


參考: http://book.51cto.com/art/200912/169182.htm 

       http://book.51cto.com/art/200912/169262.htm 

相關文章
相關標籤/搜索