Linux之iptables原理詳解

目錄:

一、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_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。

Linux之iptables原理詳解

(3)Netfilter 所設置的規則是存放在內核內存中的,而 iptables 是一個應用層的應用程序,它通過 Netfilter 放出的接口來對存放在內核內存中的 XXtables(Netfilter的配置表)進行修改。這個XXtables由表tables、鏈chains、規則rules組成,iptables在應用層負責修改這個規則文件。類似的應用程序還有 firewalld 。

  

 Linux之iptables原理詳解


 二、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

Linux之iptables原理詳解

 

(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。

Linux之iptables原理詳解

 

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


 四、Linux數據包路由原理


 

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

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

如圖:

Linux之iptables原理詳解

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

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

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

 


 五、iptables編寫規則


 

        命令格式:

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

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

(0)
z longz long
上一篇 2017-08-04
下一篇 2017-08-04

相關推薦

  • 實現基于MYSQL驗證的vsftpd虛擬用戶

    馬哥教育面授21期 運維 vsftpd MySQL 說明:本實驗在兩臺CentOS主機上實現,一臺做為FTP服務器,一臺做數據庫服務器 一、安裝所需要包和包組: 在數據庫服務器上安裝包: yum –y install mariadb-server mariadb-devel systemctl start mariad…

    Linux干貨 2016-12-21
  • 利用ansible-playbook從測試環境獲取tomcat中java項目新版本發布到生產環境

    一、環境描述 安裝有ansible的服務器:192.168.13.45 測試環境服務器:192.168.13.49 /home/app/api-tomcat/webapps/api.war為測試環境新版本war包位置 生產環境服務器:192.168.13.51 /home/app/api-tomcat/webapps/api.war為生產環境war包位置 /…

    Linux干貨 2016-12-18
  • 通過Nginx來安裝一個Discuz

    這次由于時間有限,所以我就沒有用編譯安裝來啟動LMP,只有Nginx 是編譯安裝的 因為是在centos7上面安裝的Nginx所以我們這里由于能力有限,暫時不能將其加入開機啟動,日后我會進行改進,將其加入開機啟動。這里我們給出Nginxd的編譯選項及環境   yum groupinstall "Development&…

    Linux干貨 2016-10-30
  • HAProxy

    LB Cluster: 四層:lvs, nginx(stream),haproxy(mode tcp) 七層:http: nginx(http, ngx_http_upstream_module), haproxy(mode http), httpd, ats, perlbal, pound… HAProxy 程序環境: 主程序:/usr/sbi…

    Linux干貨 2017-07-03
  • bash功能特性一 變量

    一、什么是shell     shell是為了使用戶能夠操作應用程序的接口程序。如經常使用的圖形界面及命令行界面都是shell。下面來介紹一下bash這個shell的功能。 二、變量的概念     被命名的內存空間即為變量,Linux中內置了許多變量,我們可以通過修改這些變量的值…

    Linux干貨 2015-04-19
  • Linux管理目錄和文件命令

     管理目錄命令: pwd:顯示當前目錄 Cd:   改變當前目錄 ls:    查看目錄下的內容 rmdir: 刪除目錄 管理文件命令: cat: 查看文件內容 cp: 復制文件內容 grep:在文件中查找某字符 touch:創建文件 rm&nbsp…

    2016-03-05
欧美性久久久久