溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

從零開(kāi)始認(rèn)識(shí)iptables

發(fā)布時(shí)間:2020-06-25 18:57:57 來(lái)源:網(wǎng)絡(luò) 閱讀:633 作者:志_恒 欄目:安全技術(shù)

寫(xiě)在前面


   在Linux運(yùn)維工作中,在涉及Linux安全時(shí),我們第一時(shí)間想到的一般都是iptables這個(gè)工具。作為一個(gè)linux初學(xué)者來(lái)講,在剛學(xué)習(xí)linux的過(guò)程中,有些實(shí)驗(yàn)總是總不成功。這時(shí)我們總會(huì)檢查防火墻是否關(guān)閉,selinux是否關(guān)閉。在深入學(xué)習(xí)iptbales之后,這些以前知其然,不知其所以然的操作在內(nèi)心就很敞亮了。想深入學(xué)習(xí)一個(gè)東西,總要問(wèn)一下what is it?

本節(jié)學(xué)習(xí)目標(biāo)

  • 防火墻分類(lèi)

  • Netfilter防火墻工作原理

  • iptables四表五鏈

  • iptables規(guī)則設(shè)定要點(diǎn)

  • iptables工具使用方法(熟練使用,包括主機(jī)防火墻配置,網(wǎng)絡(luò)防火墻配置,以及nat配置)

什么是防火墻?


防火墻是一種隔離工具。工作于主機(jī)或者網(wǎng)絡(luò)的邊緣,對(duì)于進(jìn)出本主機(jī)或者本地網(wǎng)絡(luò)的報(bào)文根據(jù)事先定義好的規(guī)則做匹配檢測(cè),對(duì)于能夠被規(guī)則所匹配到的報(bào)文做出相應(yīng)處理(允許,拒絕,丟棄等)。根據(jù)其管理的范圍來(lái)分可以將其劃分為主機(jī)防火墻和網(wǎng)絡(luò)防火墻。根據(jù)其工作機(jī)制來(lái)區(qū)分又可分為包過(guò)濾型防火墻(netfilter)和代理服務(wù)器Proxy)。有些人把tcp_warrpers也劃分為防火墻的一種。這種是根據(jù)服務(wù)程序軟件的名稱(chēng)來(lái)控制數(shù)據(jù)包的方法。

防火墻工作原理


包過(guò)濾防火墻Netfilterlinux內(nèi)核所支持的一個(gè)功能模塊框架。Iptables是配置管理Netfilter的一個(gè)軟件工具。所以Netfilter是工作與內(nèi)核空間的。Netfilter是內(nèi)核中一系列的鉤子(hook),為內(nèi)核模塊在網(wǎng)絡(luò)協(xié)議棧中的不同位置注冊(cè)回調(diào)函數(shù)(callback)。在數(shù)據(jù)包經(jīng)過(guò)網(wǎng)絡(luò)協(xié)議棧中的不同位置時(shí)做相應(yīng)的處理。

Netfilter中的五個(gè)鉤子NF_IP_PRE_ROUTINGNF_IP_LOCAL_IN,NF_IP_FORWARD,NF_IP_POST_ROUTINGNF_IP_LOCAL_OUT。。其中網(wǎng)絡(luò)數(shù)據(jù)包的流向圖如下圖所示

從零開(kāi)始認(rèn)識(shí)iptables

1網(wǎng)絡(luò)數(shù)據(jù)包從網(wǎng)卡進(jìn)來(lái)之后進(jìn)入內(nèi)核空間的TCP/IP協(xié)議棧進(jìn)行層層解封裝;

2 在數(shù)據(jù)包剛剛進(jìn)入網(wǎng)絡(luò)層的數(shù)據(jù)包通過(guò)NF_IP_PRE_FORWARD,在此店之后要進(jìn)行一次路由選擇,當(dāng)目標(biāo)地址為本機(jī)地址時(shí),數(shù)據(jù)進(jìn)入NF_IP_LOCAL_IN,非本地的目標(biāo)地址進(jìn)入NF_IP_FORWARD,所以目標(biāo)地址轉(zhuǎn)換通常在此點(diǎn)進(jìn)行;

3 NF_IP_LOCAL_IN:經(jīng)過(guò)路由之后送往本地的數(shù)據(jù)包經(jīng)過(guò)此點(diǎn),所以過(guò)濾INPUT包在此點(diǎn)進(jìn)行。

4 NF_IP_FORWARD:經(jīng)過(guò)路由選擇之后要轉(zhuǎn)發(fā)的數(shù)據(jù)包經(jīng)過(guò)此點(diǎn),所以網(wǎng)絡(luò)防火墻通常在此點(diǎn)配置。

5 NF_IP_LOCAL_OUT:由本地用戶空間應(yīng)用進(jìn)程產(chǎn)生的數(shù)據(jù)包過(guò)此檢測(cè)點(diǎn),所以OUTPUT包過(guò)濾在此點(diǎn)進(jìn)行。

6 NF_IP_POST_ROUTING:剛剛通過(guò)NF_IP_FORWARDNF_IP_LOCAL_OUT檢測(cè)點(diǎn)的數(shù)據(jù)包要通過(guò)一次路由選擇由哪個(gè)接口送往網(wǎng)絡(luò)中,經(jīng)過(guò)路由之后的數(shù)據(jù)包要通過(guò)NF_IP_POST_ROUTING此檢測(cè)點(diǎn),所以,源地址轉(zhuǎn)換通常在此點(diǎn)進(jìn)行。

 

iptables的四表五鏈

iptables是工作在用戶空間的一個(gè)管理netfilter的工具,該工具默認(rèn)有五條鏈(chain, REROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING分別由netfilter的五個(gè)鉤子函數(shù)來(lái)觸發(fā)。Iptables設(shè)有四張表,用以實(shí)現(xiàn)Netfilter的不同功能。

filter表:iptables中使用最廣泛的表,作用是進(jìn)行包過(guò)濾,由此表來(lái)決定該數(shù)據(jù)包是否繼續(xù)向它的目標(biāo)地址前進(jìn)。

Nat表:又此表的名稱(chēng)可以看出,該表用于網(wǎng)絡(luò)地址轉(zhuǎn)換用的,這也就是防火墻的另外一個(gè)功能,對(duì)源地址或者目標(biāo)地址的修改。

mangle表:mangle表用于對(duì)ip報(bào)文的首部信息進(jìn)行修改。

raw表:raw表的功能是為防火墻提供一種禁用連接狀態(tài)追蹤的機(jī)制,在大流量對(duì)外業(yè)務(wù)的服務(wù)器上使用這個(gè)表可以有效的避免連接追蹤帶來(lái)的性能問(wèn)題,比如游戲服務(wù)器通常通過(guò)此表或者重新編譯內(nèi)核的方式禁用防火墻的連接追蹤機(jī)制。

除此之外,在iptable的幫助文檔中提到還有一張security表,用于在數(shù)據(jù)包總加入selinux特×××,該表很少用到,這里不再詳述。

Iptables的四張表有著不同的處理優(yōu)先級(jí),raw-->mangle-->nat -->filter,從左至右優(yōu)先級(jí)依次降低。由于數(shù)據(jù)包進(jìn)入?yún)f(xié)議棧中的鉤子的位置不同以及表的優(yōu)先級(jí)順序不同,所以防火墻對(duì)于數(shù)據(jù)包的處理順序特別容易混淆,這里引用一張胥峰前輩的處理順序圖(由于該圖顯示不清晰,可到附件下載):

從零開(kāi)始認(rèn)識(shí)iptables

 

iptables規(guī)則

想要配置一個(gè)較為安全的防火墻策略就需要了解其規(guī)則的組成以及設(shè)置規(guī)則時(shí)所需要思考的要點(diǎn)。

規(guī)則組成:報(bào)文的匹配條件,匹配到之后的處理動(dòng)作

匹配條件:根據(jù)協(xié)議報(bào)文特征指定匹配條件,基本匹配條件和擴(kuò)展匹配條件

處理動(dòng)作:內(nèi)建處理機(jī)制由iptables自身提供的一些處理動(dòng)作

自定義處理機(jī)制:可自定義鏈來(lái)對(duì)匹配到的報(bào)文做處理。

注意報(bào)文不會(huì)經(jīng)過(guò)自定義鏈,只能在內(nèi)置鏈上通過(guò)規(guī)則進(jìn)行引用后生效,也就是所自定義鏈為規(guī)則的一個(gè)處理動(dòng)作的集合。

 

設(shè)置iptables規(guī)則時(shí)需要考量的要點(diǎn):

1、根據(jù)要實(shí)現(xiàn)哪種功能,判斷添加在那張表上;

2、根據(jù)報(bào)文流經(jīng)的路徑,判斷添加在那個(gè)鏈上

       流入:PREROUTING--->INPUT

       流出:OUTPUT--->POSTROUTING

       轉(zhuǎn)發(fā):PREROUTING---->FORWARD--->POSTROUTING

             

鏈上其規(guī)則的次序,即為檢查的次序,排列好檢查次序能有效的提高性能,因此隱含一定的法則

1、同類(lèi)規(guī)則(訪問(wèn)同一應(yīng)用),匹配范圍小的放上面

2、不同類(lèi)規(guī)則(訪問(wèn)不同應(yīng)用),匹配到報(bào)文頻率大的放上面:

3、將那些可由一條規(guī)則描述的多個(gè)規(guī)則合并為一個(gè)

4、設(shè)置默認(rèn)策略


遠(yuǎn)程連接主機(jī)配置防火墻時(shí)注意要點(diǎn):

1,不要把鏈的默認(rèn)策略修改為拒絕。因?yàn)橛锌赡芘渲檬』蛘咔宄胁呗院鬅o(wú)法遠(yuǎn)程到服務(wù)器。盡量使用規(guī)則條目配置默認(rèn)策略

2,為防止配置失誤策略把自己也拒掉,可在配置策略時(shí)設(shè)置計(jì)劃任務(wù)定時(shí)清除策略。當(dāng)確定無(wú)誤后,關(guān)閉該計(jì)劃任務(wù)。


磨刀不誤砍柴工,當(dāng)以上的東西在腦海中已經(jīng)有一個(gè)框架之后,再學(xué)習(xí)iptables規(guī)則管理工具才會(huì)得心應(yīng)手。

iptables工具使用方法

Man文檔是學(xué)習(xí)工具的最好方法。這里不再詳述,下面把我的學(xué)習(xí)筆記粘貼出來(lái),以供讀者參考如有錯(cuò)誤敬請(qǐng)指正。

    iptables命令:

        iptables [-t table] {-A|-C|-D} chain rule-specification

       ip6tables [-t table] {-A|-C|-D} chain  rule-specification

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

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

       iptables [-t table] -D chain rulenum

       iptables [-t table] -S [chain  [rulenum]]

       iptables [-t table] {-F|-L|-Z} [chain  [rulenum]] [options...]

       iptables [-t table] -N chain

       iptables [-t table] -X [chain]

       iptables [-t table] -P chain target

       iptables [-t table] -E old-chain-name  new-chain-name

      

       iptables [-t table] SUBCOMMAND CHAIN  CRETERIA -j TARGET

      

      

      

       -t table:

           filter ,nat,mangle,raw   默認(rèn)為filter

          

       鏈管理:

           -F flush,清空規(guī)則鏈:省略鏈表示清空指定表上的所有的鏈

           -Nnew,創(chuàng)建新的自定義規(guī)則鏈:

           -Xdrop,刪除用戶自定義的空的規(guī)則鏈:

           -Zzero,清零,置零規(guī)則計(jì)數(shù)器

           -Ppolicy,為指定鏈設(shè)置默認(rèn)策略,對(duì)filter表中的鏈而言,默認(rèn)策略通常有ACCEPTDROP,REJECT

           -ErEname,重命名自定義鏈,引用計(jì)數(shù)不為0的自定義鏈,無(wú)法改名,也無(wú)法刪除

       規(guī)則管理:

           -Aappend,將新的規(guī)則追加與指定鏈的尾部

           -Iinsert,將新規(guī)則插入至指定鏈的指定位置(需指定序號(hào),默認(rèn)為第一條):

           -Ddelete,刪除指定鏈上的指定規(guī)則:

              兩種指定方式:

                  1、指定匹配條件

                  2、指定規(guī)則編號(hào)

           -Rreplace,替換指定鏈上的指定規(guī)則。

          

       查看:

           -Llist,列出指定鏈上的所有規(guī)則。

              -n:numberic ,以數(shù)字格式顯示地址和端口號(hào)

              -v:verbose,顯示詳細(xì)信息

                  -vv,-vvv

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

              -xexectly,顯示計(jì)數(shù)器計(jì)數(shù)結(jié)果的精確值。

      

       匹配條件:

           基本匹配:

              [!] -s, --src,--source  IP|Netaddr:檢查報(bào)文中的源ip地址是否符合此處指定的地址范圍

              [!] -d,--dst,--destination  IP|Netaddr:檢查報(bào)文中的目標(biāo)ip地址是否符合此處指定的地址范圍

              -p  ,--protocal{tcp|udp|icmp}:檢查報(bào)文中的協(xié)議,即ip首部中的protocol所標(biāo)識(shí)的協(xié)議,8bit,6標(biāo)識(shí)tcp.17表示udp

              -i,--in-inteface IFACE :數(shù)據(jù)報(bào)文的流入接口。僅能用于PREROUTINGINPUT,FORWARD

              -o,--out-inteface :數(shù)據(jù)報(bào)文的流出接口。僅能用于FORWARD,OUTPUTPOSTROUTING鏈上

             

           擴(kuò)展匹配:-m macth_name  --spec_options

                  eq -m tcp --dport 22  表示使用tcp擴(kuò)展的目標(biāo)端口為22

              隱式擴(kuò)展:對(duì)-p protocal 指明的協(xié)議進(jìn)行擴(kuò)展,可省略-m選項(xiàng):

                  -p tcp 

                     --dport PORT[-PORT]:目標(biāo)端口,可以是單個(gè)端口或者連續(xù)多個(gè)端口

                     --sport PORT[-PORT]

                     --tcp-flags list1  list2  :檢查list1所指明的所有標(biāo)志位,且這其中,list2所表示出的所有標(biāo)記必須為1,而余下的必須為0,沒(méi)有list1中指明的,不做檢查。

                         SYNACK,FINRST,PSH,URG,

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

                            =====   --syn: 檢查三次握手的第一次握手                

                  -p udp

                     --dport

                     --sport

                  -p icmp

                     --icmp-type

                     可用數(shù)字表示其類(lèi)型:

                         0 echo-reply

                         8 echo-request

                        

                 

              顯示擴(kuò)展:

          

       目標(biāo):

           -j target:jump至指定的target

           ACCEPT:接收

           DROP:丟棄

           REJECT;拒絕

           RETURN:返回調(diào)用鏈

           REDIRECT:端口重定向

           LOG:記錄日志

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

           DNAT:目標(biāo)地址轉(zhuǎn)換

           SNAT:源地址轉(zhuǎn)換

           MASQUERADE:地址偽裝

           ...

           自定義鏈:由自定義鏈上的規(guī)則進(jìn)行匹配檢查。

          

             

      

      

      

    顯示擴(kuò)展:必須顯示指明使用的擴(kuò)展模塊(rpm -ql  iptables|grep "\.so"   

       centos6 man iptables

       centos7   man iptbales-extensions

      

      

    1、multiport擴(kuò)展

       以離散方式定義多端口匹配:最多匹配15個(gè)端口

       [!] --source-ports,--sports  port[,port|,port:port]...  指明多個(gè)源端口

       [!] --destination-ports,--dports  port[,port|,port:port]... 指明多個(gè)離散的目標(biāo)端口

       [!] --ports port[,port|,port:port]...

      

       例子:  # iptables -A INPUT -p tcp -m multiport  --dports 22,80 -j ACCEPT

              # iptables -A OUTPUT -p tcp -m  multiport --sports 22,80 -j ACCEPT

      

    2、iprange擴(kuò)展

       指明連續(xù)的(但一般不能擴(kuò)展為整個(gè)網(wǎng)絡(luò))ip地址范圍

      

       [!] --src-range from[-to]  匹配指明連續(xù)的源IP地址范圍

       [!] --dst-range from[-to]  指明連續(xù)的目標(biāo)IP地址范圍

      

       # iptables -A INPUT -m iprange  --src-range 172.18.11.0-172.18.11.100 -j DROP

       # iptables -A INPUT -p tcp -m multiport  --dports 22,80 -m iprange --src-range 172.18.11.0-172.18.11.100 -j DROP

      

    3、string擴(kuò)展

       檢查報(bào)文中出現(xiàn)的字符串:

      

       --algo {bm|kmp}

      

       [!] --string pattern

       [!] --hex-string pattern 16進(jìn)制

      

       iptables -I OUTPUT -m string --algo bm  --string "movle" -j DROP

      

    4、time擴(kuò)展

       根據(jù)報(bào)文到達(dá)的時(shí)間與指定的時(shí)間范圍進(jìn)行匹配

       --datestart

       --datestop

      

       --timestart

       --timestop

      

       --monthdays

       --weekdays   

       # iptables -I INPUT -d 172.18.11.7 -p  tcp --dport 80 -m time --timestart 8:00 --timestop 10:00 -j DROP

      

       # 注意 centos7 使用的是UTC時(shí)間

      

      

    5、connlimit擴(kuò)展

       根據(jù)每客戶端ip(也可以是地址塊)做并發(fā)連接數(shù)數(shù)量匹配:

      

       --connlimit-above n 連接數(shù)量大于n

       --connlimit-upto n  連接數(shù)量小于等于n

       # iptables -I INPUT -p tcp --dport 22  -m connlimit --connlimit-above 3 -j REJECT

       # ssh連接大于3后鏈接被拒絕

    6、limit擴(kuò)展

       基于收發(fā)報(bào)文速率做檢查:      

       令牌桶過(guò)濾器:

      

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

       --limit-burst number

       # iptables -A INPUT -p icmp --icmp-type  8 -m limit --limit-burst 5 --limit 6/minute -j ACCEPT

       # iptables -A INPUT -p icmp -j REJECT

      

       ##跳過(guò)5個(gè)包,然后沒(méi)10秒鐘一個(gè)回應(yīng)一個(gè)ping

      

    7、state擴(kuò)展

       檢查連接追蹤機(jī)制檢查連接的狀態(tài):

      

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

          /proc/sys/net/nf_conntrack_max

       已經(jīng)追蹤到并記錄下的連接:

          /proc/net/nf_conntrack

          

       不同協(xié)議或者連接類(lèi)型追蹤的時(shí)長(zhǎng)

           /proc/sys/net/netfilter/

          

          

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

           NEW:新發(fā)出的請(qǐng)求:連接追蹤模板中不存在此連接相關(guān)的信息條目,因此,將其識(shí)別為第一次發(fā)出的請(qǐng)求

           ESTABLISHEDNEW狀態(tài)之后,連接追蹤模板中為其建立的條目失效之前期間內(nèi)所進(jìn)行的通信的狀態(tài)。

           RELATED:相關(guān)的連接:如ftp協(xié)議中的命令連接與數(shù)據(jù)連接之間的關(guān)系

           INVALIED:無(wú)法識(shí)別的連接

          

       --state   state1 state2...  

       例子: 

           # iptables -I INPUT -d 172.18.11.7  -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

           # iptables -I OUTPUT -s 172.18.11.7  -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

          

       # 對(duì)新發(fā)起的httpssh訪問(wèn)請(qǐng)求做控制,

           # iptables -A INPUT -d 172.16.100.10  -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT

           # iptables -A OUTPUT -s  172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED  -j ACCEPT 

          

       如何開(kāi)放被動(dòng)模式的FTP服務(wù)?  

      

           (1) 裝載ftp追蹤時(shí)專(zhuān)用的模塊

              #modprobe nf_conntrack_ftp

             

              路徑    /lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilternf_conntrack_ftp.ko

                模塊信息  modinfo nf_conntrack_ftp.ko

           (2) 放行請(qǐng)求報(bào)文:

              命令連接:NEWESTABLISHED

              數(shù)據(jù)連接:RELATED,ESTABLISHED

             

              #iptables -A INPUT -d localIP -p  tcp -dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

              # iptables -A INPUT -d localIP  -p tcp  -m state --state  RELATED,ESTABLISHED -j ACCEPT

           (3) 放行響應(yīng)報(bào)文

              ESTABLISHED

              #iptables -A OUTPUT -d localIP  -p tcp -m state --state ESTABLISHED -j ACCEPT

             

      

      

      

      

    如何保存及重載規(guī)則:

       保存規(guī)則至指定文件:

           iptables-save >  /path/to/somefile

      

       從指定文件重載規(guī)則:

           iptables-restore <  /path/from/somefile

          

       centos6:

           service iptables save

              iptable-save  >/etc/sysconfig/iptables

           service iptables restart

              iptables-restore <  /etc/sysconfig/iptables

網(wǎng)絡(luò)防火墻

       核心轉(zhuǎn)發(fā)配置:/proc/sys/net/ipv4/ip_forward  

                  /etc/sysctl.conf

                  net.ipv4.ip_forward=1

nat:

    SNAT:只修改請(qǐng)求報(bào)文的源地址

    DNAT:只修改請(qǐng)求報(bào)文的目標(biāo)地址

   

    nat表:

       PREROUTING: DNAT

       OUTPUT

       POSTROUTING: SNAT

      

    源地址轉(zhuǎn)換

    iptables -t nat -A POSTROUTING -s  local_net ! -d local_net -j SNAT --to-source public_ip   公網(wǎng)ip固定

    iptables -t nat -A POSTROUTING -s  local_net ! -d local_net -j MASQUERADE 公網(wǎng)ip不固定

   

    目標(biāo)地址轉(zhuǎn)換 iptables -t nat -A  POSTROUTING -d public_ip -p tcp|udp --dport PORT -j DNAT  --to-destination local_ip:port

 


附件:http://down.51cto.com/data/2368698
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI