iptables 補充本

淺談iptables
一 什么是iptables
iptables 是工作在內核之上的netfilter框架的前端工具(iptables是netfilter的管理工具這樣說也不為過)
Firewall:隔離工具,工作于主機或網絡的邊緣處,對經由的報文根據預先定義的規則(識別標準)進行檢測,對于能夠被規則匹配到的報文實行某種預定義的處理機制的一套組件;
 硬件防火墻:在硬件級別實現部分功能的;
 軟件防火墻:應用軟件邏輯在通用硬件基礎上實現;
常說的iptables一共有四張表和五條鏈   就是人們俗稱的四表五鏈 其實iptables并不是只有四張表只是有一個不常用而已既然不常用鄙人也就不再贅述。
netfilter五鏈
        prerouting  (入路由前規則) 在對數據包作路由選擇之前,應用此鏈中的規則,如DNA
   input       (入主機前規則) 當接收到防火墻本機地址的數據包(入站)時,應用此鏈中的規則
forward     (轉發前規則)   當接收到需要通過防火墻發送給其他地址的數據包(轉發)時,應用此鏈中的規則。
output      (出主機前規則) 當防火墻本機向發送數據包(出站時),應用此鏈中規則。
postrouting (出路由前規則) 在對數據包作路由選擇之后,應用此鏈中的規則,如SNAT
netfilter四表
        filter: 包過濾(用途最多的表netfilter防火功能最直觀的表)
NAT:    地址轉換表(常用作地址轉換,例如:DNAT SNAT等)
mangle: 拆解報文,做出修改,而后重新封裝(對報文打標記,或更改TOS TTL等值)
raw:    關閉nat表上啟用的連接追蹤機制(因為raw表的優先級是最高的通過匹配raw表的規則可以跳過nat表規則從而實現減輕nat鏈接追蹤的負載)

每張表上所對應的功能
filter:input, forward, output
主要用于對數據包進行過濾,根據具體規則決定是否放行該數據包(如DROP/ACCEPT/REJECT/LOG)。filter表對應的內核模塊為iptable_filter,包含三個規則鏈:
INPUT 鏈:INPUT針對哪些目的地是本地的包
FORWARD鏈:FORWARD過濾所有不是本地產生的并且目的地不是本地(即本機只負責轉發)的包
OUTPUT鏈:OUTPUT是用來過濾所有本地生成的包
nat:prerouting, input, output, postrouting
主要用于修改數據包的IP地址、端口號等信息(網絡地址轉換,如SNAT、DNAT、MASQUERADE、REDIRECT)。屬于一個流的包只會經過這個表一次。如果第一個包被允許經做NAT或Masqueraded,那么余下的包會自動被做相同的動作,也就是說,余下的包不會再通過這個表(因為包的大小限制導致數據可能會自動地做相同的操作)。表對應的內核模塊為iptable_nat,包含三個鏈:
PREROUTING鏈:作用是在包剛剛到達防火墻時改變它的目的地址
    OUTPUT鏈:改變本地產生的包的目的地址
    POSTROUTING鏈:在包就要離開防火墻之前改變其源地址
mangle:prerouting, input, forward, output, postrouting
    主要用于修改數據包的TOS、TTL以及為數據包設置Mark標記,以實現Qos(Quality Of Service,服務質量)調整以及策略路由等應用,由于需要相應的路由設備支持,因此應用并不廣泛。包含五個規則鏈——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。
raw:prerouting, output
主要用于決定數據包是否被狀態跟蹤機制處理。在匹配數據包時,raw表的規則要優先于其他表。包含兩條規則鏈 OUTPUT、PREROUTING
iptables的四種狀態追蹤機制  
    NEW:該包想要開始一個連接(重新連接或連接重定向)
RELATED:該包是屬于某個已經建立的新連接。例如:FTP的數據傳輸連接就是控制連接所RELATED出來的連接。–icmp-type 0(ping應答)就是–icmp-type 8(ping請求)鎖RELATED出來的
ESTABLISHED:只要發送并接到應答,一個數據連接從NEW變為ESTABLISHED,而且該狀態會繼續匹配這個連接后續數據包
INVALID:數據包不能被識別屬于哪個連接或者沒有任何狀態比如內存溢出、收到不知屬于哪個連接的ICMP錯誤信息,一般應該DROP這個狀態的任何數據
添加規則時需要考量的因素:
(1) 實現的功能:用于判定將規則添加至哪個表;
(2) 報文的流經位置:用于判斷將規則添加至哪個鏈;
(3) 報文的流向:判定規則中何為”源“,何為”目標“;
(4) 匹配條件:用于編寫正確的匹配規則;
(a) 專用于某種應用的同類規則,匹配范圍小的放前面;
(b) 專用于某些應用的不同類規則,匹配到的可能性較多的放前面;同一類別的規則可使用自定義鏈單獨存放;
(c) 用于通用目的的規則放前面;
同類規則 匹配范圍小的放前面
不同類別規則 訪問量大的放前面
nat表會自動開啟連接追蹤功能
LOG要放在accept或DROP之前

iptables數據包的流向
    client–>INTERNET–>server{raw(PREROUTING)–>mangle(PREROUTING)–>nat(PREROUTING)–>[主機路由]–↓到這里要分兩種情況
    1.經過本機路由后目的地址是本機的–>{mangle(INPUT)–>filter(INPUT)–>本地主機進程–>[路由選擇(到達本機的OUTPUT鏈或跳過OUTPUT鏈直接到達POSTROUTING鏈)]}
        直接到達本機的OUTPUT鏈的比較常見   直接到達本機的POSTROUTING鏈的比較少(例如:lvs的實現都是從INPUT鏈進行修改然后直接路由到POSTROUTING鏈)
        到達的是本機OUTPUT的–>{raw(OUTPUT)–>mangle(OUTPUT)–>filter(OUTPUT)–>[路由選擇(查看本機的路由表找到出口)]–>mangle(POSTROUTING)–>nat(POSTROUTING)}–>(WAN/LAN)
    2.經過本機路由后目的地址是其他主機的–{mangle(FORWARD)–>nat(FORWARD)–>filter{FORWARD}–>[路由選擇(查看本機的路由表找到出口)]–>mangle(POSTROUTING)–>nat(POSTROUTING)}–>(WAN/LAN)
    
iptables中4個表的優先級由高到低的順序為:raw–>mangle–>nat–>filter
1.raw表
    raw表只工作在netfilter框架中的PREROUTING和OUTPUT鏈上
    在PREROUTING鏈上工作著raw表mangle表和nat表
    在PREROUTING鏈上raw表的優先級是最好的所以先匹配raw表之后才會匹配其他表的規則
    raw的使用場景  用戶使用了raw表 在某個鏈上 raw表處理完后 將跳過nat表和ip_conntrack處理 即不再做地址轉換和數據包的狀態鏈接跟蹤處理了
    例如高訪問量的web網站服務器的nat地址追蹤表示無法滿足這么巨大的訪問量可以在PREROUTING鏈上設置規則如果目的端口是80端口可以直接跳過nat地址追蹤(前提后端的服務器使用的是公網地址)
    iptables -t raw -A PREROUTING -d 1.1.1.1 -p tcp –dport 80 -j NOTRACK  這條規則匹配的是  如果目的端口是80的且目的主機是1.1.1.1到跳過鏈接地址追蹤
    iptables -t raw -A PREROUTING -s 1.1.1.1 -p tcp –sport 80 -j NOTRACK                   如果源地址是1.1.1.1且源端口是80的主機跳過鏈接地址追蹤
    iptables -t filter -A FORWARD -m state –state UNTRACKED -j ACCEPT                      對于在PREROUTIGN鏈上沒有追蹤的鏈接直接轉發
2.mangle表
    iptables -A PREROUTING -t mangle -p tcp –dport telnet -j TOS –set-tos TOS_value
mangle表工作在netfilter的5個鏈上
1 Minimize-Delay 16 (0x10),要求找一條路徑使延時最小,一些標準服務如telnet、SSH、FTP- control 就需要這個選項。
2 Maximize-Throughput 8 (0x08),要求找一條路徑能使吞吐量最大,標準服務FTP-data能用到這個。
3 Maximize-Reliability 4 (0x04),要求找一條路徑能使可靠性最高,使用它的有BOOTP和TFTP。
4 Minimize-Cost 2 (0x02),要求找一條路徑能使費用最低,一般情況下使用這個選項的是一些視頻音 頻 流協議,如RTSP(Real Time Stream Control Protocol)。
5 Normal-Service 0 (0x00),一般服務,沒有什么特殊要求。這個值也是大部分包的缺省值。
mangle表可以直接修改數據包的TOS和TTL
mangle表對鏈接或數據包打標記
     -j connmark
    選項 功能
    –set-mark value[/mask] 給鏈接跟蹤記錄打標記。
    –save-mark [–mask mask] 將數據包上的標記值記錄到鏈接跟蹤記錄上
    –restore-mark [–mask mask] 重新設置數據包的nfmark值。
    -j mark
    選項 功能
    –set-mark value 設置數據包的nfmark值。
    –and-mark value 數據包的nfmark值和value進行按位與運算。
    –or-mark value 數據包的nfmark值和value進行按或與運算。
mangle表修改ttl值
    iptables -A OUTPUT -m ttl –ttl 60
3.nat表 iptables -t nat 的任何操作都會觸發鏈接追蹤功能
    gateway不建議打開自動追蹤功能,如打開,要把內核空間調大
    /proc/net/nf_conntrack:記錄了已追蹤到的鏈接
    /proc/sys/net/nf_conntrack_max定義了能追蹤的最大連接數
    /proc/sys/net/netfilter/ :該目錄下有各種超時時間的的限定文件
    對目的地址進行轉換
    -j DNAT –to-destination [ipaddr[-ipaddr]][:port[-port]]
    對源地址進行轉換
    -j SNAT –to-source [ipaddr[-ipaddr]]
    MASQUERADE
    SNAT場景中應用于POSTROUTING鏈上的規則實現源地址轉換 但外網地址不固定時 使用此target

4.filter表
    -j DROP 對匹配到的數據包執行丟棄操作
    -j REJECT 對匹配到的數據包執行拒絕操作
    -j ACCEPT 對匹配到的數據包執行通過操作
    filter網上能找到的太多   這里就不再贅述了  這個表也是最常用的表

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

(0)
wodewode
上一篇 2017-05-15 21:54
下一篇 2017-05-15 22:19

相關推薦

  • Linux 基礎知識(六.三)

    按找下列要求,寫一個腳本 (1)創建目錄/tmp/testdir-當前日期時間 (2)在此目錄創建100個空文件:file1-file100 (3)顯示/etc/passwd文件中位于偶數行的用戶的用戶名 (4)創建10個用戶:user10-user19,密碼同用戶名 (5)在/tmp創建10個空文件file10-file19 腳本如下: #!/bin/ba…

    Linux干貨 2016-11-14
  • 軟件包管理

    1.程序包管理器 源代碼–>目標二進制格式–>組織稱為一個或有限幾個“包”文件;     安裝、升級、卸載、查詢、校驗 程序包管理器: debian(Ubuntu):dpt,工具:dpkg,程序包以“.deb”結尾 redhat:redhat package manager&nbsp…

    Linux干貨 2016-08-21
  • Linux第一周心得

          第一次接觸Linux,內心還是有點緊張,怕自己學不會、怕太難。不過,還是想挑戰一下自己,所以來到了馬哥學習Linux。      過來的第一天有點坎坷,不過還好有小琰姐的陪伴,一直和我們東西奔走,總算是解決了一大堆的麻煩,所以,感激……表白小琰姐!哈哈哈  撒花花  …

    Linux干貨 2017-07-15
  • CentOS6系統啟動流程

    概述     了解系統的啟動流程,有助于我們了解Linux系統上的一些工作原理,有助于我們深入的理解一個系統的運作方式,那么本篇就以CentOS6系統為例,介紹一下有關Linux系統啟動相關的內容,分為一下幾個部分:     1、Linux系統的一些基礎概念  &nbs…

    Linux干貨 2016-09-09
  • javascript快速入門

    標識符多了一個美元符號python中只有字母和下劃線和數字,數字不能開頭數據類型有number(整形和浮點型),boolean,string,null,undefined(聲明未賦值),symbol(新引入),object類型(基本類型和特殊類型外的其他類型) 引入一個變量要先申明,var a,let b常量類型,聲明時定義,python中不存在const …

    Linux干貨 2018-01-15
  • 重定向及tr命令詳解及其在管道中的使用簡述

    一、標準輸入和輸出及其重定向         1.標準輸入指的是來自鍵盤的輸入,通常用0來表示;標注輸出是默認輸出到當前終端窗口,用1來表示;標準錯誤輸出同樣默認輸出到當前終端窗口,用2來表示。除標準輸出之外,我們還可以通過重定向來更改默認的輸入和輸出方式。   &nb…

    Linux干貨 2016-08-11
欧美性久久久久