linux iptables理論學習

  近來回顧系統知識,想寫個基於iptables安全防護的腳本,實現系統自動防禦。html

  參考文檔:http://blog.chinaunix.net/uid-26495963-id-3279216.html安全

  iptables的歷史網絡

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

   他們都是工做在用戶空間中,定義規則的工具,自己並不算是防火牆。它們定義的規則,可讓在內核空間當中的netfilter來讀取,而且實現讓防火牆工做。而放入內核的地方必需要是特定的位置,必須是tcp/ip的協議棧通過的地方。而這個tcp/ip協議棧必須通過的地方,能夠實現讀取規則的地方就叫作 netfilter.(網絡過濾器) tcp

 

    做者一共在內核空間中選擇了5個位置, 函數

      1.內核空間中:從一個網絡接口進來,到另外一個網絡接口去的  工具

      2.數據包從內核流入用戶空間的 ui

      3.數據包從用戶空間流出的 spa

      4.進入/離開本機的外網接口 .net

      5.進入/離開本機的內網接口

  iptables的工做機制

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

     1.PREROUTING (路由前)

     2.INPUT (數據包流入口)

     3.FORWARD (轉發管卡)

     4.OUTPUT(數據包出口)

     5.POSTROUTING(路由後)

   iptables的動做和策略

     防火牆的動做總共就兩種,ACCEPT和DROP,不是經過就是丟棄。而針對不一樣位置有不一樣的策略表,每一個表在不一樣的位置上有不一樣的鏈(chain)。

      image

       image

       如圖所示,咱們如今用的比較多鏈的功能有3個:

        1.filter 定義容許或者不容許的

        2.nat 定義地址轉換的 

        3.mangle功能:修改報文原數據

       iptables規則的寫法

       iptables定義規則的方式比較複雜:

       格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

                -t table :3個filter nat mangle

                COMMAND:定義如何對規則進行管理

                chain:指定你接下來的規則究竟是在哪一個鏈上操做的,當定義策略的時候,是能夠省略的

                CRETIRIA:指定匹配標準

                -j ACTION :指定如何進行處理

                好比:不容許172.16.0.0/24的進行訪問。

                iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP

                固然你若是想拒絕的更完全:

                iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT

                iptables -L -n -v #查看定義規則的詳細信息

        iptables COMMAND詳解

           1.鏈管理命令

              -P :設置默認策略的  (accept|drop)

                   iptables –P INPUT (ACCEPT|DROP)

               -F:清空規則鏈

               -N: 新建一個用戶自定義鏈

               -X: 刪除一個用戶自定義鏈

               -E: 用於重命名用戶自定義鏈的名稱

               -Z: 清空鏈及鏈中的計數器

            2.規則管理命令

                -A :追加

                -I chain num: 插入

                -R chain num:替換

                -D chain num:刪除

            3.查看管理命令 「-L」

                 -n :以數字方式顯示ip

                 -v :顯示詳細信息

                 -vv -vvv越多越詳細

                 -x :在計數器上顯示精確值,不作單位換算

                 --line-numbers :顯示規則行號

                 -t nat:顯示全部的關卡的信息

          詳解匹配標準

                  1.通用匹配:源地址目標地址的匹配

                               -s: 指定做爲源地址匹配,這裏不能指定主機名稱,必須是IP

                                     IP  |  IP/MASK | 0.0.0.0/0.0.0.0

                               -d: 表示匹配目標地址

                               -p: 用於匹配協議的

                               -i eth#:從這塊網卡流入的數據

                               -o eth#:從這塊網卡流出的數據

                   2.擴展匹配:對協議的擴展

                              -p tcp :TCP協議的擴展

                                         --dport ##-##:  xx制定目的端口

                                         --tcp-flags: TCP的標誌位

                                         --tcp-flags syn,ack,fin,rst syn = –-syn

                            -p udp : UDP協議的擴展

                                         --dport

                                         --sport

                            -p icmp : icmp數據報文的擴展

                                         --icmp-type icmp的類型

                     3.顯示擴展

                             -m,表示啓用多端口擴展

                             以後咱們就能夠啓用好比 –dports 21,23,80

                 詳解-j ACTION

                         經常使用的ACTION

                             DROP:悄悄丟棄

                             REJECT:明示拒絕

                             ACCEPT:接受

                詳解狀態檢測

     什麼是狀態檢測?對於整個TCP協議來說,它是一個有鏈接的協議,三次握手中,第一次握手,咱們就叫NEW鏈接,而從第二次握手之後的,ack都爲1,這是正常的數據傳輸,和tcp的第二次第三次握手,叫作已創建的鏈接(ESTABLISHED),還有一種狀態,比較詭異的,好比:SYN=1 ACK=1 RST=1,對於這種咱們沒法識別的,咱們都稱之爲INVALID沒法識別的。還有第四種,FTP這種古老的擁有的特徵,每一個端口都是獨立的,21號和20號端口都是一去一回,他們之間是有關係的,這種關係咱們稱之爲RELATED。

                因此咱們的狀態一共有四種:

                         NEW

                         ESTABLISHED

                         RELATED

                         INVALID

 

             具體這個狀態檢測能夠用來作什麼呢?

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j REJECT

        這句命令的意思是在INPUT的位置只容許第二次握手後的數據包和有依賴關係的數據包經過,這樣就能讓外部用戶都沒法發起對本機tcp鏈接,對於處於公網上,非C/S架構的業務會比較有效。

       可是這句話有個問題,你連第一次發起的連接都拒絕了,那我root用戶不是想管都管不上了?

       因而就須要在這句話前放行你本身所在的IP網段的tcp state new,讓本地網絡能夠訪

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

  

          limit,limit-burst詳解

       從iptables指南上看出limit和limit-burst最初不是拿來限速的。是拿來限制日誌記錄的次數的(iptables的logging功能),好比一秒1w個包,經過iptables的匹配了logging規則,都記錄下來,log信息會無比龐大。在logging的規則中加上limit以後,能夠有每秒/分/小時記錄多少次的效果。

iptables -A INPUT -i wlan0 -m limit --limit 1000/s -j ACCEPT
iptables -A INPUT -i wlan0 -j DROP

       這兩條規則一塊兒,能夠有限制沒秒經過無線網卡上傳包的數目爲1000,由於INPUT 進來的包,進行ACCEPT的次數被限制爲1000次每秒,OUTPUT也是如此。

       另外須要注意的是第二條規則iptables -A INPUT -i wlan0 -j DROP  若是沒有它,限速不成功。

       由於在iptables裏,一個包不符合某條規則,就會由後面的規則來處理,若是都不符合,就由缺省的策略處理。因此若是limit後面沒規則了,默認規則就是全量ACCEPT,也就是每秒ACCEPT規則匹配超過1000次以後,那些包,都由默認規則(ACCEPT)來處理,因此沒法限速。

         關於limit-burst

         我的理解limit-burst是個初始值..匹配次數過了這個初始值,以後的就由limit xxx/s來控制了 

相關文章
相關標籤/搜索