Linux中iptables基礎命令

防火牆(Firewalld)是一種隔離工具,防範與非授權的訪問,使主機更安全。它主要工作與網絡或主機的邊緣,對於進出本網絡或主機的通信報文根據事先定義好的規則進行匹配檢測;對於能夠被規則所匹配到的報文做出相應的處理。

    防火牆的分類:

    主機防火牆:工作範圍是單個主機

    網絡防火牆:工作範圍是整個網絡;網絡防火牆中還可以包含主機防火牆

    防火牆的實現方式:

      硬件防火牆:NetScreen、CheckPoint

      軟件防火牆:iptables


本文所介紹的iptables就是Linux的軟防火前的實現。

 iptables最主要的特點就是4表5鏈,以及每種不同的表所對應不同的鏈;  

    5鏈:prerouting、input、output、forward、postrouting

    4表:filter、mangle、nat、raw

      filter:主要功能是過濾;對應的鏈爲:input、output、forward

      mangle:主要功能是拆解報文、做出修改、重新封裝;對應的鏈爲:prerouting、input、output、forward、postrouting

      nat:主要功能是網絡地址轉換;對應的鏈爲:prerouting、postrouting、output

      raw:在限定的時間範圍內,關閉在nat表上的啓用的連接追蹤機制;對應的鏈爲:output、prerouting

    同一鏈上的不同表的應用優先級:raw、mangle、nat、filter


報文在主機內的流向示意圖:

                

wKiom1coYOmxbp51AAAvrAMGLCE317.png

報文流向有兩種:

    流入本機的報文:報文流入-->prerouting-->input-->output-->postrouting-->報文流出

    由本機轉發報文:報文流入-->prerouting-->forward-->postrouting-->postrouting

    注意:報文是由本機處理,但是是否轉發是由路由來決定的;在報文流入本機之後,路由1會判斷報文的目標地址是否爲本機,如果是,則流入input;如果不是,則流入forwrad,在報文離開本機之前路由2會判斷報文經由那個接口送往下一個網關(下一跳),同時在轉發之前,要確保轉發功能是開啓的;1表示開啓,0表示關閉:

            

[root@wtc ~]#vim  /etc/sysctl.conf
[root@wtc ~]#net.ipv4.ip_forward = 0  ## 把0更改爲1即爲開啓
[root@wtc ~]#/sbin/sysctl -p      ##修改之後立即生效

               

  iptables的規則:根據規則匹配條件嘗試匹配檢查報文,對成功匹配的報文做出相應的處理

       組成部分:匹配條件、處理動作

        匹配條件:基本匹配、擴展匹配

        處理動作:基本處理動作、擴展處理動作、自定義處理動作

        注意:添加規則時的考量點;

        (1)要實現什麼樣的功能;判斷添加至那個表上

        (2)報文流經的位置;判斷添加至那個鏈上

        (3)同類的規則,匹配範圍小的放在前面,用於特殊處理

        (4)不同類的規則,匹配範圍大的放在前面

        (5)將那些可由一條規則描述的多個規則合併爲一個

        (6)設置默認策略


  iptables的相關命令:   

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

    

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


    rule-specification = [matches...] [ -j target]


 實現對鏈管理:管理一整條鏈

      -N:新增一條自定義鏈

      -X:刪除一條自定義鏈(刪除時要確保鏈下沒有規則)

      -P:設置鏈的默認策略

      -E:重命名於未被引用的自定義鏈(引用計數爲0,即references爲0)

        

實現對規則管理:管理鏈上的某條規則     

     -A:追加一個規則;默認爲末尾

     -I:插入一個規則;默認爲最開始處

     -D:刪除某條規則

     -R:指明修改第幾條規則

     -F:清空所有的規則

                    

查看某表上的規則:

     -L:列出規則

     -n:以數字格式顯示地址個端口

     -v:顯示詳細信息

     --line-numbers:顯示鏈上的規則和編號

     -x:顯示計數器的精確值


匹配條件:

    基本匹配:netfilter自帶的匹配機制                   

      [!] -s, --source address[/mask][,...]:原地址匹配(!s是取反)

      [!] -d, --destination address[/mask][,...]:目標地址匹配

      [!] -i, --in-interface name:限制報文流入的接口(只能用於prerouting、input、forward這三個鏈)

      [!] -o, --out-interface name:限制報文流出的接口(只能用於output、forward、postrouting這三個鏈)

      [!] -p{tcp|udp|icmp}:限制協議;指明用哪一種協議

[root@wtc ~]#iptables  -A   INPUT  -s  172.18.0.0/18  -d 172.18.42.200  -p  tcp  -j  ACCEPT
[root@wtc ~]#iptables  -A   OUTPUT -s  172.18.42.200  -d 172.18.0.0/16  -p  tcp  -j  ACCEPT


  擴展匹配:經由擴展模塊引入的匹配機制;-m  matchname

      隱式擴展:無需指明,可以不適用-m選項專門加載響應模塊;前提要使用-p選項可匹配何種協議

      顯示擴展:需要指明,必須由-m選項專門加載響應模塊


      隱式擴展:                        

         tcp:隱含指明瞭“-m  tcp",有專用選項:

          [!]  --source-port,--sport  port[:port]:匹配報文中的tcp首部的源端口;可以是端口範圍

          [!] --destination-port,--dport  port [:port]:匹配報文中的tcp首部的目標端口;可以是端口範圍

          [!] --tcp-flags  mask comp:檢查報文中mask指明的tcp標誌位,而要這些標誌位comp必須爲1

            例如:--tcp-flags  syn,fin,ack,rst   syn

                  此時: syn必須爲1

          [!] --syn:

            --syn相當於"--tcp-flags  syn,fin,ack,syn“,tcp中的第一次握手

[root@wtc ~]# iptables -A INPUT -s 0/0 -d 10.0.1.2 -p tcp --dport 80 --tcp-flags SYN,ACK,FIN,RST SYN  -j ACCEPT
[root@wtc ~]# iptables -A INPUT -d 0/0 -s 10.0.1.2 -p tcp --sport 80 -j ACCEPT


        udp:                    

           [!]  --source-port,--sport  port[:port]:匹配報文中的tcp首部的源端口;可以是端口範圍

           [!] --destination-port,--dport  port [:port]:匹配報文中的tcp首部的目標端口;可以是端口範圍

        
        icmp:隱含指明瞭“-m icmp”,有專用選項

               [!] --icmp-type  {type[/code][typename]

             type/code:

             0/0:表示響應

             0/8:表示請求

[root@wtc ~]#iptables  -A INPUT  -s 0/0 -d 172.18.42.200 -p icmp --icmp-type 8 -j ACCEPT
[root@wtc ~]#iptables  -A OUTPUT -s 172.18.42.200 -d 0/0 -p icmp --icmp-type 0 -j ACCEPT

     顯示擴展:                       

    (1)multiport擴展:以離散方式定義多端口匹配;最多指定15個端口; 

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

        [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;

        [!] --ports port[,port|,port:port]...:同時匹配多個端口(指明多個端口;)

[root@wtc ~]#iptables  -A INPUT  -s 0/0 -d 172.18.42.200 -p tcp -m multiport --dports 80,22 -j ACCEPT
[root@wtc ~]#iptables  -A OUTPUT -s 172.18.42.200 -d 0/0 -p tcp -m multiport --sports 80,22 -A ACCEPT

                

    (2)iprange擴展:指明一段連續的ip地址範圍作爲源地址或目標地址匹配 

        [!] --src-range from[-to]:源IP地址;

        [!] --dst-range from[-to]:目標IP地址;

[root@wtc ~]#iptables -A INPUT  -d 172.18.42.200 -p tcp -dport 80 -m iprange --src-range 172.18.42.1-172.18.42.100 -j ACCEPT
[root@wtc ~]#iptables -A OUTPUT -s 172.18.42.200 -p tcp -sport 80 -m iprange --dst-range 172.18.42.1-172.18.42.100 -j ACCEPT


    (3)string擴展:對報文中的應用層數據做字符串模式匹配檢測;

        --algo {bm|kmp}:字符串匹配檢測算法;

        bm:Boyer-Moore

        kmp:Knuth-Pratt-Morris

        [!] --string pattern:要檢測的字符串模式;

        [!] --hex-string pattern:要檢測的字符串模式(16進制格式);

[root@wtc ~]#iptables -I OUTPUT -s 172.18.42.200 -d 0/0 -p tcp -sport 80 -m string --algo bm --string "wtc" -j A DROP

        注意:要求越嚴格的越要放在前面;之所以使用“OUTPUT”是因爲在接受了報文之後才能夠響應輸出;如果直接是“INPUT”使用“DROP”,則報文會被直接拒絕,根本不會流入本機內部

                    

                

    (4)time擴展:根據將報文到達的時間與指定的時間範圍進行匹配;

        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間

        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結束日期時間

        --timestart hh:mm[:ss]:起始時間

        --timestop hh:mm[:ss]:結束時間

        [!]--monthdays day[,day...]:匹配1-12月中的某些天

        [!]--weekdays day[,day...]:匹配一個週中的某些天

        --kerneltz:使用內核上的時區,而非默認的UTC;

[root@wtc ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p tcp -dport 80 -m time --timestart 08:30:00 --timestop 18:00:00 --weekdays 1,2,3,4,5 -j ACCEPT


     

    (5)connlimit擴展:根據每客戶端IP做併發連接數數量匹配;即每客戶端最大可同時發起的連接數量

        --connlimit-upto n:連接的數量小於等於n時則匹配;

        --connlimit-above n:連接的數量大於n時匹配

[root@wtc ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p tcp -dport 80 -m connlimit --connlimit-upto 20 -j ACCEPT


    (6)limit擴展:基於收發報文的速率做匹配;

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

        --limit-burst number 

[root@wtc ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p tcp -dport 80 -m limit --limit 20/second --limit-burst 5 -j ACCEPT


        

      (7)state擴展(conntrack的子集):用於對報文的根據”連接追蹤機制“去檢查連接的狀態(但是對服務的連接數量會有很大的影響)

        連接模板:佔用內存空間中的一段空間(內核空間)

        [!] --state state 

        conntrack機制:追蹤本機上的請求和響應之間的關係;狀態有如下幾種:

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

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

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

        INVALID:無法識別的連接(一般不會放行)

        UNTRACKED:未進行追蹤的連接(在連接模板中沒有相關記錄)                          

[root@wtc ~]#iptables -A INPUT  -m state --state ESTABLISHED -j ACCEPT
[root@wtc  ~]#iptables  -A OUTPUT  -s 172.18.42.200 -d 0/0 -p tcp -sport 80 -m state --state NEW -j ACCEPT

        查看連接追蹤功能所能夠容納的最大連接數量:

        /proc/sys/net/nf_conntrack_max

        修改鏈接追蹤功能所能夠容納的最大連接數量

        echo  Num  >  /proc/sys/net/nf_conntrack_max

        sysctl  -w  net.nf_conntrack_max=Num

        缺點:如果連接模板超載,當有一個新的請求時,web網頁會顯示連接超時同時conntrack所能夠連接數量的最大值取決於/proc/sysnet/nf_conntrack_max的設定;已經追蹤到的記錄並記錄在/prco/net/nf_conntrack文件中,但當模板滿載時,後續的新連接可能會被超時,而連接超時的時長將會被刪除;解決的辦法有兩個

    (1)加大nf_conntrack_max的值

                                

[root@wtc ~]# vim /proc/sys/net/netfilter/nf_conntrack_max

    (2)降低nf_conntrack_timeout文件的的時間(不同協議的連接追蹤時長不同)

[root@wtc ~]#vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait
[root@wtc ~]#vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
[root@wtc ~]# vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_fin_wait
[root@wtc ~]# vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait



    開放主/被動模式的ftp服務:

        主動:

[root@wtc ~]#iptables  -A INPUT -d 172.18.42.200 -p tcp --dport 21 -m state --state ESTABLISHED -j ACCEPT
[root@wtc ~]#iptables -A OUTPUT -s 172.18.42.200 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

        被動:

  

[root@wtc  ~]#modprobe nf_conntrack_ftp  ##內核加載nf_conntarck_ftp模塊
[root@wtc  ~]#iptables -A INPUT -m state --state ESTABLISHED RELATED -j ACCEPT
[root@wtc  ~]#iptables -A OUTPUT -s 172.18.42.200 -p tcp --sport 21 -m state --state NEW -j ACCEPT



        保存編寫好的規則並開機啓動

[root@wtc ~]#server iptables save 
[root@wtc ~]#iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]  ##系統默認的保存路徑
[root@wtc ~]#iptables-save > /path/to/rule_file  ## 可自己指明保存的路徑
[root@wtc ~]#chkconfig  iptables on  ##設置爲當前規則可開機啓動
[root@wtc ~]#service  iptables  restart  ##會自動從系統默認的保存路徑中重載規則


處理動作

    (1)LOG:匹配報文中的日誌功能

       --log-level  level:(emerg, alert, crit, error, warning, notice,info or debug.

            --log-prefix  prefix:說明報文的日誌信息是由誰產生的

                    

[root@wtc ~]iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
[root@wtc ~]iptables -A FORWARD -s 0/0 -d172.18.42.200 -p tcp -m multiport --dports 80,21,23,22 -m state -state NEW -j LOG --log-prefix "(wtc's log)"



    (2)REDIRECT:端口重定向(之後在報文流入本機前纔有用:prerouting)

        --to-ports port[-port]:映射到某個端口上

[root@wtc ~]iptables -t nat -A PREROUTING -d 172.18.42.200 -p tcp 80 -j REDIRECT --to-ports 172.18.42.201:8080
## 此命令是把80的端口映射在8080上,雖然訪問的是80,但正真提供服務的是8080


    (3)SNAT(本地主機請求遠程服務器):源地址轉換;發生在postrouting

        修改IP報文中的源IP地址

        使用場景:本地網絡中的主機可使用統一地址與外部主機通信,從而實現地址僞裝

        請求:由內網主機發起,修改源IP,如果修改則由管理員定義

        響應:修改目標IP,由nat自動根據會話表中追蹤機制實現相應的修改

        --to-source [ipaddr[-ipaddr]][:port[-port]]

[root@wtc ~]iptables -t nat -A POSTROUTING -s 172.18.42.200 -d 172.18.42.201 -p tcp --dport 80 -j SNAT --to-source 172.18.42.202
##請求80端口的是172.18.42.202主機,但正在請求的卻是172.18.42.200主機

    (4)DNAT(遠程主機請求本地服務器):目標地址轉換;發生在prerouting            

        修改IP報文中的目標IP

        使用場景:讓本地網絡中的吳福氣使用統一的地址想外提供服務,但隱藏了自己的真實地址

        請求:有外網主機發情,修改其目標地址,由管理員定義

        響應:修改源地址,但由nat自動根據會話表中的追蹤機制來實現相對應的修改

        --to-destination  [ipaddr[-ipaddr]] [:port[-port]]

[root@wtc ~]iptables -t nat -A PREROUTING -s 172.18.42.200 -d 172.18.42.201 -p tcp --dport 80 -j DNAT --to-destination 172.18.42.202
##請求的是172.18.42.201的80端口,但真正提供服務的卻是172.18.42.202的80端口
[root@wtc ~]iptables -t nat -A PREROUTING -s 172.18.42.200 -d 172.18.42.201 -p tcp --dport 80 -j DNAT --to-destination 172.18.42.202:8080
##真正提供服務的是172.18.42.202的8080端口


    (5)MASQUERADE:源地址轉換;發生在postrouting

        當源地址爲動態獲取的地址時,MASQUERADE會自動判斷要轉換爲的地址

[root@wtc ~]iptables -t nat -A POSTROUTING -s 0/0 -d 172.18.42.201 -j MASQUERADE


                            

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