iptables詳解

  1. 1.    iptables

用於實現Linux下訪問控制的功能,它分爲硬件或軟件防火牆兩種,無論哪種,防火牆都是工作的地方一定是在網絡的邊緣,我們的工作就是需要去定義到底防火牆是如何工作,這就是防火牆的策略以及規則,以達到讓它對出入網絡的IP,數據進行檢測.

iptables/netfilter:軟件實現的主機或網絡防火牆

主機防火牆:服務範圍爲當前主機;

網絡防火牆:服務範圍爲局域網;

iptables/netfilterIP數據包過濾系統實際上有netfilter和iptables兩個組件構成,

        netfilter組件也稱爲內核空間,是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集.

        iptables組件是一種工具,也稱爲用戶空間,它使插入,修改和除去信息包過濾表中的規則變得容易.

        iptables包含4個表,5個鏈,其中表是按照對數據包的操作區分的,鏈是按照不同的Hook(鉤子)點來區分的,實際上似乎netfilter的兩個維度.

        4個表:filter,nat,mangle,raw,默認的表是filter(沒有指定表的時候就是filter表).表的處理優先級爲:rawàmangleànatàfilter.

               filter:一般的過濾功能

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

               mangle:拆解數據包,做出修改,並重新封裝起來

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

        5個鏈:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING

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

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

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

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

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

              iptables中表和鏈的對應關係:

                     raw:PREROUTING,OUTPUT

                     mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

                     nat:PRETOUTING,INPUT,OUTPUT,POSTROUTING

                     filter:INPUT,FORWOAR,OUTPUT

最常用的鏈:input(進入),output(出去),forward(轉發),而PREROUTING和POSTROUTING用於網絡地址轉換(NAT)

              報文流向:

                     到本機某進程的報文:PREROUTINGàINPUT

當一個數據包進入網卡時,首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去,如果數據包是進入本機的,則數據包會到達INPUT鏈.到達後,任何進都會收到它.

                     由本機轉發的報文:PREROUTINGàFORWARDàPOSTROUTING

由上文的第一步開始後,內核根據數據包目的IP判斷需要轉送出去後,且內核允許轉發,數據包會送到FORWARD鏈,然後在到達POSTROUTINGOUT鏈輸出.

                     由本機某進程發出的:OUTPUTàPOSTROUTING

              規則的組成部分:

規則就是運維管理人員定製的條件,規則一般定義爲如果數據包頭符合條件,就處理處理數據包,規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址,目的地址,傳輸協議(如TCP,UDP,SMCP等)當數據包於規則匹配是,iptables就根據所定義的方法來處理數據包,如放行,(ACCEPT),拒絕(REJECT),丟棄(DROP)等,配置防火牆的主要工作就是添加,修改和刪除這些規則.

注意:處理數據包時,如果不想處理數據包時,定義方法最好爲丟棄(DROP),如果處理方法爲拒絕(REJECT)的話對方根據此來判斷此主機是存在,那麼就會想法設法***.

             

  1. 2.    iptables命令

規則的編寫格式:

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

                    

                     -t:表名

                            默認爲filter,其他可用的有raw,mangle,nat

                    

                     COMMAND:

                            鏈:

                                   -P:policy,策略,定義默認策略;一般有兩種選擇,ACCEPT(放行)和DROP(丟棄)

                                   -N:new,新建一條自定義的規則鏈;被內建鏈上的規則調用才能生效;[-j                                           chain_name];                              

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

                                   -F:flush,清空指定的鏈;

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

                            規則:

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

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

                                          -I 3:表示插入爲第3條

                                   -D:delete:刪除,刪除指定的規則

                                          -D 3:表示刪除爲第3條

-R:replace,替換,將指定的規則替換爲新規則;不能僅修改規則中的部分,而是全部替換;              

       -R 3:表示替換第3條規則

                      查看:

                             -L:list,列出表中鏈上的規則;

                                    -n:numeric,以數值格式顯示;

                                    -v:verbose,顯示詳細格式信息;

                                           -vv,-vvv:表示更加詳細的格式信息

                                    -x:exactly:計數器的精確結果;

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

                      計數器:

                             重置規則計數器:

                                    -Z:zero,歸0操作;

              Chain

(1)  內建鏈;

(2)  自定義鏈;

匹配條件:

       多重條件:邏輯關係爲與;

       基本匹配條件:

[!] –s,--sourceaddress[/mask][,…:] :檢查報文中的源IP地址是否符合此處指定的地址或範圍;可以寫多重條件用”,”隔開

[!] –d, --destinationaddress[/mask][,…] :檢查報文中的目標IP地址是否符合此處指定的地址;

       [!] –p,--protocol {TCP|UDP|ICMP}:檢查報文中的協議是否符合此處指定的協議

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

[!] –o, --out-interfacename:數據報文的流出接口;FORWARD,OUTPUT and POSTROUTING

              擴展匹配條件

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

                            -p tcp:隱含了-mtcp;

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

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

                                   [!]--tcp-flags mask comp

                                          SYN,ACK,FIN,RST,URG,PSH;

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

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

                                                       

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

                                   [!] --syn

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

                                   -p udp:隱含了-mudp:

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

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

                                   -p icmp:隱含了-micmp:

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

                                          8:echo-request

                                          0:echo-reply

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

                            獲取幫助:

                                   Centos 7: maniptables-extensions

                                   Centos 6:man iptables

                            Multiport擴展

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

                                   [!] –source-ports,--sportspotr[,port|,port:port]… :指定多個源端口
                                   [!]—destination-ports,dportsport[,port|,port:port]…:指定多個目標端口

                                   [!]—ports port[,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...]

~]# iptables -I INPUT-d 172.16.100.67 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop18: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-upto 2 -j ACCEPT

                            limit擴展

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

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

                                   --limit-burstnumber:峯值速率

                            state擴展

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

                                   INVALID:無法識別的狀態;

                                   ESTABLISHED:已建立的連接;

                                   NEW:新連接;

                                   RELATED:相關聯的連接;

                                   UNTRACKED:未追蹤的連接;

                                   nf_conntrack內核模塊;

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

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

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

                                          不同的協議的連接追蹤的時長:

                                                 /proc/sys/net/netfilter/

                                                              

                                          [!]--state STATE

                            處理動作(目標)

                                   j targetname [per-target-options]

                                          rgetname

                                          ACCEPT:接受

                                          ROP:丟棄;

                                          EJECT:拒絕;

  1. 3.    保存和重載規則:

ptables-save > /PATH/TO/SOME_RULE_FILE

iptables-restore< /PATH/FROM/SOME_RULE_FILE

        CentOS 6

                    保存規則:

                            service iptablessave

                                   自動保存規則至/etc/sysconfig/iptables文件中;

                    重載規則:

                            server iptables restore

                                   從/etc/sysconfig/iptables文件中重載規則;

4.   規則優化:

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

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

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

              (4) 設置默認策略;

                     (a) 最後一條規則設定;

                     (b) 默認策略設定;


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