Jpdu

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

           

                  包過濾防火墻現(xiàn)在靜態(tài)包過濾防火墻市面上已經(jīng)看不到了,取而代之的是動態(tài)包過濾技術(shù)的防火墻哈~

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

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

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

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

              

             iptables內(nèi)置鏈 

              PREROUTING:數(shù)據(jù)包進入本機,進入路由器之前

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

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

              OUTPUT:由本機產(chǎn)生,向外轉(zhuǎn)發(fā)

              POSTROUTIONG:通過路由表后,發(fā)送到網(wǎng)卡接口之前

          以下是表和鏈的對應(yīng)關(guān)系

          wKiom1P0K0ahCo6vAAMe6fUESvQ785.jpg

          二、iptables的基本用法

             基本語法:

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

              -t table:

                  net,mangle,raw,filter

                      默認(rèn)為filter

               COMMAND:

                   鏈:    

                      -F:(flush)清空規(guī)則鏈

                      -N:(new)自建一條鏈

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

                      -Z:(zero)計數(shù)器歸零

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

                      -E:重命名自定義鏈

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

                  CRETIRIA:指定匹配標(biāo)準(zhǔn)         

                            ACTION :指定如何進行處理

                                      常用指令

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

                          REJECT:明示拒絕

                          ACCEPT:接受

                          DNAT:明確申明要做的是目的地地址轉(zhuǎn)換操作

                          SNAT:明確申明要做的是源地址轉(zhuǎn)換操作

                          MASQUERADE:源地址偽裝

                          REDIRECT:重定向:主要用于實現(xiàn)端口重定向

                          MARK:打防火墻標(biāo)記的

                          RETURN:返回在自定義鏈執(zhí)行完畢后使用返回,來返回原規(guī)則鏈



               鏈中的規(guī)則

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

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

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

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

              常用查詢命令

                     -L

                       -n :數(shù)字格式顯示主機地址端口

                       -v:顯示詳細(xì)格式信息

                       -vv 

                       -vvv:越多顯示的越詳細(xì)

                      --line-numbers:顯示規(guī)則編號

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

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

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

                              destination: 目標(biāo)地址

          三、 匹配標(biāo)準(zhǔn)

                  通用匹配

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

                          --src, --source

                      -d 地址:指定報文目標(biāo)IP地址匹配的范圍

                          --dst, --destination

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

                      -i ethX :數(shù)據(jù)報文流入的接口:PREROUTING,INPUT,FORWARD

                      -o ethX :數(shù)據(jù)報文流入的接口:OUTPUT,FORWARD,POSTROUTING

                  擴展匹配

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

                          -p tcp

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

                              --dport PORT[-PORT]:指定目標(biāo)端口,可以是連續(xù)的多個端口

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

                                      必須為1 的標(biāo)志位列表

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

                                          -p udp

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

                                                  --dport PORT[-PORT]:指定目標(biāo)端口,可以是連續(xù)的多個端口

                                          -p icmp 

                                                 --icmp-type:

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

                                                     echo-reply (響應(yīng)的數(shù)據(jù)包)一般用0來表示

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

                                   multiport: 多端口匹配

              可用于匹配非連續(xù)或連續(xù)端口;最多指定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: 匹配指定范圍內(nèi)的地址

          匹配一段連續(xù)的地址而非整個網(wǎng)絡(luò)時有用;

                              專用選項:

          [!] --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: 字符串匹配,能夠檢測報文應(yīng)用層中的字符串

              字符匹配檢查高效算法

          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: 連接數(shù)限制,對每IP所能夠發(fā)起并發(fā)連接數(shù)做限制;

              專用選項:

          [!] --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: 狀態(tài)檢查

              專用選項:

              --state 

                      連接追蹤中的狀態(tài):

          NEW: 新建立一個會話

          ESTABLISHED:已建立的連接

          RELATED: 有關(guān)聯(lián)關(guān)系的連接

          INVALID: 無法識別的連接


          調(diào)整連接追蹤功能所能容納的連接的最大數(shù)目:

                      /proc/sys/net/nf_conntrack_max

            當(dāng)前追蹤的所有連接

                      /proc/net/nf_conntrack

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

                      /proc/sys/net/netfilter目錄:

          放行被動模式下的FTP服務(wù):

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

          模塊:nf_conntrack_ftp

                  2、放行請求報文:

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

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

                  3、旅行響應(yīng)報文:

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

           

          四、寫規(guī)則

                     先確定功能(表),確定報文流向,確定要實現(xiàn)的目標(biāo),確定匹配條件

              流向

                  與本機進程通信:

                      流入:-->PREROUTING-->INPUT

                      流出:-->OUTPUT-->POSTROUTING

                  經(jīng)由本機轉(zhuǎn)發(fā):

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

                      響應(yīng):-->PREROUTING-->FORWARD-->POSTROUTING

                   寫規(guī)則時要注意:

                      服務(wù)端:先進后出

                      客戶端:先出后進

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

              規(guī)則文件:/etc/sysconfig/iptables

                  保存啟用中的規(guī)則于規(guī)則文件中:

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

                      2、service iptables save

                  生效規(guī)則文件中的規(guī)則:

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

                      2、service iptables restart

                          執(zhí)行的操作:清空現(xiàn)有規(guī)則,讀取并生效規(guī)則文件中的規(guī)則

               常用語法

                   刪除規(guī)則:

                      iptables [-t table] -D chain rulenum

                  設(shè)置策略:

                      iptables [-t table] -P chain target

                  修改規(guī)則:

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

                  插入規(guī)則:

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

                   創(chuàng)建自定義鏈:

                      iptables [-t table] -N chain

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

                      iptables [-t table] -X chain

                  重命名自定義鏈:

                      iptables [-t table] -E old_name new_name

          五、例子

              

          1、SNAT基于原地址的轉(zhuǎn)換

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

                比如我們現(xiàn)在要將所有192.168.10.0網(wǎng)段的IP在經(jīng)過的時候全都轉(zhuǎn)換成172.16.100.1這個假設(shè)出來的外網(wǎng)地址:

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

                 

                  這樣,只要是來自本地網(wǎng)絡(luò)的試圖通過網(wǎng)卡訪問網(wǎng)絡(luò)的,都會被統(tǒng)統(tǒng)轉(zhuǎn)換成172.16.100.1這個IP.


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

                  

                  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目標(biāo)地址轉(zhuǎn)換

                 對于目標(biāo)地址轉(zhuǎn)換,數(shù)據(jù)流向是從外向內(nèi)的,外面的是客戶端,里面的是服務(wù)器端

          通過目標(biāo)地址轉(zhuǎn)換,我們可以讓外面的ip通過我們對外的外網(wǎng)ip來訪問我們服務(wù)器不同的服務(wù)器,而我們的服務(wù)卻放在內(nèi)網(wǎng)服務(wù)器的不同的服務(wù)器上。


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

          目標(biāo)地址轉(zhuǎn)換要做在到達網(wǎng)卡之前進行轉(zhuǎn)換,所以要做在PREROUTING這個位置上


          3、只允許192.168.1.3訪問服務(wù)器的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、預(yù)防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 聶鳳 閱讀(6670) 評論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 白朗县| 新野县| 竹北市| 应城市| 苍南县| 新疆| 苗栗县| 仙游县| 南江县| 宜兰市| 大同县| 临桂县| 石嘴山市| 三门县| 巴南区| 扬中市| 桃江县| 成都市| 武威市| 罗平县| 新田县| 长春市| 阿勒泰市| 康乐县| 长寿区| 日照市| 铁岭市| 陆良县| 如东县| 黔西| 察雅县| 云浮市| 高雄市| 徐州市| 东兴市| 青神县| 芜湖县| 梁山县| 大邑县| 玛纳斯县| 佛教|