iptables

iptables

  • 包過濾型的防火墻

  • Firewall:防火墻,隔離工具;工作于主機或網絡邊緣,對于進出本主機或本網絡的報文根據事先定義的檢查規則作匹配檢測,對于能夠被規則匹配到的報文作出相應處理的組件;

    • 主機防火墻
      網絡防火墻

    • 軟件防火墻(軟件邏輯)
      硬件防火墻(硬件和軟件邏輯)

  • 版本

    • ipfw (firewall framework):命令行工具,生成規則并送往內核
    • ipchains (firewall framework):生成規則
    • iptables(netfilter)

      • iptables:rules until,位于用戶空間的通用規則編寫工工具
      • netfilter:工作在kernel

        • hook function(鉤子函數)
          input
          output
          forward
          prerouting
          postrouting
  • iptables的鏈:內置鏈和自定義鏈

    • 內置鏈:對應于hook function

      • PREROUTING
        INPUT
        FORWARD
        OUTPUT
        POSTROUTING
    • 自定義鏈接:用于內置鏈的擴展和補充,可實現更靈活的規則管理機制;被內置鏈調用
  • 功能:

    • filter:過濾,防火墻;
      nat:network address translation;用于修改源IP或目標IP,也可以改端口;
      mangle:拆解報文,做出修改,并重新封裝起來;修改除源地址、目標地址以外的其他屬性;LVS會使用到;
      raw:關閉nat表上啟用的連接追蹤機制;
  • 功能<–>鏈:

    • 在同一鏈上的不同功能生效的順序,由其功能的優先級決定:raw > mangle > ant > filter
    • raw:PREROUTING, OUTPUT
      mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
      nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
      filter:INPUT,FORWARD,OUTPUT
  • 報文流向:

    • 流入本機:PREROUTING –> INPUT
      由本機流出:OUTPUT –> POSTROUTING
      轉發:PREROUTING –> FORWARD –> POSTROUTING
  • 路由功能發生的時刻:

    • 報文進入本機后:PREROUTING之后;
      判斷目標主機是?
      報文離開本機之前:POSTROUTING之前
      判斷經由哪個接口送往下一站?
  • 規則:

    • 組成部分:根據規則匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動作作出處理;

      • 匹配條件:

        • 基本匹配條件
          擴展匹配條件
      • 處理動作:

        • 基本處理動作
          擴展處理動作
          自定義處理機制
  • 添加規則時的考量點:

    • 通過要實現哪種功能:判斷添加到哪個表上;
    • 通過報文流經的路徑:判斷添加到哪個鏈上;

    • 鏈:鏈上的規則次序,即為檢查的次序;因此,隱含一定的應用法則:

      1. 同類規則(訪問同一應用),匹配范圍小的放上面;
      2. 不同類的規則(訪問不同應用),匹配到報文頻率較大的放在上面;
      3. 將那些可由一條規則描述的多個規則合并起來;
      4. 設置默認策略;使用白名單機制;

        1. 不建議使用:iptables -P
        2. 在規則的最后定義規則作為默認策略;
      5. 同為放行規則時,允許的規則,匹配范圍大的放上面
      6. 同為放行規則時,拒絕的規則,把匹配范圍小的放上面

iptables

  • iptables啟動與配置

    • CentOS 6:

      • service iptables {start|stop|restart|status}

        • start:讀取事先保存的規則,并應用到netfilter上;
          stop:清空netfilter上的規則,以及還原默認策略等;
          status:顯示生效的規則;
          restart:清空netfilter上的規則,再讀取事先保存的規則,并應用到netfilter上;
      • 默認的規則文件:/etc/sysconfig/iptables

      • checkconfig iptables on|off;開機是否啟動

    • CentOS 7:

      • systemctl start|stop|restart|status firewalld.service

      • systemctl disable firewalld.service

      • systemctl stop firewalld.service

  • 命令選項

    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...]  [target]
    
      match = -m matchname [per-match-options]
    
      target = -j targetname [per-target-options]
  • 規則格式:

    iptables   [-t table]   COMMAND   chain   [-m matchname [per-match-options]]   -j targetname [per-target-options]`
    • -t table:
      raw, mangle, nat, [filter]

    • COMMAND:如何管理chain的命令

      • 鏈管理:

        • -N:new, 自定義一條新的規則鏈;
        • -X: delete,刪除自定義的規則鏈;
        • -P:Policy,設置默認策略;
          對filter表中的鏈而言,其默認策略有:ACCEPT:接受;DROP:丟棄;REJECT:拒絕;
        • -E:重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也不能被刪除;
      • 規則管理:

        • -A:append,追加;
        • -I:insert, 插入,要指明位置,省略時表示第一條;
        • -D:delete,刪除;

          1. 指明規則序號;
          2. 指明規則本身;
        • -R:replace,替換指定鏈上的指定規則;
        • -F:flush,清空指定的規則鏈;
        • -Z:zero,置零;
          iptables的每條規則都有兩個計數器:

          1. 匹配到的報文的個數;pkts
          2. 匹配到的所有報文的大小之和;bytes
      • 查看:

        • -L:list, 列出指定鏈上的所有規則;

          • -n:numberic,以數字格式顯示地址和端口號;
            -v:verbose,詳細信息;-vv, -vvv
            -x:exactly,顯示計數器結果的精確值;
            –line-numbers:顯示規則的序號;
    • chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

    • 匹配條件:-m matchname [per-match-optinons]

      • 基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
        [!] -s, –source address[/mask][,…]:檢查報文中的源IP地址是否符合此處指定的地址或范圍;
        [!] -d, –destination address[/mask][,…]:檢查報文中的目標IP地址是否符合此處指定的地址或范圍;
        [!] -p, –protocol protocol (/etc/protocols中的協議名)

        protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or  "all"
              主要講:{tcp|udp|icmp}

        [!] -i, –in-interface name:數據報文流入的接口;只能應用于數據報文流入的環節,只能應用于PREROUTING,INPUT和FORWARD鏈;
        [!] -o, –out-interface name:數據報文流出的接口;只能應用于數據報文流出的環節,只能應用于FORWARD、OUTPUT和POSTROUTING鏈;

      • 擴展匹配條件: 需要加載擴展模塊,方可生效;

        • 隱式擴展:不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊;

          • tcp:

            [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍;
            [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍;
            [!] --tcp-flags  mask  comp
              mask is the flags which we should examine,  written as a comma-separated list,例如 SYN,ACK,FIN,RST
              comp is a comma-separated list  of  flags  which must be set,例如SYN
              例如:“--tcp-flags  SYN,ACK,FIN,RST  SYN”表示,要檢查的標志位為SYN,ACK,FIN,RST四個,其中SYN必須為1,余下的必須為0;
            [!] --syn:用于匹配第一次握手,相當于”--tcp-flags  SYN,ACK,FIN,RST  SYN“;
          • udp

            [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍;
            [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍;
          • icmp

            [!] --icmp-type {type[/code]|typename}
                  echo-request:8   (ping請求)
                      ~]# iptables -A INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -j DROP    自己可以ping其他主機,其他主機ping不了自己
                  echo-reply:0        (ping回應)
        • 顯式擴展:必須顯式地指明使用的擴展模塊進行的擴展;[-m matchname [per-match-options]];

          • 使用幫助

            • CentOS 6:man iptables
            • CentOS 7:man iptables-extensions
          1. multiport擴展
            以離散方式定義多端口匹配;最多指定15個端口;

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

            ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport –dports 22,80 -j ACCEPT

          2. iprange擴展
            指明連續的(但一般不能擴展為整個網絡)ip地址范圍;

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

            ~]# iptables -A INPUT -d 172.16.100.67 -p tcp –dport 80 -m iprange –src-range 172.16.100.5-172.16.100.10 -j DROP

          3. string擴展
            對報文中的應用層數據做字符串模式匹配檢測;對明文編碼的協議生效;

            --algo {bm|kmp}:字符串匹配檢測算法;
                 bm:Boyer-Moore
                 kmp:Knuth-Pratt-Morris
             [!] --string pattern:要檢測的字符串模式;
             [!] --hex-string pattern:要檢測的字符串模式,16進制格式;

            ~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp –sport 80 -m string –algo bm –string “gay” -j REJECT

          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...]
             [!] --weekdays day[,day...]
            
             --kerneltz:使用內核上的時區,而非默認的UTC;

            ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp –dport 80 -m time –timestart 14:30 –timestop 18:30 –weekdays Sat,Sun –kerneltz -j DROP

          5. connlimit擴展(連接限制)
            根據每客戶端IP做并發連接數數量匹配;

            --connlimit-upto n:連接的數量小于等于n時匹配;
             --connlimit-above n:連接的數量大于n時匹配;
                 使用時,根據默認策略是允許還是拒絕使用

            ~]# iptables -A INPUT -d 172.16.100.67 -p tcp –dport 21 -m connlimit –connlimit-above 2 -j REJECT

          6. limit擴展
            基于收發報文的速率做匹配;
            采用令牌桶過濾器;

            --limit rate[/second|/minute|/hour|/day]        平均速率
             --limit-burst number            峰值數量

            ~]# iptables -I INPUT -d 172.16.100.67 -p icmp –icmp-type 8 -m limit –limit 3/minute –limit-burst 5 -j ACCEPT
            ~]# iptables -I INPUT 2 -p icmp -j REJECT

          7. state擴展

            • 根據”連接追蹤機制“去檢查連接的狀態;

              • 在內核的內存空間當中,把每一個請求的連接和本機出去的連接,彼此之間通過模板建立起關聯關系,從而能夠追蹤來本機訪問的每一個客戶端和本機響應的每一個響應報文或響應鏈接,它們二者之間有什么關系;
            • conntrack機制:追蹤本機上的請求和響應之間的關系;因此,能使得對所有請求報文的響應能夠定義的狀態,有如下幾種:

              • NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求;
              • ESTABLISHED:NEW狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信狀態;
              • RELATED:相關聯的連接;如ftp協議中的數據連接與命令連接之間的關系;
              • INVALID:無效的連接;
              • UNTRACKED:未進行追蹤的連接;
            • [!] –state state

            • 不同的協議的連接追蹤時長:

              ~]#  iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
              ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
            • 調整連接追蹤功能所能夠容納的最大連接數量:

              /proc/sys/net/nf_contrack_max
            • 已經追蹤到到的并記錄下來的連接:

              /proc/net/nf_conntrack
            • 不同協議的連接追蹤時長

              /proc/sys/net/netfilter/
            • iptables的鏈接跟蹤表最大容量為/proc/sys/net/ipv4/ip_conntrack_max,鏈接碰到各種狀態的超時后就會從表中刪除;當模板滿載時,后續的連接可能會超時

              • 方法一:
                加大nf_conntrack_max 值

                vi /etc/sysctl.conf
                net.ipv4.nf_conntrack_max = 393216
                net.ipv4.netfilter.nf_conntrack_max = 393216
              • 方法二:
                降低 nf_conntrack timeout時間,越少就會越快的騰出空間

                vi /etc/sysctl.conf        
                net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300             
                net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120    
                net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
                net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
    • 處理動作:-j targetname [per-target-options]

      • ACCEPT:接受
        DROP:丟棄
        REJECT:拒絕
        RETURN:返回調用鏈;
        REDIRECT:端口重定向;
        LOG:記錄日志;
        MARK:做防火墻標記;
        DNAT:目標地址轉換;
        SNAT:源地址轉換;
        MASQUERADE:地址偽裝;

        自定義鏈
      • Target:

        • ACCEPT, DROP, REJECT, RETURN
        • LOG, SNAT, DNAT, REDIRECT, MASQUERADE,…

          LOG:既不做拒絕,也不做允許,只是做日志
            --log-level level 指明日志級別
            --log-prefix prefix 日志前綴
  • 如何使用自定義鏈:

    • 自定義鏈:需要被調用才能生效;自定義鏈最后需要定義返回規則;

    • 返回規則使用的target叫做RETURN;

    • 被調用后的自定義鏈,不可再被重新引用、重新命名、刪除,除非清空規則并解除引用,

      添加自定義鏈:
        [root@station77 ~]# iptables -N icmp
        [root@station77 ~]# iptables -L -n
        Chain icmp (0 references)
        target     prot opt source               destination 
      重命名:引用次數為0,是可以直接重命名的
        [root@station77 ~]# iptables -E icmp in-icmp
        [root@station77 ~]# iptables -L -n
        Chain in-icmp (0 references)
        target     prot opt source               destination            
      向自定義鏈中添加規則:
        [root@station77 ~]# iptables -A in-icmp -d 172.16.251.77 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
        [root@station77 ~]# iptables -L -n
        Chain in-icmp (0 references)
        target     prot opt source               destination         
        ACCEPT     icmp --  0.0.0.0/0            172.16.251.77        icmptype 8 state NEW
      調用鏈:
        在INPUT上附加規則
            iptables -A INPUT -j in-icmp 
      如果匹配不到,返回主鏈
        iptables -A in-icmp -j RETURN
  • 規則的有效期限

    • 使用iptables命令定義的規則,手動刪除之前,其生效期限為kernel存活期限;kernel如果不重啟,其一直有效;

    • 保存規則:
      保存規則至指定的文件:

      CentOS 6:
            ~]# service  iptables  save   
            將規則保存至/etc/sysconfig/iptables文件中;如果iptables設置開機啟動,則開機時會讀取此文件;
      
            ~]# iptables-save  >  /PATH/TO/SOME_RULES_FILE
      
        CentOS 7:
            ~]# iptables-save  >  /PATH/TO/SOME_RULES_FILE
    • 重新載入預存規則文件中規則:

      CentOS 7:
            ~]# iptables-restore <  /PATH/FROM/SOME_RULES_FILE
      
        CentOS 6:
            ~]# service  iptables  restart
    • 自動生效規則文件中的規則:

      1. 用腳本保存各iptables命令;讓此腳本開機后自動運行;

        /etc/rc.d/rc.local文件中添加腳本路徑;
             /PATH/TO/SOME_SCRIPT_FILE
      2. 用規則文件保存各規則,開機時自動載入此規則文件中的規則;

        /etc/rc.d/rc.local文件添加:
              iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
    • CentOS 7:
      引入了新的iptables前端管理工具firewalld,其管理工具有:firewalld-cmd, firewalld-config
  • iptables/netfilter網絡防火墻:

    1. 網關;
    2. filter表的FORWARD鏈;
    • 要注意的問題:

      1. 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性;
      2. 如果要啟用conntrack機制,建議將雙方向的狀態為ESTABLISHED的報文直接放行;
    • NAT: Network Address Translation

      • 請求報文:由管理員定義;

        • 改源地址:SNAT,MASQUERADE
          改目標地址:DNAT
      • 響應報文:由NAT的conntrack機制自動實現;
    • NAT定義在nat表;PREROUTING,INPUT,OUTPUT,POSTROUTING

      • SNAT:POSTROUTING
        DNAT:PREROUTING
        PAT
    • target:

      • SNAT:
        This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.

        --to-source [ipaddr[-ipaddr]]
      • DNAT:
        This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

        --to-destination [ipaddr[-ipaddr]][:port[-port]]
      • MASQUERADE
        This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.

        SNAT場景中應用于POSTROUTING鏈上的規則實現源地址轉換,但外網地址不固定時,使用此target;

      • REDIRECT
        This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

        --to-ports port[-port]

原創文章,作者:s,如若轉載,請注明出處:http://www.www58058.com/77999

(0)
ss
上一篇 2017-06-13
下一篇 2017-06-13

相關推薦

  • 02day-Linux基礎入門及簡單的命令了解

    Linux哲學思想: 1、一切皆文件;          把幾乎所有資源,包括硬件設備都組織為文件格式; 2、由眾多單一目的小程序組成;一個程序只實現一個功能,而且要做好;          組合小程…

    Linux干貨 2016-06-29
  • 主流Linux發行版對比

      對服務器來說,沒有最好的Linux發行版。一切都取決于企業的實際需求。 如今Linux已不再只是一款自由操作系統,它還承載了許多企業的核心應用。在對比流行的Linux發行版時,不僅要考慮有吸引力的功能集,還要關注系統的支持與服務。 服務器管理員擔心操作系統的維護和支持周期。維護生命周期指的是Linux發行版持續提供產品補丁和更新的時間。支持方面…

    Linux干貨 2016-10-31
  • linux文本編輯器,vim編輯器

    定義:文本(純文本信息,必須是不加任何修飾的文本信息)編輯器 文本編輯器種類:                 行文本編輯器 :sed       &…

    Linux干貨 2016-08-10
  • 馬哥教育21期網絡班—第三周課程+練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 who |cut -d" " -f1 |sort -u 2、取出最后登錄到當前系統的用戶的相關信息。 id `who | tail -n …

    Linux干貨 2016-07-12
  • 話說CentOS6的啟動流程

    1.按下開機按鈕,電腦的主板通電,電腦開始加電自檢(POST,Power On and Self Test),測試主機的硬件是否滿足開機的要求. 2.加載主板上的BIOS(Base Input/Output System,基本輸入輸出系統),BIOS會加載用戶設定的第一個可開機設備.,這里我們只說硬盤的加載. 可以按下鍵盤上的Esc或者是F2或者是Del鍵,…

    Linux干貨 2017-05-14
  • vim編輯以及腳本編程練習

    vim編輯器的使用總結: vim在工作過程當中有三種模式:編輯模式、輸入模式、末行模式。 1、編輯模式:即命令模式,鍵盤操作常被理解為編輯命令; 2、輸入模式:在文本文件當中進行輸入內容; 3、末行模式:vim內置的命令行接口,執行vim的內置命令。   vim的使用 打開文件 #vim[option]…[FILE] +#:打開文件后,直接讓光標處…

    Linux干貨 2017-10-29
欧美性久久久久