iptables基礎詳解

一.iptables基礎認知
二.iptables使用格式
  一.iptables簡介
   1.Iptabels是與Linux內核集成的包過濾防火墻系統,幾乎所有的linux發行版本都會包含Iptables的功能。如果 Linux 系統連接到因特網或LAN、服務器或連接 LAN 和因特網的代理服務器, 則Iptables有利于在 Linux 系統上更好地控制 IP 信息包過濾和防火墻配置。
   2.netfilter/iptables過濾防火墻系統是一種功能強大的工具,可用于添加、編輯和除去規則,這些規則是在做信息包過濾決定時,防火墻所遵循和組成的規則。這些規則存儲在專用的信息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規則被分組放在我們所謂的鏈(chain)中。雖然netfilter/iptables包過濾系統被稱為單個實體,但它實際上由兩個組件netfilter 和 iptables 組成。
   3.netfilter 組件也稱為內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。通俗的理解為防火墻框架,承載并生效規則。
   4.iptables 組件是一種工具,也稱為用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。俗稱為規則管理工具。
    netfilter:功能
       filter(“防火”):包過濾
NAT:Network Address Translation
mangle:拆解報文,做出修改,而后重新封裝
raw:關閉nat表上啟用的連接追蹤機制
     iptables:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
     允許用戶自定義規則鏈;它們需要手動關聯至指定的”鉤子“;
    功能(表)<–>鉤子
filter:input, forward, output
nat:prerouting, input, output, postrouting
mangle:prerouting, input, forward, output, postrouting
raw:prerouting, output
       優先級(由高而低):raw –> mangle –> nat –> filter
  iptables原理:

    iptables的原理主要是對數據包的控制,看下圖:

     iptables基礎詳解

  
(1) 一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉發出去。
(2)如果數據包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。數據包到了INPUT鏈后,任何進程都會到    它。本機上運行的程序可以發送數據包,這些數據包會經 過OUTPUT鏈,然后到達POSTROUTING鏈輸出。
(3)如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過 FORWARD鏈,然后到達       POSTROUTING鏈輸出。
  規則、表和鏈
 1.規則(rules)
   規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處     理這個數據包”。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議       (TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義      的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的主要工作就是      添加、修改和刪除這些規則。
 2.鏈(chains)
    鏈(chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一條或數      條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定      義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規        則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。
  3.表(tables)

    表(tables)提供特定的功能,iptables內置了4個表,即raw表、filter表、nat表和mangle表,分別用于實現包     過濾,網絡地址轉換和包重構的功能。

        iptables基礎詳解

     
   (1)RAW表
    只使用在PREROUTING鏈和OUTPUT鏈上,因為優先級最高,從而可以對收到的數據包在連接跟蹤前進。一但使用了RAW表,在某個鏈上,RAW表處理完后,將跳過NAT表和ip_conntrack處理,即不再做地址轉換和數包的鏈接跟蹤處理了。
   (2)filter表
    主要用于過濾數據包,該表根據系統管理員預定義的一組規則過濾符合條件的數據包。對于防火墻而言,主要利用在filter表中指定的規則來實現對數據包的過濾。Filter表是默認的表,如果沒有指定哪個表,iptables就默認使用fileter表來執行所有命令,filter表包含了INPUT鏈(處理進入的數據包),FORWARD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)在filter表中只能允許對數據包進行接受,丟棄的操作,而無法對數據包進行更改。(過濾,“防火墻”意義的核心所在)
   (3)nat表
     主要用于網絡地址轉換NAT,該表可以實現一對一,一對多,多對多等NAT工作,iptables就是使用該表實現共享上網的,NAT表包含了PREROUTING鏈(修改即將到來的數據包),POSTROUTING鏈(修改即將出去的數據包),OUTPUT(修改路由之前本地生成的數據包)
    (4) mangle表
      主要用于對指定數據包進行更改,在內核版本xx后的linux版本中該表包含的鏈為:INPUT(處理進入的數據包),FORWORD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)POSTROUTING鏈(修改即將出去的數據包),(修改即將到來的數據包)
   4.規則表之間的優先順序:
     Raw—mangle—nat—filter
    規則鏈之間的優先順序(分三種情況):
     第一種情況:入站數據流向
   從外界到達防火墻的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),之后會進行路由選擇(判斷該數據包應該發往何處),如果數據包 的目標主機是防火墻本機(比如說Internet用戶訪問防火墻主機中的web服務器的數據包),那么內核將其傳給INPUT鏈進行處理(決定是否允許通 過等),通過以后再交給系統上層的應用程序(比如Apache服務器)進行響應。
     第二沖情況:轉發數據流向
  來自外界的數據包到達防火墻后,首先被PREROUTING規則鏈處理,之后會進行路由選擇,如果數據包的目標地址是其它外部地址(比如局域網用戶通過網 關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然后再交給POSTROUTING規則鏈(是否修改數據包的地 址等)進行處理。
     第三種情況:出站數據流向
   防火墻本機向外部地址發送的數據包(比如在防火墻主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,之后進行路由選擇,然后傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
   iptables是采用規則堆棧的方式來進行過濾,當一個封包進入網卡,會先檢查 Prerouting,然后檢查目的IP判斷是否需要轉送出去,接著就會跳到INPUT 或 Forward 進行過濾,如果封包需轉送處理則檢查 Postrouting,如果是來自本機封包,則檢查 OUTPUT 以及Postrouting。過程中如果符合某條規則將會進行處理,處理動作除了 ACCEPT、REJECT、DROP、REDIRECT 和MASQUERADE 以外,還多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK等,其中某些處理動作不會中斷過濾程序,某些處理動作則會中斷同一規則鏈的過濾,并依照前述流程繼續進行下一個規則鏈的過濾(注意:這一點與ipchains不同),一直到堆棧中的規則檢查完畢為止。透過這種機制所帶來的好處是,我們可以進行復雜、多重的封包過濾,簡單的說,iptables可以進行縱橫交錯式的過濾(tables)而非鏈狀過濾(chains)。ACCEPT 將封包放行,進行完此處理動作后,將不再比對其它規則,直接跳往下一個規則鏈(nat:postrouting)。
 二.iptables使用格式
   1.iptables命令格式
   iptables [-t 表] -命令 匹配 操作
  (1)-t 表
     表選項用于指定命令應用于哪個iptables內置表。
  (2)命令
     命令選項用于指定iptables的執行方式,包括插入規則,刪除規則和添加規則,如下表所示
        命令
     -P   –policy               《鏈名》 定義默認策略
     -L   –list                 《鏈名》 查看iptables規則列表
                                     -v, –verbose:詳細信息
                                          -vv
                                     -n, –numeric:數字格式顯示主機地址和端口號
                                     -x: –exact:顯示計數器的精確值,而非圓整后的數據
                                     –line-numbers:列出規則時,顯示其在鏈上的相應的編號
                                    -S  –list-rules [chain]:顯示指定鏈的所有規則
     -A   –append               《鏈名》 在規則列表的最后增加一條規則
     -I   –insert               《鏈名》 在指定的位置插入一條規則
     -D   –delete chain rulenum 《鏈名》 根據規則編號刪除規則
     -D   –delete chain rule-specification 根據規則本身刪除規則
     -R   –replace              《鏈名》 替換規則列表中的某條規則
     -F   –flush                《鏈名》 刪除表中所有規則
     -Z   –zero                 《鏈名》 將表中數據包計數器和流量計數器歸零
                                   注意:每個規則都有兩個計數器
                                       packets:被本規則所匹配到的所有報文的個數
                                       bytes:  被本規則所匹配到的所有報文的大小之和
     -X   –delete-chain         《鏈名》 刪除用戶自定義的引用計數為0的空鏈
     -v   –verbose              《鏈名》 與-L他命令一起使用顯示更多更詳細的信息
     -N   –new-chain chain:    《鏈名》 新建一個自定義的規則鏈:
     -E   –rename-chain old-chain new-chain 重命令鏈
   (3)匹配規則
     匹配選項指定數據包與規則匹配所具有的特征,包括源地址,目的地址,傳輸協議和端口號,如下表所示
      基本匹配                                            說明
     -i  –in-interface        網絡接口名》     指定數據包從哪個網絡接口進入
     -o  –out-interface       網絡接口名》     指定數據包從哪個網絡接口輸出
     -p  –proto               協議類型         指定數據包匹配的協議,如TCP、UDP和ICMP等
     -s  –source              源地址或子網》   指定數據包匹配的源地址
         –sport               源端口號》       指定數據包匹配的源端口號
         –dport               目的端口號》     指定數據包匹配的目的端口號
     -m  –math                匹配的模塊       指定數據包規則所用的過濾模塊
     擴展匹配條件:
         隱式擴展:在使用-p選項指明了特定的協議時,無需再同時使用-m選項指明擴展模塊的擴展機制: 
         顯示擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制:
         隱式擴展:
             -p tcp:可直接使用tcp擴展模塊的專用選項:
               [!] –source-port,–sport port[:port] 匹配報文源端口;可以給出多個端口,但只能是連續的端口范圍 ;
               [!] –destination-port,–dport port[:port]   匹配報文目標端口;可以給出多個端口,但只能是連續的端口范圍 ;
  [!] –tcp-flags mask comp  匹配報文中的tcp協議的標志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
mask:要檢查的FLAGS list,以逗號分隔;
comp:在mask給定的諸多的FLAGS中,其值必須為1的FLAGS列表,余下的其值必須為0;
–tcp-flags SYN,ACK,FIN,RST  SYN
–tcp-flags ALL ALL
–tcp-flags ALL NONE
[!] –syn: –tcp-flags SYN,ACK,FIN,RST  SYN
             -p udp:可直接使用udp協議擴展模塊的專用選項:
                 [!] –source-port,–sport port[:port]
    [!] –destination-port,–dport port[:port]
              [!] –icmp-type {type[/code]|typename}
                     0/0: echo reply
                     8/0: echo request
          顯示擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制:
              1、multiport
以離散或連續的 方式定義多端口匹配條件,最多15個;
[!] –source-ports,–sports port[,port|,port:port]…:指定多個源端口;
[!] –destination-ports,–dports port[,port|,port:port]…:指定多個目標端口;
# iptables -I INPUT  -d 172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -j ACCEPT
 2、iprange
以連續地址塊的方式來指明多IP地址匹配條件;
[!] –src-range from[-to]
[!] –dst-range from[-to]
# iptables -I INPUT -d 172.16。0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -m iprange –src-range 172.16.0.61-172.16.0.70 -j REJECT
 3、time
This  matches  if the packet arrival time/date is within a given range.
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
[!] –weekdays day[,day…]
[!] –monthdays day[,day…]
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–kerneltz:使用內核配置的時區而非默認的UTC;
 4、string
This modules matches a given string by using some pattern matching strategy. 
–algo {bm|kmp}
[!] –string pattern
[!] –hex-string pattern
–from offset
–to offset
~]# iptables -I OUTPUT -m string –algo bm –string “gay” -j REJECT
5、connlimit 
Allows  you  to  restrict  the  number  of parallel connections to a server per client IP address (or client address block).
–connlimit-upto n
–connlimit-above n
~]# iptables -I INPUT -d 172.16.0.7 -p tcp –syn –dport 22 -m connlimit –connlimit-above 2 -j REJECT
6、limit 
This  module  matches  at  a limited rate using a token bucket filter. 
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp –icmp-type 0 -j ACCEPT

7、state
     The “state” extension is a subset of the “conntrack” module.  “state” allows access to the connection tracking state for this packet.
[!] –state state
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
NEW: 新連接請求;
ESTABLISHED:已建立的連接;
INVALID:無法識別的連接;
RELATED:相關聯的連接,當前連接是一個新請求,但附屬于某個已存在的連接;
UNTRACKED:未追蹤的連接;
state擴展:
內核模塊裝載:
nf_conntrack
nf_conntrack_ipv4
手動裝載:
nf_conntrack_ftp 
追蹤到的連接:
/proc/net/nf_conntrack
調整可記錄的連接數量最大值:
/proc/sys/net/nf_conntrack_max
超時時長:
/proc/sys/net/netfilter/timeout
   iptables執行規則時,是從規則表中從上至下順序執行的,如果沒遇到匹配的規則,就一條一條往下執行,如果遇到匹配的規則后,那么就執行本規則,執行后根據本規則的動作(accept,reject,log,drop等),決定下一步執行的情況,后續執行一般有三種情況。
   一種是繼續執行當前規則隊列內的下一條規則。比如執行過Filter隊列內的LOG后,還會執行Filter隊列內的下一條規則。
  一種是中止當前規則隊列的執行,轉到下一條規則隊列。比如從執行過accept后就中斷Filter隊列內其它規則,跳到nat隊列規則去執行
  一種是中止所有規則隊列的執行。
  2.iptables規則的動作
  iptables處理動作(跳轉目標):
     -j targername [per-targer-option]
        簡單target:ACCEPT(接受),DROP(丟棄)
        擴展target:
           REJECT
              –reject-with type
        LOG
          –log-level
          –log-perfix
    用戶自定義鏈做為target:
   REJECT    攔阻該數據包,并返回數據包通知對方,可以返回的數據包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(這個數據包包會要求對方關閉聯機),進行完此處理動作后,將不再比對其它規則,直接中斷過濾程序。 范例如下:
   iptables基礎詳解
   LOG  將數據包相關信息記錄在/var/log中,詳細位置請查閱/etc/syslog.conf配置文件,進行完此處理動作后,將會繼續比對其它規則。列如:
   iptables基礎詳解
  3.保存和載入規則
    保存:iptables-save > /PATH/TO/SOME_RULE_FILE
     重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE
     -n,–noflush:不清除原有規則
     -t,–test:  僅分析生成規則集,但不提交
      CentOS 6:
          保存規則:
             service iptables save
             保存規則于/etc/sysconfig/iptables文件,覆蓋保存:
          重載規則:
             service iptables restart
             默認重載/etc/sysconfig/iptables文件中的規則
          配置文件:/etc/sysconfig/iptables-config
       CentOS 7:
         (1) 自定義Unit File,進行iptables-restore
        (2)firewalldfuwu
        (3)自定義腳本
   規則優化的思路:
      使用自定義鏈管理特定應用的相關規則,模塊化管理規則
            (1) 優先放行雙方向狀態為ESTABLISHED的報文;
(2) 服務于不同類別的功能的規則,匹配到報文可能性更大的放前面;
(3) 服務于同一類別的功能的規則,匹配條件較嚴格的放在前面;
(4) 設置默認策略:白名單機制
(a) iptables -P,不建議;
(b) 建議在規則的最后定義規則做為默認策略;

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

(0)
xialingfengxialingfeng
上一篇 2017-05-03
下一篇 2017-05-03

相關推薦

  • 基于kubernetes構建Docker集群管理詳解

    一、前言        Kubernetes 是Google開源的容器集群管理系統,基于Docker構建一個容器的調度服務,提供資源調度、均衡容災、服務注冊、動態擴縮容等功能套件,目前最新版本為0.6.2。本文介紹如何基于Centos7.0構建Kubernetes平臺,在正式介紹…

    2015-03-10
  • Bash Shell詳解

    引言:什么是Shell? Linux的命令行接口歸結起來就是各種Shell,那么到底什么是Shell?Shell,譯為外殼,是用戶直接連入計算機所使用的計算機程序,負責解析用戶提供的命令,如詞法分析、語法分析、句法分析。 1.Shell的分類 Linux 的命令 shell 是與操作系統相分離的一層。不同的 shell 環境影響您具備不同的功能,比如可編輯的…

    2017-09-07
  • MySQL/MariaDB基于MMM實現讀寫分離及高可用

    前言 MMM(Master-Master replication managerfor Mysql,Mysql主主復制管理器)是一套靈活的腳本程序,基于perl實現,用來對mysql replication進行監控和故障遷移,并能管理mysql Master-Master復制的配置(同一時間只有一個節點是可寫的)。 MMM 優缺點 優點:高可用性,擴展性好,…

    Linux干貨 2015-06-24
  • 文本處理

    cat,tac,rev,more,less,head,tail,cut,wc,sort,uniq,grep,
    正則表達式,擴展正則表達式

    2018-03-13
  • 我的第一篇博客

    2018.3.26 整理

    2018-03-26
  • Linux boot分區意外格式化或清除之后…

    boot分區在沒有備份的情況下意外被清空,包括啟動引導信息也沒了。這時若Linux還在運行,那你是幸運的, 修復的方法: 1. cat  /etc/*release      #趕快先確定當前系統的具體版本。有ISO鏡像趕快掛載上來.   &nbsp…

    Linux干貨 2016-03-22
欧美性久久久久