iptables使用簡介

.iptables 簡介

   當一臺主機接入至一個網絡中的時候,就不可避免的會受到來至網絡的可能***,爲了解決這一問題,誕生了防火牆(Firewall)的技術,通過防火牆可以阻隔絕大多數的來路不明的網絡請求,從而保護自己的主機。

   防火牆可以分爲硬件防火牆和軟件防火牆,軟件防火牆即是通過軟件處理邏輯對通過主機的各種報文,信息等進行監控阻隔等,而硬件防火牆則可以基於硬件直接進行阻隔,硬件防火牆中部分功能也需要基於軟件實現。

    Iptables是基於軟件實現的防火牆,主要有兩個部分組成。內核空間中的netfilter,提供了整個防火牆框架,而iptables則位於用戶空間,主要是給用戶提供一個接口,使得用戶可以根據需要對位於內核的netfilter進行管理操作。

    Netfilter主要是通過5hookfunction(鉤子函數)在內核級別實現報文的監控修改等操作,他們分別爲prerouting,input,forward,output,postrouting。而用戶空間的iptables則分別使用5條鏈對應這五個hookfunction。爲了便於管理iptables還設定了4個不同的功能(tables

    filter:過濾,防火牆;

    natnetworkaddress translation;用於修改報文的源地址或目標地址,甚至是端口;

    mangle:拆解報文,做出修改,並重新封裝起來;

    raw:關閉nat表上啓用的連接追蹤機制;

        優先級次序(由高而低)

                              raw--> mangle --> nat --> filte

        其中功能與鉤子的關係爲:

功能<-->鉤子:

rawPREROUTINGOUTPUT

manglePREROUTINGINPUTFORWARDOUTPUTPOSTROUTING

natPREROUTINGINPUTOUTPUTPOSTRUTING

filterINPUTFORWARDOUTPUT

 

.iptables 設置

   獲取幫助:

      CentOS7man iptables-extensions

      CentOS6man iptables

   使用格式

      iptables [-t table] COMMAND chain[-m matchname [per-match-options]] [-j targetname [per-target-options]]

      -t table:默認爲filter;其它可用的有raw, mangle, nat

      COMMAND:

      對鏈操作:

         -Ppolicy,策略,定義默認策略; 一般有兩種選擇,ACCEPTDROP

         -Nnew,新建一條自定義的規則鏈;被內建鏈上的規則調用才能生效

         -Xdrop,刪除自定義的引用計數爲0的空鏈;

         -Fflush,清空指定的鏈;

         -E:重命名自定義的引用計數和爲0的鏈;

      管理規則:

         -Aappend,追加,在指定鏈的尾部追加一條規則;

         -Iinsert,插入,在指定的位置(省略位置時表示鏈首)插入一條規則;

         -Ddelelte,刪除,刪除指定的規則;

         -Rreplace,替換,將指定的規則替換爲新規則;不能僅修改規則中的部分,而是整條規則完全替換;

      查看:

         -Llist,列出表中的鏈上的規則;

           -nnumeric,以數值格式顯示;

           -vverbose,顯示詳細格式信息;

           -vv,-vvv

           -xexactly,計數器的精確結果;

           --line-numbers:顯示鏈中的規則編號;

         計數器:

        規則,以及默認策略有專用的計數器;

        記錄被當前規則所匹配到的:

            (1)報文個數;

            (2)字節總數;

        重置規則計數器:

             -Zzero,置0

      chain

      (1)內建鏈;PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

      (2)自定義鏈;

      匹配條件:

      一條規則中存在多條匹配規則時,邏輯關係爲“與”

        1)基本匹配條件:

          [!]-s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍;

          [!]-d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;

         e.g.禁止172.16.10.17連接172.16.10.7主機

       ~]#iptables -A INPUT -s 172.16.10.17 -d 172.16.10.7 -j DROP

          [!]-p, --protocol protocol

          protocol{tcp|udp|icmp}

          [!]-i, --in-interface name:數據報文的流入接口;INPUT, FORWARD,PREROUTING

          [!]-o, --out-interface name:數據報文的流出接口:FORWARD,OUTPUT, POSTROUTING

        e.g. 將通過eno16777736網卡的所有請求全都拒絕

       ~]#iptables -A INPUT -i eno16777736 -j REJECT

       2)擴展匹配條件

         隱式擴展:不用-m選項指出matchname即可使用此match的專用選項進行匹配;

          -p tcp:隱含了-m tcp

          [!]--source-port,--sport port[:port]:匹配報文中傳輸層的源端口;

         

      e.g.禁止所有請求訪問tcp23端口

       ~]#iptables -A INPUT -p tcp --dport 23 -j DROP


          [!]--destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口;

          [!]--tcp-flags mask comp

          標識位:SYNACKFINRSTURGPSH        

             mask:要檢查的標誌位列表,以逗號分隔;

             comp:必須爲1的標誌位,餘下的出現在mask列表中的標誌位則必須爲0

              --tcp-flags  SYN,ACK,FIN,RST  SYN

          [!]--syn

          相當於--tcp-flags  SYN,ACK,FIN,RST  SYN

          -p udp:隱含了-m udp

          [!]--source-port,--sport port[:port]:匹配報文中傳輸層的源端口;

          [!]--destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口;

          -p icmp:隱含了-m icmp:

          [!] --icmp-type{type[/code]|typename}

            8echo-request  用於請求

            0echo-reply   用於應答

          e.g.禁止除172.16.10.17外的所有主機對本機進行ping操作

          ~]#iptables -A INPUT ! -s 172.16.10.17 -d 172.16.10.7 -p icmp --icmp-type 8 -jDROP

          ~]#iptables -A OUTPUT ! -d 172.16.10.17 -s 172.16.10.7 -p icmp --icmp-type 0 -j DROP

 

       顯式擴展:必須使用-m選項指出matchname,有的match可能存在專用的選項;

          multiport擴展

          以離散或連續的方式定義多端口匹配條件;

          [!]--source-ports,--sports port[,port|,port:port]...:指定多個源端口;

          [!]--destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;

       e.g.禁止所有請求訪問tcp21,222380端口

       ~]#iptables -A INPUT -p tcp –m multiport --dports 21:23,80 -j DROP

          [!] --portsport[,port|,port:port]...:指定多個端口;

 

          iprange擴展

          以連續的ip地址範圍指明連續的多地址匹配條件;

          [!]--src-range from[-to]:源IP地址;

          [!]--dst-range from[-to]:目標IP地址;

 

          string擴展

          對報文中的應用層數據做字符串匹配檢測;

          [!]--string pattern:要檢測字符串模式;

          [!]--hex-string pattern:要檢測的字符串模式,16進制編碼;

          --algo{bm|kmp}

 

          time擴展

          根據報文到達的時間與指定的時間範圍進行匹配度檢測;

          --datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間;

          --datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結束日期時間;

 

          --timestarthh:mm[:ss]  開始時間

          --timestop  hh:mm[:ss] 結束時間

 

          [!]--monthdays day[,day...]  開始日

          [!]--weekdays day[,day...]   結束日

         e.g.在週二,四,六的工作時間開放23號端口

         ~]#iptables -I INPUT -d 172.16.10.7 -p tcp --dport 23 -m time --timestart 09:00:00--timestop 18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT

 

          connlimit擴展

          根據每客戶端IP做併發連接數匹配; 

          --connlimit-upton:連接數數量小於等於n,此時應該允許;

          --connlimit-aboven:連接數數量大於n,此時應該拒絕; 

         ~]#iptables -A INPUT -d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto2 -j ACCEPT

 

          limit擴展

            基於收發報文的速率進行匹配;

          --limitrate[/second|/minute|/hour|/day]:平均速率

          --limit-burstnumber:峯值速率

          state擴展

          state STATE

          狀態檢測;連接追蹤機制(conntrack);

               INVALID:無法識別的狀態;

               ESTABLISHED:已建立的連接;

               NEW:新連接;

               RELATED:相關聯的連接;

               UNTRACKED:未追蹤的連接;

          狀態追蹤需要掛載nf_conntrack內核模塊;

          追蹤到的連接:/proc/net/nf_conntrack文件中 

          能追蹤的最大連接數量定義在:/proc/sys/net/nf_conntrack_max

          此值可自行定義,建議必要時調整到足夠大;

          不同的協議的連接追蹤的時長:/proc/sys/net/netfilter/  

 

        e.g.如何開放被模式的ftp服務:

        裝載追蹤ftp協議的模塊;

        ~]#modprobe nf_conntrack_ftp 

        放行命令連接

        ~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -jACCEPT

        ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW -jACCEPT

        放行數據連接

        ~]iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT

                

     FORWARD鏈上定義時需要注意下列幾個問題:

       (1)請求-響應均經由FORWARD鏈,要注意規則的方向性;

       (2)如果可以啓用conntrack機制,建議將雙方向的狀態爲ESTABLISHED的報文直接放行;

         e.g.僅讓外部主機僅能訪問192.168.10.27主機的httpd服務以及ftpd服務

         1~]# iptables-A FORWARD 1 -d 192.168.10.27 -p tcp -m multiport --dports 21,80 -m state--state NEW -j ACCEPT

         2~]# iptables-A FORWARD 3 -d 192.168.10.27 -m state --state ESTABLISHED,RELATED -j ACCEPT

         3~]# iptables-A FORWARD -s 172.16.0.0/16 -d 192.168.10.27 -j DROP

         4~]# modprobenf_conntrack_ftp

                

      自定義鏈:

         iptables-N chain_name  添加一條自定義鏈

         iptables-X chian_name    刪除自定義鏈(刪除前需要清空規則)

         iptables-E old_name new_name  重命名自定義鏈

         -j  chain_name  引用指定的自定義鏈

           通常自定義鏈最後需要添加一條RETURN已回到之前的主鏈

                

     處理動作

         ACCEPT:接收

         DROP:丟棄

         REJECT:拒絕

         REDIRECT:重定目標端口,只能使用在nat表上,以及PREROUTING,OUTPUT鏈上面,其他地方要使用則必須引用

         --to-portsport[-port]:映射至哪個目標端口;

         e.g.  httpd服務的80端口映射至8088端口

         ~]#iptables -t nat -A PREROUTING -d 192.168.10.27 -p tcp --dport 80 -j REDIRECT--to-port 8088


        SNAT:修改源地址,只能使用在nat表上,以及POSTROUTING,INPUT鏈上面,其他地方要使用則必須引用,如果IP地址爲動態引用則使用MASQUERADE

        --to-source  [ipaddr[-ipaddr]][:port[-port]]

        ~]#iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source172.16.10.17

      設置上述規則後,192.168.0.0網段的主機經過該路由時IP地址都會被轉換爲172.16.10.17,從而可以實現內網對外網的各種服務的訪問


       DNAT:修改源地址,只能使用在nat表上,以及PREROUTING,OUTPUT鏈上面,其他地方要使用則必須引用

        --to-destination[ipaddr[-ipaddr]][:port[-port]]

        ~]#iptables -t nat -A PREROUTING -d 172.16.10.17 -p tcp --dport 80 -j DNAT--to-destination 192.168.10.27:8088

      當外部主機訪問172.16.10.17主機的tcp協議的80端口時,會自動轉至內網中的192.168.10.27主機的8088端口

                

       LOG:日誌功能,日誌保存在/var/log/messages

         --log-prefix:給日誌添加前綴

         --log-ip-options:日誌中記錄IP首部的信息

         e.g.將訪問172.16.10.7主機tcp協議80端口情況記錄日誌

         ~]#iptables -A INPUT -d 172.16.10.7 -p tcp --dport 80 -j LOG --log-prefix "STRING"--log-ip-options

 

.總結

   添加規則之時需要考量的問題:

      (1)報文的流經路徑,判斷添加規則至哪個鏈上;

      (2)確定要實現的功能,判斷添加規則至哪個表上;

      (3)要指定的匹配條件,以用於匹配目標報文;

    添加規則後注意優化:

      (1)可安全放行所有入站及出站,且狀態爲ESTABLISHED的連接;

      (2)服務於同一類功能的規則,匹配條件嚴格的放前面,寬鬆放後面;

      (3)服務於不同類功能的規則,匹配報文可能性較大擴前面,較小放後面;

      (4)設置默認策略;

        (a)最後一條規則設定,在每個表的最後添加一條拒絕或接受的默認規則;

           iptables–A INPUT –d 172.16.10.17 –j DROP

        (b)默認策略設定;


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