1. 程式人生 > >iptables策略詳解

iptables策略詳解

 

iptables可用操作
(1)-L : 顯示所選連結的所有策略 : # iptables -L -n 檢視iptables 策略
 
(2)-A : 在所選的鏈最尾部新增一條新的策略:# iptables -A INPUT -s 192.168.0.1 -j DROP
 
(3)-D : 從所選鏈中刪除策略,可以通過將策略的內容完整的寫出來或指定在所願鏈中的序號
        # iptables -D INPUT 1  
 
(4)-R:替換所選中的鏈裡指定的策略:# iptables -R INPUT 1 -s 192.168.30.0 -j DROP(替換第一條)
 
(5)-I: 從所選的鏈中指定策略前面插入一條新的策略 # iptables -I INPUT 2 -s 192.168.10.2 -j DROP
 
(6)-F:清空所選鏈的策略,如果沒有指定鏈,則清空指定表的所有鏈:# iptables -F INPUT (清空INPUT鏈)
 
(7)-Z:將所選鏈的所有計數器歸零,如果沒有指定鏈,則將指定表所有鏈中計數器歸零:# iptables -Z INPUT
 
(8)-N:根據使用者指定的名字建立新的鏈,在定義新鏈時所使用的名字不能和已有的鏈同名,資料包如果在自定義鏈裡被匹配了就會被target/jump執行,如果沒有被匹配則資料包將被送回呼叫自定義鏈的父鏈匹配
        # iptables -N isok
        # iptables -A isok -p tcp -s 192.168.0.168 -j DROP
        # iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination          
DROP       tcp  --  172.28.10.0          0.0.0.0/0           tcp dpt:80  
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination          
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination          
 
Chain isok (0 references)
target     prot opt source               destination          
DROP       tcp  --  192.168.0.168        0.0.0.0/0
 
(9)-X:刪除指定的使用者自定義的鏈。在刪除這個鏈必須沒有被引用,如果沒有指定鏈名稱,則刪除所有自定義的鏈,如果沒有指定表及鏈則刪除預設表中左右自定義的鏈
        # iptables -X isok            ( iptables -X)
         
(10)-E:對自定義的鏈進行重新命名,該命令僅僅是改變自定義鏈的名字,對這個結構、工作沒有任何影響
        # iptables -E isok isallow
         
(11)-P:為鏈設定預設的策略(如ACCEPT、DROP),所有不符合策略的資料包都被強制使用這個策略
        # iptables -P INPUT DROP
         
(12)--line-number:在顯示策略時,輸入序號,該引數只能和-L配合使用
    # iptables -L --line-number
     
(13)-s:匹配指定的IP源地址匹配資料包,指定網段為:# iptables -A INPUT -s 192.168.1.0/24 -j DROP
 
(14)-d:匹配指定的IP目標地址匹配資料包,指定網段:# iptables -A INPUT -d 192.168.1.0/24 -j DROP
 
(15)-i:<網路介面>:以資料包進入本地所使用的網路介面來匹配資料包,這個匹配操作只能用於
        INPUT、FORWARD和PREROUTING這3個鏈
        1、指定時使用網路介面名稱,比如eth0、ppp0
        2、使用加號作為萬用字元時,如果直接用一個加號,比如iptables -A INPUT -i +表示匹配所有的包,而不考慮使用哪個介面,這也是用-i引數的預設行為。萬用字元還可以使放在某一類介面的後面,
            比如eth+表示所有的Ethernet介面
        3、在介面前加感嘆號表示取反(注意空格),比如“-i!eth0”意思是匹配來自除eth0外的所有包
        4、lo表示本地迴環地址
        # iptables -A INPUT -i eth0 -s 192.168.0.99 -j DROP(阻止從eth0進入的源IP地址為192.168.0.99的所有通訊)
         
(16)-o:<網路介面>:以資料包離開本地所使用的網路介面來匹配資料包,該引數配置方法與-i引數相同
        # iptables -A OUTPUT -o eth0 -s 192.168.0.99 -j DROP
     
(17)--sport<埠>:基於資料包的源埠來匹配資料包:
                    1、該引數必須與-p引數配合使用
                    2、不指定--sport引數時,表示所有埠
                    3、可以使用連續的埠,比如“--sport 1000:1024"表示從1000到1024的所有埠
                        (包括1000、1024),”--sport 1024:1000“和”--sport 1000:1024“的效果相同
                    4、當省略第一個冒號時,預設從埠0開始,比如”--sport:1000"表示從0到1000的所有埠
                    5、當省略第二個冒號時,預設是65535,比如“--sport 1000:"表示從1000到65535的所有埠
                    6、在埠號前加感嘆號表示取反(在感嘆號與埠號之間必須有空格),比如”--sport!1000" 表示除1000號外的所有埠,“--sport ! 1000:1024"表示從1000到1024的所喲偶埠(包括1000、1024)之外的所有埠
                    # iptables -A INPUT -p tcp --sport 1000 -j DROP(阻止源埠為1000的所有tcp通訊)
                    # iptables -A INPUT -p tcp --sport 1000:1024 -j DROP(阻止源埠大於等於1000且小於等於1024的所有tcp通訊)
                     
(18)--dport:基於資料包的目的埠來匹配包,該引數配置方法與--sport引數相同
            # iptables -A INPUT -p tcp --dport 1000 -j DROP (阻止目標埠為1000的所有tcp通訊)
            # iptables -A INPUT -p tcp --dport 1000:1024 -j DROP (阻止目標埠大於等於1000且小於等於1024的所有tcp通訊)
                     
(19)-m multiport --sport<埠>:源埠多埠匹配,最多可以使用15個埠,使用逗號分隔,該引數必須與-p引數配合使用
        # iptables -A INPUT -p tcp -m multiport --sport 1000,1024,1025 -j DROP (阻止源埠為1000,1024,1025的所有tcp通訊)
         
(20)-m multiport --dport<埠>:目的埠多埠匹配,最多可以使用15個埠,以逗號隔開,該引數必須與-p引數配合使用
        # iptables -A INPUT -p tcp -m multiport --dport 1000,1024 -j DROP(阻止目的埠為1000,1024的所有tcp通訊)
         
(21)-m multiport --port<埠>:同埠多埠匹配,通埠是指源埠和目的埠使用相同埠的資料包
 
(22)--tcp-flags<檢查標記列表><條件列表>:匹配指定的tcp標記,有兩個引數,它們都是列表,列表內部用英文的都好作為分隔符,這兩個列表之間用空格分開,第一個引數指定需要檢查的tcp標記,第二個引數指定”在第一個列表中出現過的且必須被設為1(即狀態是開啟的)的“標記(第一個列表中其他的標記必須設定0),也就是說第一個引數提供檢查範圍,第二個引數提供被設定的調價(就是哪些位置1).這個匹配操作可以識別SYN、ACK、FIN、RST、URG、PSH標記另外還可以使用ALL、NONE。ALL是指選定所有的標,NONE是指未選定任何標記,也可以在引數錢使用感嘆號取反
                     # iptables -p tcp --tcp-flags SYN,ACK,FIN SYN -j DROP(阻止SYN標記被設定而FIN和ACK標記沒有被設定的所有tcp通訊)
                     # iptables -p tcp --tcp-flags ALL NONE -j DROP (阻止所有標記沒有被設定為1的所有tcp通訊)
                     # iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN -j DROP (阻止FIN、ACK被設定為而SYN沒有被設定的所有tcp通訊)
                         
(23)--syn:匹配SYN標記被設定而ACK和RST標記沒有設定的資料包(該引數與”iptables -p tcp --tcp-flags SYN,ACK,RST SYN" 有相同的效果)
 
(24)--icmp-type<型別數值>:根據ICMP型別匹配包,型別的指定可以使用十進位制數值
                # iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
                # iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
                 
                # iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
                # iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
 
(25)--mac-source<MAC地址>:基於資料包的源MAC地址匹配資料包,只能在PREROUTING,FORWARD,INPUT鏈中使用
                        # iptables -A INPUT -m mac --mac-source 00:50:56:C0:00:01 -j DROP
                         
(26)--uid-owner<UID>:按生成包的使用者ID(UID)來匹配資料包,如例阻止所有UID為555的使用者向外的所有通訊
                        # iptables -A OUTPUT -m owner --uid-owner 555 -j DROP
                         
(27)--gid-owner<GID>:按生成包的使用者所在的組的ID(GID)來匹配資料包
                        # iptables -A OUTPUT -m owner --gid-owner 555 -j DROP
 
(28)--sid-owner<SID>;按生成資料包的會話ID(SID)來匹配外出資料包(一個程序以及它的子程序或他的多個執行緒都有同一個SID)
                        # iptables -A OUTPUT -m owner --sid-owner 178 -j DROP
                         
(29)--state<狀態列表>:匹配資料包的狀態,多個狀態使用逗號分隔,例子將允許連線本機的FTP伺服器
                        # iptables -A INPUT -p tcp --dport 21 -j ACCEPT
                        # iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
                        # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
                 例:# iptables -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT   
         
(30)DNAT:用於進行目標網路地址轉換,就是重寫資料包的目標IP地址,如果一個數據包被匹配,那麼和他屬於同一個流的所有的包都會被自動的轉換,然後就可以被路由到正確的主機或網路DNAT在實際工作中非常有用,比如一臺Web伺服器位於區域網,而且沒有可在Internet上使用的真實 IP地址,這時就可以使用DNAT讓防火牆把所有到它自己HTTP埠的包轉發給區域網內部真正的Web伺服器,目的地址也可以是一個範圍,這樣DNAT會為每一個流隨機分配一個IP地址,DNAT只能在nat表的PREROUTING,OUTPUT鏈中使用,或是被這兩條鏈呼叫的鏈中,DNAT需要使用--to-dest引數指定寫入IP包頭的地址(也就是資料包要被轉發到的地方);   還可以再地址後指定一個活一個範圍的埠,如 --to-dest 192.168.1.10:80或192.168.1.10:80-100
      
# iptables -t nat -A PREROUTING -p tcp -d 202.13.0.2 --dport 80 -j DNAT --to-dest 192.168.0.1-192.168.0.10  
  (意思是說外面要訪問內部的web伺服器,需要經過202.13.0.2:80埠來訪問,經過這個ip時需要進行目標網路地址轉換,每個資料流被隨機分配一個要轉發到的地址,但同一個資料流總是使用同一個地址,也可以只指定一個IP地址作為引數)
     
(31)SNAT:用於進行源網路地址轉換,就是重寫資料包的源IP地址,SNAT需要使用--to-source引數指定寫入IP包頭的地址,
        SNAT的其他語法與DNAT相同,SNAT只能有nat表的POSTROUTING鏈使用
         
    # iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 202.103.0.2
         (意思為當內網的ip:192.168.0.0/24網段要訪問外網時需要將這些內網ip偽裝成公網ip才可以訪問到外部)
     
(32)MASQUERADE:該目標與SNAT作用相同,只是使用該目標時不需要指明--to-source。MASQUERADE是專門設計用於那些動態獲取IP地址的連線(比如撥號上網等),如果有固定的IP地址,可推薦直接使用SNAT(也可以使用MASQUERADE)和SNAT一樣,只能用於nat表的POSTROUTING鏈,而且它只有一個引數(不是必需的)--to-ports用於指定埠,使用該引數時必需配合-p使用
            # iptables -t nat -A POSTROUTING -p tcp -j MASQUERADE --to-ports 1024-5000   
            # iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 -j MASQUERADE
             
(33)REDIRECT:在防火牆所在的主機內部轉發資料包或流到另外一個埠(比如把所有去往埠HTTP的包REDIRECT到HTTP代理,當然這都發生在主機內部,本地生成的資料包都會被對映到127.0.0.1,換句話說這個目標把要轉發的資料包的目的地址改寫為本機主機的IP,在實現透明代理時就需要使用該目標(區域網內的主機不需要知道代理伺服器的存在就可以正常上網被稱為透明代理)。該目標只能用在nat表的PREROUTING、OUTPUT鏈和被它們呼叫的自定義鏈REDIRECT只有一個選項--to-ports用於指定埠(可以使用--to-ports 8080-8888的方式指定一個埠範圍)。
              舉個例子:將本機tcp的80埠收到的資料包轉發到本機的8080埠
            # iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
         
(34)REJECT:REJECT和DROP作用相同,區別在於它除了阻止資料包之外,還向傳送者返回錯誤資訊,該目標只用用在INPUT、FORWARD,OUTPUT和它們的子鏈,而且包含REJECT的鏈也只能被它們呼叫,否則不能發揮作用,它只有一個選項--reject-with用於控制返回的錯誤資訊的型別
        # iptables -A FORWARD -p tcp --dport 22 -j REJECT --reject-with tcp-reset    
         
##################### iptables策略配置方法 #########################
 
(1)使用命令:在使用命令修改了策略後,需要使用如下命令讓策略永久生效   # service iptables save    
 
(2)使用指令碼:另外一個方法讓策略永久生效的,編寫一個指令碼將所有的策略放入指令碼然後每次開機自動執行該指令碼(/etc/rc.locl)
    #!/bin/sh
    # 清除filter、nat表的所有側率及計數器
    iptables -t filter -F
    iptables -t filter -Z
    iptables -t filter -X
    iptables -t nat -F
    iptables -t nat -Z
    iptables -t nat -X
    #定義filter、nat表預設策略
    iptables -t filter -P INPUT DROP
    iptables -t filter -p OUTPUT DROP
    iptables -t filter -P FORWARD ACCEPT
    iptables -t nat -P OUTPUT ACCEPT
    iptables -t nat -P PREROUTING ACCEPT
    iptables -t nat -P POSTROUTING ACCEPT
    #允許IP轉發
    /bin/echo "1" >/pro/sys/net/ipv4/ip_forward
    #載入核心模組
    modprode ip_conntrack-ftp
    modprode ip_nat_ftp
    #允許本機的所有通訊
    iptables -t filter -A INPUT -i lo -j ACCEPT
    iptables -t filter -A OUTPUT -o lo -j ACCEPT
    #執行ping
    iptables -t filter -A INPUT -m icmp --icmp-type 8 -j ACCEPT
    iptables -t filter -A OUTPUT -m icmp --icmp-type 0 -j ACCEPT
    iptables -t filter -A INPUT -m icmp --icmp-type 0 -j ACCEPT
    iptables -t filter -A OUTPUT -m icmp --icmp-type 8 -j ACCEPT
    #允許查詢本機的DNS服務
    iptables -t filter -A OUTPUT -o eth0 -p udp --dport 53 -j ACCEPT
    iptables -t filter -A INPUT -i eth0 -p udp --sport 53 -j ACCEPT
    #允許訪問本機的FTP服務
    iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
    iptables -t filter -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -t filter -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
 
#################################### 常見服務策略配置 ##########################################
下面是iptables中通過策略允許常見服務通訊的例子,除特殊說明外都架設服務於防火牆在同一主機且filter表INPUT及OUTPUT鏈預設策略時DROP,如果將IPtables做為閘道器或其他情況可根據實現情況選擇不同的表(下列策略都假設服務使用預設埠)
 
(1)NTP服務
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 123 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 37 -j ACCEPT
 
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 123 -j ACCEPT
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 37 -j ACCEPT
 
(2)FTP服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 21 -j ACCEPT
 
(3)DHCP服務
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 67 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.0/24 --sport 68 -j ACCEPT
 
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --dport 67 -j ACCEPT
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 68 -j ACCEPT
 
(4)DNS服務
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 53 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.0/24 --sport 53 -j ACCEPT
 
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --dport 53 -j ACCEPT
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 53 -j ACCEPT
 
(5)Samba服務
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 137:139 -j ACCEPT
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 137:139 -j ACCEPT
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 445 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 445 -j ACCEPT
 
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 137:139 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 137:139 -j ACCEPT
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 445 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 445 -j ACCEPT
 
(6)NFS 服務
1、在使用iptables允許NFS服務時需要修改/etc/sysconfig/nfs檔案的下列引數,是NFS使用固定埠
LOCKD_TCPPORT=4001
LOCKD_UDPPORT=4001
LOCKD_PORT=4002
STATD_PORT=4000
STATD_OUTGOING_PORT=4003
2、配置iptables策略
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 4000:4003 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 4000:4003 -j ACCEPT
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 2049 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 2049 -j ACCEPT
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 111 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 111 -j ACCEPT
 
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 4000:4003 -j ACCEPT
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 4000:4003 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 2049 -j ACCEPT
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 2049 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 111 -j ACCEPT
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 111 -j ACCEPT
 
(7)日誌服務
# iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 514 -j ACCEPT
# iptables -A OUTPUT -p udp -d 192.168.0.0/24 --sport 514 -j ACCEPT
 
(8)HTTP/HTTPS服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 443 -j ACCEPT
 
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 80 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 443 -j ACCEPT
 
(8)WebDav服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 9800 -j ACCEPT
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 9802 -j ACCEPT
 
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 9800 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 9802 -j ACCEPT
 
(9)SMTP服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 25 -j ACCEPT
 
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 25 -j ACCEPT
 
(10)POP3/POP3s服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 110 -j ACCEPT
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 995 -j ACCEPt
 
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 110 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 995 -j ACCEPT
 
(11)IMAP/IMAPs服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 143 -j ACCEPT
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 993 -j ACCEPT
 
# iptalbes -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 143 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 993 -j ACCEPT
 
(12)LDAP服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 389 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 389 -j ACCEPT
 
(14)SSH服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 22 -j ACCEPT
 
(15)telnet服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 23 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 23 -j ACCEPT
 
(16)MySQL服務
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 3306 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 3306 -j ACCEPT
 
(17)SQL Server
# iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 1433 -j ACCEPT
# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --sport 1433 -j ACCEPT