iptables 詳解

一、iptables簡介


iptables 的前身叫ipfirewall (內核1.x時代),這是一個從freeBSD上移植過來的,能夠工作在內核當中的,對數據包進行檢測的一款簡易訪問控制工具。但是 ipfirewall工作功能極其有限(它需要將所有的規則都放進內核當中,這樣規則才能夠運行起來,而放進內核,這個做法一般是極其困難的)。當內核發 展到2.x系列的時候,軟件更名爲ipchains,它可以定義多條規則,將他們串起來,共同發揮作用,而現在,它叫做iptables,可以將規則組成一個列表,實現絕對詳細的訪問控制功能。

iptables和netfilter的關係是一個很容易讓人搞不清的問題。很多的知道iptables卻不知道 netfilter。其實iptables只是Linux防火牆的管理工具而已,位於/sbin/iptables。真正實現防火牆功能的是 netfilter,它是Linux內核中實現包過濾的內部結構。



二、iptables基礎


規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義爲“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息 包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規 則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的 主要工作就是添加、修改和刪除這些規則。



三、iptables傳輸數據包的過程


① 當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。 
② 如果數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。 
③ 如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。

wKioL1cht9TxIUWkAAFDRpSsZJI919.png



四、iptables的規則和鏈


上圖中的五個位置也被稱爲五個鉤子函數(hook functions),也叫五個規則鏈。

1.PREROUTING (路由前)

2.INPUT (數據包流入口)

3.FORWARD (轉發管卡)

4.OUTPUT(數據包出口)

5.POSTROUTING(路由後)

 這是netfilter規定的五個規則鏈,任何一個數據包,只要經過本機,必將經過這五個鏈中的其中一個鏈。

iptables包含4個表,5個鏈。其中表是按照對數據包的操作區分的,鏈是按照不同的Hook點來區分的,表和鏈實際上是netfilter的兩個維度。      

(1)4表:

   filter,nat,mangle,raw,默認表是filter(沒有指定表的時候就是filter表)

    filter:一般的過濾功能

    nat:用於nat功能(端口映射,地址映射等)

    mangle:用於對特定數據包的修改

    raw:有限級最高,設置raw時一般是爲了不再讓iptables做數據包的鏈接跟蹤處理,提高性能

(2)5鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

    PREROUTING:數據包進入路由表之前

    INPUT:通過路由表後目的地爲本機

    FORWARDING:通過路由表後,目的地不爲本機

    OUTPUT:由本機產生,向外轉發

    POSTROUTING:發送到網卡接口之前。


(3)規則表:
1.filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包  內核模塊:iptables_filter.
2.Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用於網絡地址轉換(IP、端口) 內核模塊:iptable_nat
3.Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數據包的服務類型、TTL、並且可以配置路由實現QOS內核模塊:iptable_mangle(別看這個表這麼麻煩,咱們設置策略時幾乎都不會用到它)
4.Raw表——兩個鏈:OUTPUT、PREROUTING
作用:決定數據包是否被狀態跟蹤機制處理  內核模塊:iptable_raw


(4)規則鏈:
1.INPUT——進來的數據包應用此規則鏈中的策略
2.OUTPUT——外出的數據包應用此規則鏈中的策略
3.FORWARD——轉發數據包時應用此規則鏈中的策略
4.PREROUTING——對數據包作路由選擇前應用此鏈中的規則
(記住!所有的數據包進來的時侯都先由這個鏈處理)
5.POSTROUTING——對數據包作路由選擇後應用此鏈中的規則
(所有的數據包出來的時侯都先由這個鏈處理)

wKioL1chub7SfmmGAAI092k6rK8143.jpg(5)規則表之間的優先順序:

raw——mangle——nat——filter



五、iptables的命令管理



命令格式:iptables [-t table] SUBCOMMAND chain [matches...] [target]    

如圖示

   wKiom1chufPynWrRAAGdfGiCmc0986.jpg

   wKioL1chu2GD8Y_yAAJuOfLjfic539.jpg

詳細介紹:


(1)鏈管理
    -N: new,新增一條自定義鏈;
    -X:delete,刪除自定義的空鏈;
    -P:policy,設置鏈的默認策略;
         ACCEPT:接受
         DROP:丟棄
         REJECT:拒絕
    -E:rename,重命名自定義的未被引用(引用計數爲0)的鏈;


(2)規則管理
    -A:append,追加,默認爲最後一個;
    -I:insert,插入,默認爲第一個;
    -D:delete,刪除
        (1) rule specification
        (2) rule number 
    -R:replace,替換
    -F:flush,清除規則
    -Z:zero,置0;
        iptables的每條規則都有兩個計數器:
             (1) 由本規則匹配到的所有的packets;
             (2) 由本規則匹配到的所有的bytes;
    -S:selected,以iptables-save命令的格式顯示鏈上的規則;


例:虛擬機ip地址爲192.168.1.108,已安裝httpd服務,編寫一條規則讓所有主機不可訪問

1
[root@bogon ~]# iptables -t filter -A INPUT -d 192.168.1.108 -p tcp --dport 80 -j REJECT

此時再通過瀏覽器就不能訪問apache測試頁面了

再編寫一條規則,讓192.168.1.X網段內的主機可以訪問

1
2
3
4
5
6
7
8
9
10
11
12
[root@bogon ~]# iptables -t filter -D INPUT 1 #先刪除之前的規則
[root@bogon ~]# iptables -t filter -I INPUT -s 192.168.1.0/24 -d 192.168.1.108 -j ACCEPT #添加規則
[root@bogon ~]# iptables -nvL --line-number #查看
Chain INPUT (policy ACCEPT 3 packets, 840 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       72  5308 ACCEPT     all  --  *      *       192.168.1.0/24       192.168.1.108       
 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
 
Chain OUTPUT (policy ACCEPT 51 packets, 5708 bytes)
num   pkts bytes target     prot opt in     out     source               destination

修改本規則,讓本網段內的不能訪問apache測試頁面

1
[root@bogon ~]# iptables -t filter -R INPUT 1 -s 192.168.1.0/24 -d 192.168.1.108 -j REJECT

(3)查看
    -L: list,列出規則
    -n:numeric,以數字格式顯示地址和端口;
    -v:verbose,詳細信息;-vv, -vvv
    -x:exactly,顯示計數器的精確值而非單位換算後的結果;
    --line-numbers:顯示鏈上的規則的編號;            
    組合:-nvL

1
2
3
4
5
6
7
8
9
[root@bogon ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

    
匹配條件
(4)基本匹配:netfilter自帶的匹配機制
    [!] -s, --source address[/mask][,...]:原地址匹配
    [!] -d, --destination address[/mask][,...]:目標地址匹配
    [!] -i, --in-interface name:限制報文流入的接口,只能用於PREROUTING,INPUT及FORWARD;
    [!] -o, --out-interface name:限制報文流出的接口,只能用於OUTPUT,FORWARD及POSTROUTING;

(5)擴展匹配:經由擴展模塊引入的匹配機制,-m matchname
    隱式擴展:可以不用使用-m選項專門加載響應模塊;前提是要使用-p選項可匹配何種協議;

        tcp、udp、icmp

    顯式擴展:必須由-m選項專門加載響應模塊;
        multiport
        iprange
        string
        time
        connlimit
        limit
        state


(5.1)隱式擴展
    [!]  -p, --protocol PROTOCOL PROTOCOL:
    協議:tcp, udp, icmp, icmpv6, esp, ah, sctp, mh or "all"
                    
    tcp: 隱含指明瞭“-m tcp”,有專用選項:
    [!] --source-port,--sport  port[:port]:匹配報文中的tcp首部的源端口;可以是端口範圍;
    [!] --destination-port,--dport port[:port]:匹配報文中的tcp首部的目標端口;可以是端口範圍;
    [!] --tcp-flags mask comp:檢查報文中mask指明的tcp標誌位,而要這些標誌位comp中必須爲1;
        --tcp-flags  syn,fin,ack,rst  syn
        --tcp-flags  syn,fin,ack,rst  ack,fin 
    [!] --syn:
        --syn相當於“--tcp-flags  syn,fin,ack,rst  syn”;tcp三次握手的第一次                       
    udp:隱含指明瞭“-m udp”,有專用選項:
    [!] --source-port,--sport  port[:port]:匹配報文中的udp首部的源端口;可以是端口範圍;
    [!] --destination-port,--dport port[:port]:匹配報文中udp首部的目標端口;可以是端口範圍
                        
    icmp:隱含指明瞭“-m icmp”,有專用選項:
    [!] --icmp-type {type[/code]|typename}
        type/code: 
            0/0:echo reply   別人可以ping自己
            8/0:echo request 自己可以ping別人    

例:將虛擬機192.168.1.108設置爲,自己可以ping別人,而別人不能ping自己

對於ping這個協議,進來的爲8(ping),出去的爲0(響應).我們爲了達到目的,需要8出去,允許0進來

1
2
[root@bogon ~]# iptables -t filter -A INPUT -d 192.168.1.108 -p icmp --icmp-type 8 -j DROP #設置別人ping自己的數據包不能通過
[root@bogon ~]# iptables -t filter -A OUTPUT -s 192.168.1.108 -p icmp --icmp-type 0 -j ACCEPT #設置自己ping別人的數據包可以通過

               

       
(5.2)顯式擴展          
5.2.1 multiport:多端口匹配
    以離散方式定義多端口匹配,最多可以指定15個端口;           
    [!] --source-ports,--sports port[,port|,port:port]...
    [!] --destination-ports,--dports port[,port|,port:port]...
    [!] --ports port[,port|,port:port]...

1
2
 [root@bogon ~]# iptables -I INPUT -s 0/0 -d 192.168.1.108 -p tcp  -m multiport --dports 22,80 -j ACCEPT #允許所有主機訪問192.168.1.108的22和80端口
 [root@bogon ~]# iptables -I OUTPUT -d 0/0 -s 192.168.1.108 -p tcp  -m multiport --sports 22,80 -j ACCEPT #允許192.168.1.108的主機可以通過22和80端口發送數據包

5.2.2 iprange:指明一段連續的ip地址範圍做爲源地址或目標地址匹配;
    [!] --src-range from[-to]:源地址範圍 
    [!] --dst-range from[-to]:目標地址範圍

1
 [root@bogon ~]# iptables -A INPUT -p tcp -m iprange --src-range 192.168.0.100-192.168.0.105 --dport 22 -j ACCEPT #匹配一組ip地址192.168.0.100-192.168.0.105

                
5.2.3 string:對報文中的應用層數據做字符串匹配檢測;
        --algo {bm|kmp}:指明算法
            (bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)
    [!] --string pattern:給定要檢查的字符串模式;
    [!] --hex-string pattern:給定要檢查的字符串模式;
                

1
[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.108 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT #有"old"字符串的拒絕訪問

                


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