Jpdu

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            1 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
          Iptables原理
          現在防火墻主要分以下三種類型:包過濾、應用代理、狀態檢測 萌萌的IT人

           

                  包過濾防火墻現在靜態包過濾防火墻市面上已經看不到了,取而代之的是動態包過濾技術的防火墻哈~

                  代理防火墻:因一些特殊的報文攻擊可以輕松突破包過濾防火墻的保護,比如大家知道的SYN攻擊、ICMP洪水攻擊,所以以代理服務器作為專門為用戶保密或者突破訪問限制的數據轉發通道的應用代理防火墻出現了哈~其使用了一種應用協議分析的新技術。

                          狀態檢測防火墻:其基于動態包過濾技術發展而來,加入了一種狀態檢測的模塊,進一點發展了會話過濾功能,會話狀態的保留是有時間限制的,此防火墻還可以對包的內容進行分析,從而避免開放過多的端口。

                  netfilter/iptables IP數據包過濾系統實際上由netfilter和iptables兩個組件構成。netfilter是集成在內核中的一部分,其作用是定義、保存相應的規則,而iptables是一種工具,用來修改信息的過濾規則及其他配置,我們可以通過iptables來設置一些適合我們企業需求環境的規則哈~,而這些規則會保存在內核空間之中。

                  netfilter是Linux核心中的一個通用架構,其提供了一系列的表(tables),每個表由若干個鏈(chains)組成,而每條鏈可以由一條或若干條規則(rules)組成。實際上netfilter是表的容器,表是鏈的容器,而鏈又是規則的容器。

              

             iptables內置鏈 

              PREROUTING:數據包進入本機,進入路由器之前

              INPUT:通過路由表后目的地為本機

              FORWARDING:通過路由表后,目的地不為本機

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

              POSTROUTIONG:通過路由表后,發送到網卡接口之前

          以下是表和鏈的對應關系

          wKiom1P0K0ahCo6vAAMe6fUESvQ785.jpg

          二、iptables的基本用法

             基本語法:

                  iptables [-t table] COMMAND CHAIN CRETIRIA -j TARGET

              -t table:

                  net,mangle,raw,filter

                      默認為filter

               COMMAND:

                   鏈:    

                      -F:(flush)清空規則鏈

                      -N:(new)自建一條鏈

                      -X:(delete)刪除一條自定義的空鏈

                      -Z:(zero)計數器歸零

                      -P:(policy)設置默認策略,對filter表來講,默認規則為ACCEPT或DROP

                      -E:重命名自定義鏈

                   CHAIN指定你接下來的規則到底是在哪個鏈上操作的

                  CRETIRIA:指定匹配標準         

                            ACTION :指定如何進行處理

                                      常用指令

                          DROP:悄悄丟棄一般我們多用DROP來隱藏我們的身份,以及隱藏我們的鏈表

                          REJECT:明示拒絕

                          ACCEPT:接受

                          DNAT:明確申明要做的是目的地地址轉換操作

                          SNAT:明確申明要做的是源地址轉換操作

                          MASQUERADE:源地址偽裝

                          REDIRECT:重定向:主要用于實現端口重定向

                          MARK:打防火墻標記的

                          RETURN:返回在自定義鏈執行完畢后使用返回,來返回原規則鏈



               鏈中的規則

                      -A:(append)在所選擇的鏈末添加一條或更多規則

                                  -I:  (insert) 根據給出的規則序號向所選鏈中插入一條或更多規則

                                  -D:(delete)從所選鏈中刪除一條或更多規則

                                  -R:(replace)從選中的鏈中取代一條規則

              常用查詢命令

                     -L

                       -n :數字格式顯示主機地址端口

                       -v:顯示詳細格式信息

                       -vv 

                       -vvv:越多顯示的越詳細

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

                      -x: exactly,不要對計數器的計數結果做單位換算,而顯示其精確值

                      pkts bytes target     prot opt in     out     source       destination 
                              pkts: packets, 被本規則所匹配到的報文的個數
                              bytes: 被本規則所匹配到的所有報文的大小之和,會執行單位換算
                              target: 目標,即處理機制
                              prot: 協議,一般為{TCP|UDP|ICMP}
           

                              opt: 可選項
                              in: 數據包的流入接口
                              out: 數據包的流出接口
                              source: 源地址

                              destination: 目標地址

          三、 匹配標準

                  通用匹配

                      -s 地址:指定報文源IP地址的匹配的范圍;可以是IP,也可以是網絡地址;可使用!取反

                          --src, --source

                      -d 地址:指定報文目標IP地址匹配的范圍

                          --dst, --destination

                      -p 協議:指定匹配報文的協議類型,一般有三種tcp,udp,icmp

                      -i ethX :數據報文流入的接口:PREROUTING,INPUT,FORWARD

                      -o ethX :數據報文流入的接口:OUTPUT,FORWARD,POSTROUTING

                  擴展匹配

                      隱式匹配: 當使用-p{tcp|udp|icmp}中的一種時,可以直接使用擴展專用選項

                          -p tcp

                              --sport PORT[-PORT]:指定源端口,可以是多個端口

                              --dport PORT[-PORT]:指定目標端口,可以是連續的多個端口

                              --tcp-flag:TCP的標志位列表(用逗號分隔)

                                      必須為1 的標志位列表

                                          eg:--tcp-flags syn,ack,rst,fin syn

                                          -p udp

                                                  --sport PORT[-PORT]:指定源端口,可以是多個端口

                                                  --dport PORT[-PORT]:指定目標端口,可以是連續的多個端口

                                          -p icmp 

                                                 --icmp-type:

                                                     echo-request(請求回顯),一般用8 來表示

                                                     echo-reply (響應的數據包)一般用0來表示

                              顯示擴展    -m   必須要指定要擴展的擴展模塊名稱

                                   multiport: 多端口匹配

              可用于匹配非連續或連續端口;最多指定15個端口;用冒號分隔

                     eg:        

                       iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT

              iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT

                         

                       iprange: 匹配指定范圍內的地址

          匹配一段連續的地址而非整個網絡時有用;

                              專用選項:

          [!] --src-ragne IP[-IP]

          [!] --dst-range

                  iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT

                  iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

                      

                       string: 字符串匹配,能夠檢測報文應用層中的字符串

              字符匹配檢查高效算法

          kmp, bm

                           專用選項:

          --algo {kmp|bm}

          --string "STRING"

          --hex-string "HEX_STRING": HEX_STRING為編碼成16進制格式的字串;

                        eg:

          iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP

                          

                      time: 基于時間做訪問控制

                  專用選項:

              --datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]

              --datestop 

                              --timestart hh:mm[:ss]

              --timestop hh:mm[:ss]

                              --weekdays day[,day]Mon, Tue,

                      eg:

                       iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT


          connlimit: 連接數限制,對每IP所能夠發起并發連接數做限制;

              專用選項:

          [!] --connlimit-above [n] 

                      eg:

                  iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP


          limit: 速率限制

          專用選項:

          --limit n[/second|/minute|/hour|/day]

          --limit-burst n

                      eg:

           iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT

                 

          state: 狀態檢查

              專用選項:

              --state 

                      連接追蹤中的狀態:

          NEW: 新建立一個會話

          ESTABLISHED:已建立的連接

          RELATED: 有關聯關系的連接

          INVALID: 無法識別的連接


          調整連接追蹤功能所能容納的連接的最大數目:

                      /proc/sys/net/nf_conntrack_max

            當前追蹤的所有連接

                      /proc/net/nf_conntrack

          不同協議或連接類型追蹤時的屬性:

                      /proc/sys/net/netfilter目錄:

          放行被動模式下的FTP服務:

                  1、裝載模塊/lib/modules/KERNEL_VERSION/kernel/net/netfilter/

          模塊:nf_conntrack_ftp

                  2、放行請求報文:

          (1)放行NEW狀態對21端口請求的報文;

           (2) 放行ESTABLISHED以及RELATED狀態的報文

                  3、旅行響應報文:

           (1) 放行ESTABLISHED以及RELATED狀態的報文

           

          四、寫規則

                     先確定功能(表),確定報文流向,確定要實現的目標,確定匹配條件

              流向

                  與本機進程通信:

                      流入:-->PREROUTING-->INPUT

                      流出:-->OUTPUT-->POSTROUTING

                  經由本機轉發:

                      請求:-->PREROUTING-->FORWARD-->POSTROUTING

                      響應:-->PREROUTING-->FORWARD-->POSTROUTING

                   寫規則時要注意:

                      服務端:先進后出

                      客戶端:先出后進

          客戶端端口是隨機的,因此大多數場景下無須限定

              規則文件:/etc/sysconfig/iptables

                  保存啟用中的規則于規則文件中:

                      1、iptables-save > /etc/sysconfig/iptables

                      2、service iptables save

                  生效規則文件中的規則:

                      1、iptables-restore < /etc/sysconfig/iptables

                      2、service iptables restart

                          執行的操作:清空現有規則,讀取并生效規則文件中的規則

               常用語法

                   刪除規則:

                      iptables [-t table] -D chain rulenum

                  設置策略:

                      iptables [-t table] -P chain target

                  修改規則:

                      iptables [-t table] -R chain rulenum rule-specification

                  插入規則:

                      iptables [-t table] -I chain [rulenum] rule-specification

                   創建自定義鏈:

                      iptables [-t table] -N chain

                  刪除自定義且0引用的空鏈

                      iptables [-t table] -X chain

                  重命名自定義鏈:

                      iptables [-t table] -E old_name new_name

          五、例子

              

          1、SNAT基于原地址的轉換

                 基于原地址的轉換一般用在我們的許多內網用戶通過一個外網的口上網的時候,這時我們將我們內網的地址轉換為一個外網的IP,我們就可以實現連接其他外網IP的功能。

                比如我們現在要將所有192.168.10.0網段的IP在經過的時候全都轉換成172.16.100.1這個假設出來的外網地址:

              iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.200.1

                 

                  這樣,只要是來自本地網絡的試圖通過網卡訪問網絡的,都會被統統轉換成172.16.100.1這個IP.


                 我們都知道當我們使用聯通或者電信上網的時候,一般它都會在每次你開機的時候隨機生成一個外網的IP,意思就是外網地址是動態變換的。這時我們就要將外網 地址換成 MASQUERADE(動態偽裝):它可以實現自動尋找到外網地址,而自動將其改為正確的外網地址。所以,我們就需要這樣設置:

                  

                  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

          這里要注意:地址偽裝并不適用于所有的地方。

          iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1


          2、DNAT目標地址轉換

                 對于目標地址轉換,數據流向是從外向內的,外面的是客戶端,里面的是服務器端

          通過目標地址轉換,我們可以讓外面的ip通過我們對外的外網ip來訪問我們服務器不同的服務器,而我們的服務卻放在內網服務器的不同的服務器上。


              iptables -t nat -A PREROUTING -d 192.168.1.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.200.7

          目標地址轉換要做在到達網卡之前進行轉換,所以要做在PREROUTING這個位置上


          3、只允許192.168.1.3訪問服務器的SSH

                  iptables -A INPUT  -s 192.168.1.3 -p tcp --dport  22 -j ACCEPT


          4、屏蔽IP即從192.168.1.0到192.168.1.1254

                  iptables -I INPUT -s 192.168.1.0/24 -j DROP

          5、丟棄非法連接

                  iptables -A INPUT -m state --state INVALID -j DROP    

                  iptables -A OUTPUT -m state --state INVALID -j DROP

                  iptables-A FORWARD -m state --state INVALID -j DROP

          6、允許ping

                  iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
                          iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

          7、預防DOS攻擊

                  iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

          posted on 2014-11-20 16:53 聶鳳 閱讀(6669) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 始兴县| 韩城市| 盐亭县| 嘉义市| 永济市| 安仁县| 沽源县| 淅川县| 德令哈市| 赫章县| 石嘴山市| 云梦县| 云南省| 襄汾县| 鄂托克旗| 江都市| 荥阳市| 清镇市| 兰州市| 象州县| 阆中市| 定安县| 扶沟县| 含山县| 陇南市| 临澧县| 永康市| 玉溪市| 抚顺市| 奈曼旗| 琼海市| 东城区| 虞城县| 二手房| 缙云县| 荣昌县| 延川县| 棋牌| 抚州市| 光山县| 峨眉山市|