從零開始認識iptables

寫在前面


   在Linux運維工作中,在涉及Linux安全時,我們第一時間想到的一般都是iptables這個工具。作爲一個linux初學者來講,在剛學習linux的過程中,有些實驗總是總不成功。這時我們總會檢查防火牆是否關閉,selinux是否關閉。在深入學習iptbales之後,這些以前知其然,不知其所以然的操作在內心就很敞亮了。想深入學習一個東西,總要問一下what is it?

本節學習目標

  • 防火牆分類

  • Netfilter防火牆工作原理

  • iptables四表五鏈

  • iptables規則設定要點

  • iptables工具使用方法(熟練使用,包括主機防火牆配置,網絡防火牆配置,以及nat配置)

什麼是防火牆?


防火牆是一種隔離工具。工作於主機或者網絡的邊緣,對於進出本主機或者本地網絡的報文根據事先定義好的規則做匹配檢測,對於能夠被規則所匹配到的報文做出相應處理(允許,拒絕,丟棄等)。根據其管理的範圍來分可以將其劃分爲主機防火牆和網絡防火牆。根據其工作機制來區分又可分爲包過濾型防火牆(netfilter)和代理服務器(Proxy)。有些人把tcp_warrpers也劃分爲防火牆的一種。這種是根據服務程序軟件的名稱來控制數據包的方法。

防火牆工作原理


包過濾防火牆Netfilterlinux內核所支持的一個功能模塊框架。Iptables是配置管理Netfilter的一個軟件工具。所以Netfilter是工作與內核空間的。Netfilter是內核中一系列的鉤子(hook),爲內核模塊在網絡協議棧中的不同位置註冊回調函數(callback)。在數據包經過網絡協議棧中的不同位置時做相應的處理。

Netfilter中的五個鉤子NF_IP_PRE_ROUTINGNF_IP_LOCAL_INNF_IP_FORWARDNF_IP_POST_ROUTINGNF_IP_LOCAL_OUT。。其中網絡數據包的流向圖如下圖所示

a970941efc5d27eb926282157dc74ee3.png-wh_

1網絡數據包從網卡進來之後進入內核空間的TCP/IP協議棧進行層層解封裝;

2 在數據包剛剛進入網絡層的數據包通過NF_IP_PRE_FORWARD,在此店之後要進行一次路由選擇,當目標地址爲本機地址時,數據進入NF_IP_LOCAL_IN,非本地的目標地址進入NF_IP_FORWARD,所以目標地址轉換通常在此點進行;

3 NF_IP_LOCAL_IN:經過路由之後送往本地的數據包經過此點,所以過濾INPUT包在此點進行。

4 NF_IP_FORWARD:經過路由選擇之後要轉發的數據包經過此點,所以網絡防火牆通常在此點配置。

5 NF_IP_LOCAL_OUT:由本地用戶空間應用進程產生的數據包過此檢測點,所以OUTPUT包過濾在此點進行。

6 NF_IP_POST_ROUTING:剛剛通過NF_IP_FORWARDNF_IP_LOCAL_OUT檢測點的數據包要通過一次路由選擇由哪個接口送往網絡中,經過路由之後的數據包要通過NF_IP_POST_ROUTING此檢測點,所以,源地址轉換通常在此點進行。

 

iptables的四表五鏈

iptables是工作在用戶空間的一個管理netfilter的工具,該工具默認有五條鏈(chain, REROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING分別由netfilter的五個鉤子函數來觸發。Iptables設有四張表,用以實現Netfilter的不同功能。

filter表:iptables中使用最廣泛的表,作用是進行包過濾,由此表來決定該數據包是否繼續向它的目標地址前進。

Nat表:又此表的名稱可以看出,該表用於網絡地址轉換用的,這也就是防火牆的另外一個功能,對源地址或者目標地址的修改。

mangle表:mangle表用於對ip報文的首部信息進行修改。

raw表:raw表的功能是爲防火牆提供一種禁用連接狀態追蹤的機制,在大流量對外業務的服務器上使用這個表可以有效的避免連接追蹤帶來的性能問題,比如遊戲服務器通常通過此表或者重新編譯內核的方式禁用防火牆的連接追蹤機制。

除此之外,在iptable的幫助文檔中提到還有一張security表,用於在數據包總加入selinux特性功能,該表很少用到,這裏不再詳述。

Iptables的四張表有着不同的處理優先級,raw-->mangle-->nat -->filter,從左至右優先級依次降低。由於數據包進入協議棧中的鉤子的位置不同以及表的優先級順序不同,所以防火牆對於數據包的處理順序特別容易混淆,這裏引用一張胥峯前輩的處理順序圖(由於該圖顯示不清晰,可到附件下載):

c39187f1a4ee4d16a8e4b12dd51ff6fd.png-wh_

 

iptables規則

想要配置一個較爲安全的防火牆策略就需要了解其規則的組成以及設置規則時所需要思考的要點。

規則組成:報文的匹配條件,匹配到之後的處理動作

匹配條件:根據協議報文特徵指定匹配條件,基本匹配條件和擴展匹配條件

處理動作:內建處理機制由iptables自身提供的一些處理動作

自定義處理機制:可自定義鏈來對匹配到的報文做處理。

注意報文不會經過自定義鏈,只能在內置鏈上通過規則進行引用後生效,也就是所自定義鏈爲規則的一個處理動作的集合。

 

設置iptables規則時需要考量的要點:

1、根據要實現哪種功能,判斷添加在那張表上;

2、根據報文流經的路徑,判斷添加在那個鏈上

       流入:PREROUTING--->INPUT

       流出:OUTPUT--->POSTROUTING

       轉發:PREROUTING---->FORWARD--->POSTROUTING

             

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

1、同類規則(訪問同一應用),匹配範圍小的放上面

2、不同類規則(訪問不同應用),匹配到報文頻率大的放上面:

3、將那些可由一條規則描述的多個規則合併爲一個

4、設置默認策略


遠程連接主機配置防火牆時注意要點:

1,不要把鏈的默認策略修改爲拒絕。因爲有可能配置失敗或者清除所有策略後無法遠程到服務器。儘量使用規則條目配置默認策略

2,爲防止配置失誤策略把自己也拒掉,可在配置策略時設置計劃任務定時清除策略。當確定無誤後,關閉該計劃任務。


磨刀不誤砍柴工,當以上的東西在腦海中已經有一個框架之後,再學習iptables規則管理工具纔會得心應手。

iptables工具使用方法

Man文檔是學習工具的最好方法。這裏不再詳述,下面把我的學習筆記粘貼出來,以供讀者參考如有錯誤敬請指正。

    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   默認爲filter

          

       鏈管理:

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

           -Nnew,創建新的自定義規則鏈:

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

           -Zzero,清零,置零規則計數器

           -Ppolicy,爲指定鏈設置默認策略,對filter表中的鏈而言,默認策略通常有ACCEPTDROPREJECT

           -ErEname,重命名自定義鏈,引用計數不爲0的自定義鏈,無法改名,也無法刪除

       規則管理:

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

           -Iinsert,將新規則插入至指定鏈的指定位置(需指定序號,默認爲第一條):

           -Ddelete,刪除指定鏈上的指定規則:

              兩種指定方式:

                  1、指定匹配條件

                  2、指定規則編號

           -Rreplace,替換指定鏈上的指定規則。

          

       查看:

           -Llist,列出指定鏈上的所有規則。

              -n:numberic ,以數字格式顯示地址和端口號

              -v:verbose,顯示詳細信息

                  -vv,-vvv

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

              -xexectly,顯示計數器計數結果的精確值。

      

       匹配條件:

           基本匹配:

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

              [!] -d--dst,--destination  IP|Netaddr:檢查報文中的目標ip地址是否符合此處指定的地址範圍

              -p  ,--protocal{tcp|udp|icmp}:檢查報文中的協議,即ip首部中的protocol所標識的協議,8bit6標識tcp.17表示udp

              -i,--in-inteface IFACE :數據報文的流入接口。僅能用於PREROUTINGINPUTFORWARD

              -o,--out-inteface :數據報文的流出接口。僅能用於FORWARDOUTPUTPOSTROUTING鏈上

             

           擴展匹配:-m macth_name  --spec_options

                  eq -m tcp --dport 22  表示使用tcp擴展的目標端口爲22

              隱式擴展:對-p protocal 指明的協議進行擴展,可省略-m選項:

                  -p tcp 

                     --dport PORT[-PORT]:目標端口,可以是單個端口或者連續多個端口

                     --sport PORT[-PORT]

                     --tcp-flags list1  list2  :檢查list1所指明的所有標誌位,且這其中,list2所表示出的所有標記必須爲1,而餘下的必須爲0,沒有list1中指明的,不做檢查。

                         SYNACKFINRSTPSHURG

                         eq:--tcp-flags SYNACKFINRST  SYN

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

                  -p udp

                     --dport

                     --sport

                  -p icmp

                     --icmp-type

                     可用數字表示其類型:

                         0 echo-reply

                         8 echo-request

                        

                 

              顯示擴展:

          

       目標:

           -j target:jump至指定的target

           ACCEPT:接收

           DROP:丟棄

           REJECT;拒絕

           RETURN:返回調用鏈

           REDIRECT:端口重定向

           LOG:記錄日誌

           MARK:做防火牆標記

           DNAT:目標地址轉換

           SNAT:源地址轉換

           MASQUERADE:地址僞裝

           ...

           自定義鏈:由自定義鏈上的規則進行匹配檢查。

          

             

      

      

      

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

       centos6 man iptables

       centos7   man iptbales-extensions

      

      

    1multiport擴展

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

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

       [!] --destination-ports,--dports  port[,port|,port:port]... 指明多個離散的目標端口

       [!] --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

      

    2iprange擴展

       指明連續的(但一般不能擴展爲整個網絡)ip地址範圍

      

       [!] --src-range from[-to]  匹配指明連續的源IP地址範圍

       [!] --dst-range from[-to]  指明連續的目標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

      

    3string擴展

       檢查報文中出現的字符串:

      

       --algo {bm|kmp}

      

       [!] --string pattern

       [!] --hex-string pattern 16進制

      

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

      

    4time擴展

       根據報文到達的時間與指定的時間範圍進行匹配

       --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時間

      

      

    5connlimit擴展

       根據每客戶端ip(也可以是地址塊)做併發連接數數量匹配:

      

       --connlimit-above n 連接數量大於n

       --connlimit-upto n  連接數量小於等於n

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

       # ssh連接大於3後鏈接被拒絕

    6limit擴展

       基於收發報文速率做檢查:      

       令牌桶過濾器:

      

       --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

      

       ##跳過5個包,然後沒10秒鐘一個迴應一個ping

      

    7state擴展

       檢查連接追蹤機制檢查連接的狀態:

      

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

          /proc/sys/net/nf_conntrack_max

       已經追蹤到並記錄下的連接:

          /proc/net/nf_conntrack

          

       不同協議或者連接類型追蹤的時長

           /proc/sys/net/netfilter/

          

          

       可追蹤的連接狀態:

           NEW:新發出的請求:連接追蹤模板中不存在此連接相關的信息條目,因此,將其識別爲第一次發出的請求

           ESTABLISHEDNEW狀態之後,連接追蹤模板中爲其建立的條目失效之前期間內所進行的通信的狀態。

           RELATED:相關的連接:如ftp協議中的命令連接與數據連接之間的關係

           INVALIED:無法識別的連接

          

       --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

          

       # 對新發起的httpssh訪問請求做控制,

           # 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 

          

       如何開放被動模式的FTP服務?  

      

           (1) 裝載ftp追蹤時專用的模塊

              #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) 放行請求報文:

              命令連接:NEWESTABLISHED

              數據連接: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) 放行響應報文

              ESTABLISHED

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

             

      

      

      

      

    如何保存及重載規則:

       保存規則至指定文件:

           iptables-save >  /path/to/somefile

      

       從指定文件重載規則:

           iptables-restore <  /path/from/somefile

          

       centos6:

           service iptables save

              iptable-save  >/etc/sysconfig/iptables

           service iptables restart

              iptables-restore <  /etc/sysconfig/iptables

網絡防火牆

       核心轉發配置:/proc/sys/net/ipv4/ip_forward  

                  /etc/sysctl.conf

                  net.ipv4.ip_forward=1

nat:

    SNAT:只修改請求報文的源地址

    DNAT:只修改請求報文的目標地址

   

    nat表:

       PREROUTING: DNAT

       OUTPUT

       POSTROUTING: SNAT

      

    源地址轉換

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

    iptables -t nat -A POSTROUTING -s  local_net ! -d local_net -j MASQUERADE 公網ip不固定

   

    目標地址轉換 iptables -t nat -A  POSTROUTING -d public_ip -p tcp|udp --dport PORT -j DNAT  --to-destination local_ip:port

 


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