iptables詳解

iptables簡述

  iptables是Linux防火牆的管理工具,位於/sbin/iptables。真正實現防火牆功能的是netfilter,它是 Linux內核中實現包過濾的內部結構。web

  iptables包含4個表,5個鏈,其中表是按照對數據包的操做區分的,鏈是按照不一樣的Hook點來區分的,表和鏈其實是netfilter的兩個維度。算法

  4個表:filter,nat,mangle,raw,默認表是filter(沒有指定表的時候就是filter表)。表的處理優先級:raw>mangle>nat>filter。
    filter:通常的過濾功能,包含3個鏈,INPUT、FORWARD、OUTPUT,內核模塊:iptables_filter
    nat:用於nat功能(端口映射,地址映射等),包含3個鏈,PREROUTING、POSTROUTING、OUTPUT,內核模塊:iptable_nat
    mangle:修改數據包的服務類型、TTL、而且能夠配置路由實現QOS,包含5個鏈,PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD,內核模塊:iptable_mangle
    raw:設置raw時通常是爲了避免再讓iptables作數據包的連接跟蹤處理,提升性能,包含2個鏈,OUTPUT、PREROUTING,內核模塊:iptable_raw服務器

  5條鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。併發

    PREROUTING:數據包進入路由表以前
    INPUT:經過路由表後目的地爲本機
    FORWARD:經過路由表後,目的地不爲本機
    OUTPUT:由本機產生,向外轉發
    POSTROUTIONG:發送到網卡接口以前app

  5條鏈在內核空間的分佈狀況以下圖:tcp

             

  規則鏈之間的執行順序(分3種狀況):工具

  第1種狀況:入站數據流向
    從外界到達防火牆的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),以後會進行路由選擇(判斷該數據包應該發往何處),若是數據包的目標主機是防火牆本機(好比說Internet用戶訪問防火牆主機中的web服務器的數據包),那麼內核將其傳給INPUT鏈進行處理(決定是否容許經過等),經過之後再交給系統上層的應用程序(好比Apache服務器)進行響應。
  第2種狀況:轉發數據流向
    來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,而後進行路由選擇,若是數據包的目標地址是其它外部地址(好比局域網用戶經過網關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(轉發或攔截),而後再交給POSTROUTING規則鏈進行處理。
  第3種狀況:出站數據流向
    防火牆本機向外部地址發送的數據包(好比在防火牆主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,以後進行路由選擇,而後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。性能

iptables語法格式

  iptables [-t 表名] 命令選項[鏈名][條件匹配][-j 目標動做或跳轉]測試

  說明:
    表名、鏈名用於指定iptables命令所操做的表和鏈;
    命令選項用於指定管理iptables規則的方式,好比:插入、增長、刪除、查看等;
    條件匹配用於指定對符合什麼樣條件的數據包進行處理;
    目標動做或跳轉用於指定數據包的處理方式,好比容許經過、拒絕、丟棄、跳轉(Jump)給其它鏈處理。rest

  命令選項 

    -t:指定表,不指定的話,默認爲filter;
    -N:new, 自定義一條新的規則鏈;
    -X:delete,刪除自定義的規則鏈,但僅能刪除用戶自定義的且引用計數爲0的空的鏈;
    -P:Policy,設置默認策略,其默認策略有:ACCEPT、DROP、REJECT;
    -E:重命名自定義鏈;引用計數不爲0的自定義鏈不可以被重命名,也不能被刪除;
    -A:append,追加新的規則到指定位置,沒指明位置的話默認爲最後一條;
    -I:insert, 插入,要指明位置,省略時表示第一條;
    -D:delete,刪除規則,需指明規則序號或指明規則自己;
    -R:replace,替換指定鏈上的指定規則;
    -F:flush,清空指定的規則鏈;
    -Z:zero,置零,可指定規則置零;iptables的每條規則都有兩個計數器:(1) 匹配到的報文的個數;(2) 匹配到的全部報文的大小之和
    -L:list, 列出指定鏈上的全部規則;
    -n:numberic,以數字格式顯示地址和端口號;
    -v:verbose,詳細信息,能看到每一個規則匹配的數據大小和包數量,-vv, -vvv
    -x:exactly,顯示計數器結果的精確值;
    --line-numbers:顯示規則的序號

  目標動做或跳轉

    ACCEPT:接受
    DROP:丟棄
    REJECT:拒絕
      ---reject-with type:可指定拒絕報文的類型,如 icmp-net-unreachable,icmp-host-unreachable,icmp-port-unreachable等。
    RETURN:返回調用鏈;
    REDIRECT:端口重定向;
      --to-ports port[-port]:將匹配的端口重定向爲此處指定的端口;
    LOG:記錄日誌
      --log-level:可指定記錄的日誌等級;
      --log-prefix:指定記錄的日誌路徑,默認路徑爲:/var/log/messages;
    MARK:作防火牆標記;
    DNAT:目的地址轉換
      --to-destination [ipaddr[-ipaddr]][:port[-port]]:將目的地址轉換成內網網段的指定ip和端口;
    SNAT:源地址轉換
      --to-source [ipaddr[-ipaddr]]:將源地址轉換成指定的IP;
    MASQUERADE:當要轉換的出口地址爲動態IP時,MASQUERADE可自行判斷要轉換爲的地址;
    自定義鏈名:調用自定義鏈做爲處理動做

  條件匹配

基本匹配條件,基本匹配條件爲內建條件,由iptables(netfilter)自行提供,無需加載任何模塊。常見的基本匹配條件有:

  [!]-s, --source address[/mask][...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍;
  [!]-d, --destination address[/mask][...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;
  [!]-p, --protocol protocol:指定匹配的協議,常見協議包括:TCP、UDP、ICMP等;
  [!]-i,--in-interface name:數據報文流入的接口,只能應用於數據報文流入的環節,只能應用於PREROUTING,INPUT和FORWARD鏈;
  [!]-o, --out-interface name:數據報文流出的接口;只能應用於數據報文流出的環節,只能應用於FORWARD、OUTPUT和POSTROUTING鏈

擴展匹配條件,需加載擴展模塊方可生效,而擴展匹配條件又分爲隱式擴展和顯示擴展。

  隱式擴展不須要手動加載擴展模塊,由於其是對協議的擴展,當使用-p選項指明瞭協議時,就表示已經指明瞭要擴展的模塊。其常見條件包括:

    [!]--source-port, --sport port[:port]:匹配報文的源端口;可指定端口範圍;
    [!]--destination-port,--dport port[:port]:匹配報文的目標端口;可指定端口範圍;
    [!]--tcp-flags:指定tcp的標記,如:SYN,ACK,FIN,RST等;
    [!]--syn:用於匹配第一次握手,至關於」--tcp-flags SYN,ACK,FIN,RST SYN「;
    [!]--icmp-type {type[/code]|typename}:用於指定icmp協議的類型,如--icmp-type 8

  顯示擴展則必須手動加載擴展模塊,需使用 -m 選項指明要調用的擴展模塊,其格式爲 -m 擴展模塊。常見的擴展模塊以下:

  一、multiport:以離散或連續的方式定義多端口匹配條件,最多不超過15個端口;
    [!]--source-ports,--sports port[,port|,port:port]...:指定多個源端口;
    [!]--destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
    [!]--ports port[,port|,port:port]...:指明多個端口
  二、iprange:指明連續的IP地址範圍
    [!] --src-range from[-to]:源IP地址;
    [!] --dst-range from[-to]:目標IP地址
  三、time:根據將報文送到的時間與指定的時間範圍進行匹配;
    --kerneltz:用系統本地時區代替默認的UTC時區;
    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定從什麼日期開始;
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定到什麼日期中止;
    --timestart hh:mm[:ss]:指定從什麼時候開始;
    --timestop hh:mm[:ss]:指定從什麼時候結束;
    [!]--monthdays day[,day...]:指定規則生效的日月;
    [!]--weekdays day[,day...]:指定規則在星期幾生效
  四、string:用於對報文中的應用層數據作字符串模式匹配檢查;
    --algo {bm|kmp}:字符串匹配檢測算法;
    [!]--string pattern:要檢測的字符串模式;
    [!]--hex-string pattern:要檢測的字符串模式,16進制格式
  五、connlimit:根據每一個客戶端的Ip作併發鏈接數數量匹配檢查;
    --connlimit-upto n:鏈接的數量小於等於n時匹配;
    --connlimit-above n:鏈接的數量大於n時匹配
  六、limit:對收發報文的速率作條件匹配;
    --limit rate[/second|/minute|/hour|/day]:將匹配的報文限制速率爲每second|/minute|/hour|/day發送rate次;
    --limit-burst number:限制當達到多個報文後,執行限制
  七、state:根據」鏈接追蹤機制「去檢查鏈接的狀態;
    [!] --state state:state的類型包括以下:
      NEW:新發出請求;鏈接追蹤模板中不存在此鏈接的相關信息條目,所以,將其識別爲第一次發出的請求;
      ESTABLISHED:NEW狀態以後,鏈接追蹤模板中爲其創建的條目失效以前期間內所進行的通訊狀態;
      RELATED:相關聯的鏈接;如ftp協議中的數據鏈接與命令鏈接之間的關係;
      INVALID:無效的鏈接;
      UNTRACKED:未進行追蹤的鏈接

更多相關幫助可以使用命令 man iptables 和 man iptables-extensions 進行查看。

iptables的保存和載入

  Centos6:
    iptables的規則保存於 /etc/sysconfig/iptables 文件中,可以使用命令service iptables save進行規則的保存,而iptables啓動或重啓的時候也是會讀取/etc/sysconfig/iptables中的配置來生成相應的規則。

  Centos7:     其規則的保存和恢復則使用下面兩個命令來實現:       保存:iptables-save > /PATH/TO/SOME_RULE_FILE       重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE

相關文章
相關標籤/搜索