<b>Netfilter/Iptables</b>
<b>linux iptables</b><b>是由兩個元件組成:Netfilter</b><b>和Iptables</b><b>組成:</b>
Netfilter元件稱之為<b>核心空間</b>,是linux核心的一部分,是在Linux核心中為攔截額操作資料包提供的一套架構。其架構包含以下三部分:
1:為每種網絡協定(IPV4,IPv6等)定義一套HOOK函數,這些HOOK函數在資料包流過IP協定棧的幾個關鍵點被調用。在這幾個點鐘,協定棧将把資料包及HOOK函數标号作為參考調用Netfilter架構。
2:核心的任何子產品可以對每種協定的一個或多個HOOK函數進行注冊以實作挂接,這樣當某個資料包被傳遞給Netfilter架構時,核心能檢測是否有哪個子產品對該協定和HOOK函數進行了注冊。若注冊了,則調用該子產品,這樣這些子產品就有機會檢查該資料包丢棄/修改/傳入使用者空間的隊列。
3:那些在使用者控件隊列中排隊的資料包是被傳遞給使用者空間異步的處理。
<b>IPV4</b><b>中定義了</b><b>5</b><b>個</b><b>HOOK</b><b>,如圖</b><b> </b>

Netfilter根據網絡封包的流向,分為三部分:流入,流經,流出。
在以下幾個點插入處理過程:
NF_IP_PRE_ROUTING,在封包作路由以前執行;
NF_IP_FORWARD,在封包轉向另一個NIC以前執行;
NF_IP_POST_ROUTING,在封包流出以前執行;
NF_IP_LOCAL_IN,在流入本地的封包作路由以後執行;
NF_IP_LOCAL_OUT,在本地封包做流出路由前執行。
<b>分析:</b><b></b>
當網絡上的資料包從左邊進入系統,資料包經過第一個點調用HOOK函數NF_IP_PRE_ROUTING進行處理;然後就進入本地路由表,檢視該資料包是需要轉發還是發給本地;若該資料包時發往本地的,則該資料包經過HOOK函數NF_IP_LOCAL_IN處理以後傳遞給上層協定;若該資料包是需要轉發,則會被NF_IP_FORWARD處理;經過轉發的資料包最後由NF_IP_POST_ROUTING處理後發送到網絡上;本地産生的資料經過路由選擇後,調用NF_IP_LOCAL_OUT進行處理,然後經過NF_IP_POST_ROUTING處理後發送到網絡上。
當這些HOOK函數被經過的資料包調用時将傳回下列值之一,告知Netfilter如果對資料包采取相應動作。
NF_ACCEPT 繼續正常的封包處理
NF_DROP 丢棄封包
NF_STOLEN 由HOOK函數處理了該封包,不要再繼續傳送
NF_QUEUE 将封包入列,通常交由使用者程式處理
NF_REPEAT 再次調用該HOOK函數
<b>Iptables</b><b>使用者空間工具</b><b></b>
iptables 元件是一種工具,也稱為<b>使用者空間</b>。它使插入、修改和除去資訊包過濾表中的規則變得容易。這些規則存儲在表的對象中。
<b>Table </b><b>表</b><b></b>
1. filter表
該表的作用主要用于包過濾。它在LOCAL_IN,FORWARD,LOCAL_OUT三處HOOK函數進行了注冊。
2.Nat表
該表的作用主要用于位址轉換。它在PRE_ROUTING,POST_ROUTING兩處HOOK函數進行了注冊。
3.Mangle表
該表的作用是進行資料包内容的修改。它在Netfilter的所有5個HOOK函數進行了注冊。
<b>Chain </b><b>鍊</b><b></b>
在每張表中,核心使用鍊管理資料包,每個鍊中包含了一組規則表。
表與鍊的關系:
<b>Table</b>
<b>Chain</b>
Filter
INPUT
FORWARD
OUTPUT
Nat
PREROUTING
POSTOUTING
Mangle
POSTROUTING
鍊INPUT=HOOK函數 LOCALIN
鍊OUTPUT=HOOK函數 LOCALOUT
鍊PREROUTING=HOOK函數 PREROUTING
鍊POSTROUTING=HOOK函數 POSTROUTING
鍊 FORWARD=HOOK函數 FORWARD
<b>鍊的名字與</b><b>HOOK</b><b>函數名相似,鍊的作用和位置也與</b><b>HOOK</b><b>函數相吻合,可以說鍊就是實作</b><b>HOOK</b><b>函數調用的方式。</b><b></b>
<b>Target </b><b>目标</b><b></b>
鍊的每個規則都會有一個目标,目标決定了該規則對資料包如何處理。
常用目标:
ACCEPT:允許
DROP:拒絕
REJECT:同DROP一樣,不過它會向發送方傳回個錯誤資訊