1. 程式人生 > >linux之iptables 基礎詳解

linux之iptables 基礎詳解

一、簡介

       iptables是Linux系統上的防火牆,是一個包過濾型的防火牆,能夠根據事先定義好的檢查規則對進出本機或者本地網路的報文進行匹配檢查,並對於能夠被規則匹配的報文作出相應的處理動作。iptables有五個內建規則鏈(名稱需大寫),分別為:

  1. PREROUTING
  2. INPUT
  3. FORWARD
  4. OUTPUT
  5. POSTROUTING

      這五個內建規則分別對應的iptables在linux系統中作用的五個位置,分別為:

  1. PREROUTING 對應 從網絡卡進入到核心空間中
  2. INPUT 對應 從核心空間到使用者空間
  3. FORWARD 對應 從一個網絡卡轉發到另一個網絡卡
  4. OUTPUT 對應 從使用者空間到核心空間
  5. POSTROUTING 對應 從核心空間到網絡卡

      五個內建規則鏈對應的圖解如下:

       如上圖,五個規則鏈分別在不同的邏輯位置對進入到系統中的報文按照事先定義的規則進行匹配檢查過濾。由於一個鏈中通常包含著不止一條規則,因此當資料想要通過這些規則鏈的時候,必須得一條一條去匹配通過他們的規則,其形式類似於序列,這也就是為什麼規則鏈被稱為鏈的原因。

       當這些內建鏈中擁有著大量的規則,其中肯定包含著不同型別的規則,如過濾Ip或埠的規則、修改報文的規則等等,而iptables把這些具有相同功能的規則作為表而管理存放。不同的規則鏈中所能包含的規則型別是不一樣的,有些鏈可能可以有地址轉換規則,有些鏈卻不能設定。那麼就iptables自身內建的四種功能表其所包含的規則能被哪些鏈所使用,其分類如下:

  1. filter:過濾表,能被INPUT、FORWARD、OUTPUT這三個規則鏈使用。
  2. nat:網路地址轉換表,能被PREROUTING、OUT、POSTROUTING(centos7中還包含著INPUT)使用。
  3. mangle:報文修改表,能被PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING使用。
  4. raw:一般是為了不再讓iptables對資料包進行跟蹤,提高效能,能被PREROUTING,OUTPUT使用。

       除此之外規則鏈中的規則是鏈式結構,按理來說執行的時候是有一定的順序的,但是不同的規則屬於不同的表,那麼表之間的優先順序是怎麼區分的呢?其實當一個規則鏈當中包含了四個表filter,nat,mangle,raw時,那麼當要執行這個規則鏈中的規則時,其執行的順序是raw>mangle>nat>filter的,也就意味著同一個規則鏈中,表的優先順序為:raw>mangle>nat>filter。

二,iptables 命令規則及設定

對於iptables的規則來說,它的功能就是根據匹配條件來嘗試匹配報文,一旦匹配成功,就按照規則定義的處理動作來處理報文,其命令的使用語法為:

iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]

詳細解釋其常用選項包括:

-t table:
 預設為filter;其它可用的有raw, mangle, nat;
				
COMMAND:
 鏈:
	-P:policy,策略,定義預設策略; 一般有兩種選擇,ACCEPT和DROP;
	-N:new,新建一條自定義的規則鏈;被內建鏈上的規則呼叫才能生效;[-j  chain_name];
	-X:drop,刪除自定義的引用計數為0的空鏈;
	-F:flush,清空指定的鏈;
	-E:重新命名自定義的引用計數和為0的鏈;
規則:
	-A:append,追加,在指定鏈的尾部追加一條規則;
	-I:insert,插入,在指定的位置(省略位置時表示鏈首)插入一條規則;
	-D:delelte,刪除,刪除指定的規則;
	-R:replace,替換,將指定的規則替換為新規則;不能僅修改規則中的部分,而是整條規則完全替換;
檢視:
	-L:list,列出表中的鏈上的規則;
	-n:numeric,以數值格式顯示;
    -v:verbose,顯示詳細格式資訊; 
	-vv, -vvv
	-x:exactly,計數器的精確結果;
	--line-numbers:顯示鏈中的規則編號;

chain:
                (1) 內建鏈;
                (2) 自定義鏈;

iptables的規則由匹配條件和處理動作組成,其中匹配條件分為基本匹配條件和擴充套件匹配條件。

1,匹配條件

a) 基本匹配條件,基本匹配條件為內建條件,由iptables(netfilter)自行提供,無需載入任何模組。常見的基本匹配條件有:

  1. [!] -s, --source address[/mask][...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍;
  2. [!] -d, --destination address[/mask][...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;
  3. [!] -p, --protocol protocol:指定匹配的協議,常見協議包括:TCP、UDP、ICMP等;
  4. [!] -i,--in-interface name:資料報文流入的介面,只能應用於資料報文流入的環節,只能應用於PREROUTING,INPUT和FORWARD鏈;
  5. [!] -o, --out-interface name:資料報文流出的介面;只能應用於資料報文流出的環節,只能應用於FORWARD、OUTPUT和POSTROUTING鏈;

b) 擴充套件匹配條件,需載入擴充套件模組方可生效,而擴充套件匹配條件又分為隱式擴充套件和顯示擴充套件。

  • 隱式擴充套件不需要手動載入擴充套件模組,因為其實對協議的擴充套件,因此當使用-p選項指明瞭協議的時候,就表示已經指明瞭要擴充套件的模組。其常見條件包括:
  1. [!] --source-port, --sport port[:port]:匹配報文的源埠;可指定埠範圍;
  2. [!] --destination-port,--dport port[:port]:匹配報文的目標埠;可指定埠範圍;
  3. [!] --tcp-flags:指定tcp的標記,如:SYN,ACK,FIN,RST等;
  4. [!] --syn:用於匹配第一次握手,相當於”--tcp-flags SYN,ACK,FIN,RST SYN“;
  5. [!] --icmp-type {type[/code]|typename}:用於指定icmp協議的型別,如--icmp-type 8;
  • 顯示擴充套件則必須手動載入擴充套件模組,需使用-m選項指明要呼叫的擴充套件模組,其格式為[-m matchname [per-match-options]]。常見的matchname及其各自的子規則如下:
1、multiport:以離散或連續的方式定義多埠匹配條件,最多不超過15個埠;
  [!] --source-ports,--sports port[,port|,port:port]...:指定多個源埠;
  [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標埠;
  [!] --ports port[,port|,port:port]...:指明多個埠;
2、iprange:指明連續的IP地址範圍
  [!] --src-range from[-to]:源IP地址;
  [!] --dst-range from[-to]:目標IP地址;
3、time:根據將報文送到的時間與指定的時間範圍進行匹配;
  --kerneltz:用系統本地時區代替預設的UTC時區;
  --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定從什麼日期開始;
  --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定到什麼日期停止;
  --timestart hh:mm[:ss]:指定從何時開始;
  --timestop hh:mm[:ss]:指定從何時結束;
  [!] --monthdays day[,day...] :指定規則生效的日月
  [!] --weekdays day[,day...] :指定規則在星期幾生效;
  通常後兩個選項不會同時使用
4、string:用於對報文中的應用層資料做字串模式匹配檢查;
  --algo {bm|kmp}:字串匹配檢測演算法;
  [!] --string pattern:要檢測的字串模式;
  [!] --hex-string pattern:要檢測的字串模式,16進位制格式;
5、connlimit:根據每個客戶端的Ip做併發連線數數量匹配檢查;
  --connlimit-upto n:連線的數量小於等於n時匹配;
  --connlimit-above n:連線的數量大於n時匹配;
6、limit:對收發報文的速率做條件匹配;
  --limit rate[/second|/minute|/hour|/day]:將匹配的報文限制速率為每second|/minute|/hour|/day傳送rate次;
  --limit-burst number:限制當達到多個報文後,執行限制;
7、state:根據”連線追蹤機制“去檢查連線的狀態;
  [!] --state state:state的型別包括如下:
      NEW:新發出請求;連線追蹤模板中不存在此連線的相關資訊條目,因此,將其識別為第一次發出的請求;
      ESTABLISHED:NEW狀態之後,連線追蹤模板中為其建立的條目失效之前期間內所進行的通訊狀態;
      RELATED:相關聯的連線;如ftp協議中的資料連線與命令連線之間的關係;
      INVALID:無效的連線;
      UNTRACKED:未進行追蹤的連線;

對於iptables的匹配條件來說,大部分條件均可在條件的前方添上一個!表取反之意,即匹配除了指定的匹配條件之外的內容。

2、處理動作

處理動作相對於匹配條件來說,沒有那麼複雜,其格式類似如下:

-j targetname [per-target-options]

其中targetname即動作有如下型別:

ACCEPT:放開
DROP:丟棄
REJECT:拒絕
    ---reject-with type:可指定拒絕報文的型別,如:icmp-net-unreachable,  icmp-host-unreachable,  icmp-port-unreachable等等。
RETURN:返回呼叫鏈;
REDIRECT:埠重定向;
    --to-ports port[-port]:將匹配的埠重定向為此處指定的埠;
LOG:記錄日誌;
    --log-level:可指定記錄的日誌等級;
    --log-prefix:指定記錄的日誌路徑,預設路徑為:/var/log/messages;
MARK:做防火牆標記;
DNAT:目的地址轉換
    --to-destination [ipaddr[-ipaddr]][:port[-port]]:將目的地址轉換成內網網段的指定ip和埠;
SNAT:源地址轉換;
    --to-source [ipaddr[-ipaddr]]:將源地址轉換成指定的IP;
MASQUERADE:當要轉換的出口地址為動態IP時,MASQUERADE可自行判斷要轉換為的地址;
自定義鏈名:呼叫自定義鏈作為處理動作;

對於匹配條件和處理動作的相關幫助手冊可使用命令man iptablesman iptables-extensions進行檢視。

3、iptables規則的儲存與恢復

在Centos6中iptables的規則保存於/etc/sysconfig/iptables 檔案中,可使用命令service iptables save進行規則的儲存,而iptables啟動或重啟的時候也是會讀取/etc/sysconfig/iptables中的配置來生成相應的規則。
對於Centos7來說,其規則的儲存和恢復則使用下面兩個命令來實現:

儲存:iptables-save >/PATH/TO/SOME_RULE_FILE
過載:iptables-restore < /PATH/FROM/SOME_RULE_FILE

其本質上就是通過將現有的iptables規則匯出到指定的檔案中,然後當規則需要進行還原恢復的時候,再從該指定檔案中讀取恢復。

iptables規則優化:
        (1) 可安全放行所有入站及出站,且狀態為ESTABLISHED的連線;
        (2) 服務於同一類功能的規則,匹配條件嚴格的放前面,寬鬆放後面;
        (3) 服務於不同類功能的規則,匹配報文可能性較大擴前面,較小放後面;
        (4) 設定預設策略;
            (a) 最後一條規則設定;
            (b) 預設策略設定;