Linux之iptables原理詳解

来源:http://www.cnblogs.com/zllong/archive/2017/07/25/7236881.html
-Advertisement-
Play Games

目錄: 一、netfilter與iptables 二、filter、nat、mangle等規則表 三、INPUT、FORWARD等規則鏈和規則 四、Linux數據包路由原理 五、iptables編寫規則 一、netfilter與iptables (1)Netfilter是由Rusty Russell ...


目錄:

一、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條規則匹配數據包後,該數據包不會再往下繼續匹配了,所以編寫的規則順序極其關鍵。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在CentOS上安裝MySQL,參考網上的一些文章,整理了一下,希望可以幫到需要的朋友。 首先我們先查看一下自己的系統是否已經安裝了MySQL,因為有一些Linux發行版集成了MySQL資料庫,我們可以通過 命令來查看系統是否已經安裝了MySQL資料庫。 ![rpm命令結果][1] 如果已經安裝了M ...
  • 以上兩句都是將'源表'的數據插入到'目標表',但兩句又有區別的: 第一句(select into from)要求目標表不存在,因為在插入時會自動創建。 第二句(insert into select from)要求目標表存在,由於目標表已經存在,所以我們除了插入源表的欄位外,還可以插入常量,如例中的: ...
  • 筆者經過flask web(Miguel著,封面是一條狗)一書的學習,打算實現一個旅游類網站,在此過程中發現,相對於書中的flasky博客程式,需要作出一些改變: 1. 註冊郵箱:國內要使用126,qq等郵箱。預設讀者瞭解過flasky郵件的實現方式,而使用126、qq郵箱的不同之處有: 第一,郵箱 ...
  • 通常意義上,資料庫也就是數據的集合,具體到電腦上資料庫可以是存儲器上一些文件的集合或者一些記憶體數據的集合。 我們通常說的MySql資料庫,sql server資料庫等等其實是資料庫管理系統,它們可以存儲數據,並提供查詢和更新資料庫中的數據的功能等等。根據資料庫如何存儲數據和如何操作數據的實現機制不 ...
  • 今天下午閑著沒事幹,組長讓我熟悉下C++連接資料庫,並對其進行操作,整個過程還算順利,為了記憶和下次使用,現把整個過程記錄下來: 1.安裝mysql 略 2.建立C++控制台程式,新建CPP源文件,如:sqlconn.cpp 3.在工程項目中屬性->c/C++->常規->附加包含目錄中添加mysql ...
  • 在遷移或升級SQL Server資料庫伺服器時,很多場景下我們不能還原msdb,所以我們必須手工遷移SQL Server相關作業。如果手工生成每一個作業的腳本話,費時又費力,其實SQL Server中有好幾種方法可以批量生成作業腳本的方法, 下麵介紹一下。 1:SSMS客戶端工具批量生成創建作業腳本... ...
  • 準備工作 1、 四台已安裝windows server 2008 r2 系統的虛擬機,配置如下: CPU : 1核 MEMORY : 2GB DISK : 40GB(未分區) NetAdapter : 2塊 2、 網卡設置: 本地連接:外網IP(由於虛擬機本身處於內網網段,192.168.1.2-1 ...
  • 目錄: 一、基本規則練習 二、SNAT源地址轉移 三、DNAT目標地址轉移 一、基礎規則練習 (1) 放行ssh (埠:22) (2)修改預設規則鏈(關閉所有埠) (3)放行web(80)埠 httpd nginx (4)修改預設規則鏈後,我們發現ping不通自己,也ping不通別的主機 (5 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...