Linux之iptables原理詳解,linuxiptables詳解

來源:互聯網
上載者:User

Linux之iptables原理詳解,linuxiptables詳解

目錄:

一、netfilter與iptables

二、filter、nat、mangle等規則表

三、INPUT、FORWARD等規則鏈和規則

四、Linux資料包路由原理

五、iptables編寫規則

  、netfilter與iptables

  

  (1)Netfilter是由Rusty Russell提出的Linux 2.4核心防火牆架構,該架構既簡潔又靈活,可實現安全性原則應用中的許多功能,如資料包過濾、資料包處理、地址偽裝、透明代理、動態網路位址轉譯(Network Address Translation,NAT),以及基於使用者及媒體存取控制(Media Access Control,MAC)地址的過濾和基於狀態的過濾、包速率限制等。Iptables/Netfilter的這些規則可以通過靈活組合,形成非常多的功能、涵蓋各個方面,這一切都得益於它的優秀設計思想。

  Netfilter是Linux作業系統核心層內部的一個資料包處理模組,它具有如下功能:

  • 網路位址轉譯(Network Address Translate)
  • 資料包內容修改
  • 資料包過濾防火牆

  (2)Netfilter 平台中制定了資料包的五個掛載點(Hook Point,我們可以理解為回呼函數點,資料包到達這些位置的時候會主動調用我們的函數,使我們有機會能在資料包路由的時候改變它們的方向、內容),這5個掛載點分別是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

 

  (3)Netfilter 所設定的規則是存放在核心記憶體中的,而 iptables 是一個應用程式層的應用程式,它通過 Netfilter 放出的介面來對存放在核心記憶體中的 XXtables(Netfilter的配置表)進行修改。這個XXtables由表tables、鏈chains、規則rules組成,iptables在應用程式層負責修改這個規則檔案。類似的應用程式還有 firewalld 。

   

 

 二、filter、nat、mangle等規則四表

 (1)table有 filter、nat、mangle等規則表;

  filter表

    主要用於對資料包進行過濾,根據具體的規則決定是否允許存取該資料包(如DROP、ACCEPT、REJECT、LOG)。filter 表對應的核心模組為iptable_filter,包含三個規則鏈:

    • INPUT鏈:INPUT針對那些目的地是本地的包
    • FORWARD鏈:FORWARD過濾所有不是本地產生的並且目的地不是本地(即本機只是負責轉寄)的
    • OUTPUT鏈:OUTPUT是用來過濾所有本地產生的包    

  nat表

    主要用於修改資料包的IP地址、連接埠號碼等資訊(網路位址轉譯,如SNAT、DNAT、MASQUERADE、REDIRECT)。屬於一個流的包(因為包的大小限制導致資料可能會被分成多個資料包)只會經過

  這個表一次。如果第一個包被允許做NAT或Masqueraded,那麼餘下的包都會自動地被做相同的操作,也就是說,餘下的包不會再通過這個表。表對應的核心模組為 iptable_nat,包含三個鏈

    • PREROUTING鏈:作用是在包剛剛到達防火牆時改變它的目的地址
    • OUTPUT鏈:改變本地產生的包的目的地址
    • POSTROUTING鏈:在包就要離開防火牆之前改變其源地址

  mangle表

    主要用於修改資料包的TOS(Type Of Service,服務類型)、TTL(Time To Live,生存周期)指以及為資料包設定Mark標記,以實現Qos(Quality Of Service,服務品質)調整以及策略路由等

  應用,由於需要相應的路由裝置支援,因此應用並不廣泛。包含五個規則鏈——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

  raw表

    是自1.2.9以後版本的iptables新增的表,主要用於決定資料包是否被狀態跟蹤機制處理。在匹配資料包時,raw表的規則要優先於其他表。包含兩條規則鏈——OUTPUT、PREROUTING

 

(2)iptables中資料包和4種被跟蹤串連的4種不同狀態:

    • NEW該包想要開始一個串連(重新串連或將串連重新導向)
    • RELATED該包是屬於某個已經建立的串連所建立的新串連。例如:FTP的資料轉送串連就是控制串連所 RELATED出來的串連。--icmp-type 0 ( ping 應答) 就是--icmp-type 8 (ping 請求)所RELATED出來的。
    • ESTABLISHED :只要發送並接到應答,一個資料連線從NEW變為ESTABLISHED,而且該狀態會繼續匹配這個串連的後續資料包。
    • INVALID資料包不能被識別屬於哪個串連或沒有任何狀態比如記憶體溢出,收到不知屬於哪個串連的ICMP錯誤資訊,一般應該DROP這個狀態的任何資料。

 

三、INPUT、FORWARD等規則五鏈和規則 

 

(1)在處理各種資料包時,根據防火牆規則的不同介入時機,iptables供涉及5種預設規則鏈,從應用時間點的角度理解這些鏈:

    • INPUT鏈:當接收到防火牆本機地址的資料包(入站)時,應用此鏈中的規則。
    • OUTPUT鏈:當防火牆本機向外發送資料包(出站)時,應用此鏈中的規則。
    • FORWARD鏈:當接收到需要通過防火牆發送給其他地址的資料包(轉寄)時,應用此鏈中的規則。
    • PREROUTING鏈:在對資料包作路由選擇之前,應用此鏈中的規則,如DNAT。
    • POSTROUTING鏈:在對資料包作路由選擇之後,應用此鏈中的規則,如SNAT。

 

(2)其中中INPUT、OUTPUT鏈更多的應用在“主機防火牆”中,即主要針對伺服器本機進出資料的安全控制;而FORWARD、PREROUTING、POSTROUTING鏈更多的應用在“網路防火 牆”中,特別是防火牆伺服器作為網關使用時的情況。

  

 四、Linux資料包路由原理

 

   (1)理解了Netfilter和Iptables的架構和作用,並且學習了控制Netfilter行為的Xtables表的結構,那麼這個Xtables表是怎麼在核心協議棧的資料包路由中起作用的呢?

  工作流程:網口資料包由底層的網卡NIC接收,通過資料連結層的解包之後(去除資料鏈路幀頭),就進入了TCP/IP協議棧(本質就是一個處理網路資料包的核心驅動)和Netfilter混合的資料包處理流程中了。資料包的接收、處理、轉寄流程構成一個有限狀態向量機,經過一些列的核心處理函數、以及Netfilter Hook點,最後被轉寄、或者本次上層的應用程式消化掉。

 從中,我們可以總結出以下規律:

    • 當一個資料包進入網卡時,資料包首先進入PREROUTING鏈,在PREROUTING鏈中我們有機會修改資料包的DestIP(目的IP),然後核心的"路由模組"根據"資料包目的IP"以及"核心中的路由表"判斷是否需要轉送出去(注意,這個時候資料包的DestIP有可能已經被我們修改過了)
    • 如果資料包就是進入原生(即資料包的目的IP是原生網口IP),資料包就會沿著圖向下移動,到達INPUT鏈。資料包到達INPUT鏈後,任何進程都會-收到它
    • 本機上啟動並執行程式也可以發送資料包,這些資料包經過OUTPUT鏈,然後到達POSTROTING鏈輸出(注意,這個時候資料包的SrcIP有可能已經被我們修改過了)
    • 如果資料包是要轉寄出去的(即目的IP地址不再當前子網中),且核心允許轉寄,資料包就會向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出(選擇對應子網的網口發送出去)

  在寫iptables規則的時候,要時刻牢記這張路由次序圖,根據所在Hook點的不同,靈活配置規則

 

 五、iptables編寫規則

 

        命令格式:

                      

  樣本:

     1 iptables -I INPUT -s 0/0 -d 192.168.42.153 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT 

     1 iptables -t filter -I INPUT -d 192.168.42.153 -p tcp --dport 80 -j ACCEPT 

  1.[-t 表名]:該規則所操作的哪個表,可以使用filter、nat等,如果沒有指定則預設為filter

    • -A:新增一條規則,到該規則鏈列表的最後一行
    • -I:插入一條規則,原本該位置上的規則會往後順序移動,沒有指定編號則為1
    • -D:從規則鏈中刪除一條規則,要麼輸入完整的規則,或者指定規則編號加以刪除
    • -R:替換某條規則,規則替換不會改變順序,而且必須指定編號。
    • -P:設定某條規則鏈的預設動作
    • -nL-L-n,查看當前啟動並執行防火牆規則列表

  2.chain名:指定規則表的哪個鏈,如INPUT、OUPUT、FORWARD、PREROUTING等

    • [規則編號]:插入、刪除、替換規則時用,--line-numbers顯示號碼
    • [-i|o 網卡名稱]:i是指定資料包從哪塊網卡進入,o是指定資料包從哪塊網卡輸出
    • [-p 協議類型]:可以指定規則應用的協議,包含tcp、udp和icmp等
    • [-s 源IP地址]:源主機的IP地址或子網地址
    • [--sport 源連接埠號碼]:資料包的IP的源連接埠號碼
    • [-d目標IP地址]:目標主機的IP地址或子網地址
    • [--dport目標連接埠號碼]:資料包的IP的目標連接埠號碼

  3.-m:extend matches,這個選項用於提供更多的匹配參數,如:

    • -m state --state ESTABLISHED,RELATED
    • -m tcp --dport 22
    • -m multiport --dports 80,8080
    • -m icmp --icmp-type 8

  4.<-j 動作>:處理資料包的動作,包括ACCEPT、DROP、REJECT等

    • ACCEPT允許資料包通過
    • DROP直接丟棄資料包,不給任何回應資訊
    • REJECT拒絕資料包通過,必要時會給資料發送端一個響應的資訊。

    • SNAT源地址轉換。在進入路由層面的route之後,出本地的網路棧之前,改寫源地址,目標地址不變,並在本機建立NAT表項,當資料返回時,根據NAT表將目的地址資料改寫為資料發送出去時候的源地址,並發送給主機。解決內網使用者用同一個公網地址上網的問題。
      MASQUERADE,是SNAT的一種特殊形式,適用於像adsl這種臨時會變的ip上

    • DNAT:目標地址轉換。和SNAT相反,IP包經過route之前,重新修改目標地址,源地址不變,在本機建立NAT表項,當資料返回時,根據NAT表將源地址修改為資料發送過來時的目標地址,並發給遠程主機。可以隱藏後端伺服器的真真實位址。(感謝網友提出之前這個地方與SNAT寫反了)
      REDIRECT:是DNAT的一種特殊形式,將網路包轉寄到本地host上(不管IP頭部指定的目標地址是啥),方便在本機做連接埠轉寄。

    • LOG在/var/log/messages檔案中記錄日誌資訊,然後將資料包傳遞給下一條規則

     除去最後一個LOG,前3條規則匹配資料包後,該資料包不會再往下繼續匹配了,所以編寫的規則順序極其關鍵。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.