Netfilter和iptables介紹
前言
在開始Kubernetes的網路之前我們先來學習Netfilter,Netfilter可能了解的人比較少,但是iptables用過 Linux的都應該知道。本文主要介紹Netfilter與iptables的原理。
什麼是Netfilter
Netfilter顧名思義就是網路過濾器,其主要功能就是對進出內核協議棧的數據包進行過濾或者修改,iptables 就是建立在Netfilter之上。Netfilter就是Linux內核里擋在網卡和用戶態進程之間的一道防火牆。

這幅示意圖中,IP包一進一出,有幾個關鍵的檢查點,它們正是Netfilter設置防火牆的地方。Netfilter通過向內核協議棧中不同的位置註冊鉤子函數來對數據包進行過濾或者修改操作,這些位置稱為掛載點,主要有 5 個:PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT 和 POST_ROUTING,如下圖所示:

PRE_ROUTING: IP包進入IP層後,還沒有對數據包進行路由判定前;
LOCAL_IN: 進入主機,對IP包進行路由判定後,如果IP 包是發送給本地的,在進入傳輸層之前對IP包進行過濾;
LOCAL_OUT: IP包通過傳輸層進入用戶空間,交給用戶進程處理。而處理完成後,用戶進程會通過本機發出返回的 IP 包,在沒有對輸出的IP包進行路由判定前進行過濾;
FORWARD: IP包進行路由判定後,如果IP包不是發送給本地的,在轉發IP包出去前進行過濾;
POST_ROUTING: 對於輸出的IP包,在對IP包進行路由判定後進行過濾;
在圖中可以看出決定IP包走向就是路由,按照路由的判定可以分為兩條路線:
-
第一個路由通過查找輸入數據包 IP頭部的IP地址,判斷是否為本機的IP地址是否一致,如果與本機的 IP地址一致,說明數據是發送給本機的,否則說明數據包是發送給其他主機,只是經過本機中轉; -
第二個路由判定根據輸出數據包 IP頭部的IP地址 從路由表中查找對應的路由資訊,然後根據路由資訊獲取下一主機的 IP地址,然後進行數據傳輸;
通過向掛載點註冊鉤子函數,就能夠對處於不同階段的數據包進行過濾或者修改操作。由於鉤子函數能夠註冊多個,因此掛載點通過鏈錶鏈接,所以掛載點又被稱為鏈,因此LOCAL_IN掛載點又稱為INPUT鏈、LOCAL_OUT 掛載點又稱為 OUTPUT鏈、FORWARD掛載點又稱為 PORWARD鏈、PRE_ROUTING掛載點又稱為 PREROUTING鏈、POST_ROUTING掛載點又稱為 POSTOUTING鏈。
什麼是iptables
iptables是建立在 Netfilter 之上的數據包過濾器,通過向 Netfilter 的掛載點上註冊鉤子函數來實現對數據包過濾的,從iptables這個名字上可以看出一定具有表的概念,iptables通過把這些規則表掛載在 Netfilter 的不同鏈上,對進出內核協議棧的數據包進行過濾或者修改操作。
iptables包括四種表:
Filter表
Filter表用於過濾數據包,是iptables的默認表,因此如果你配置規則時沒有指定表,那麼就默認使用Filter表,Filter表可以作用於INPUT鏈、OUTPUT鏈、PORWARD鏈;
NAT表
NAT表用於對數據包的網路地址轉換(IP、埠),分別可以掛載到PREROUTING鏈、POSTOUTING鏈、OUTPUT鏈;
Mangle表
Mangle主要用來修改IP數據包頭,比如修改TTL值,同時也用於給數據包添加一些標記,從而便於後續其它模組對數據包進行處理,可以作用在所有鏈上;
ROW表
Raw表用於判定數據包是否被狀態跟蹤處理,可以作用於PREROUTING鏈、OUTPUT鏈;

數據包從網路中進入到內核協議棧的過程中,要執行的 iptables 規則,如果在執行某條 iptables 規則失敗後,會直接把數據包丟棄,不會繼續執行下面的規則。
添加iptables規則
使用 iptables 命令添加規則,iptables可以分為四部分:
iptables -t表 -A鏈 匹配規則 動作
匹配條件
匹配條件分為基本匹配條件與擴展匹配條件,基本匹配條件包括源IP地址和目標IP地址等,擴展匹配條件包括源埠和目標埠等;
處理動作
處理動作是指當匹配條件成功後要進行的一系列操作過程,動作也可以分為 基本動作 和 擴展動作,常用的動作如下:
ACCEPT:允許數據包通過;
DROP:直接丟棄數據包,不給任何回應資訊;
REJECT:拒絕數據包通過,必要時會給數據發送端一個響應的資訊,客戶端剛請求就會收到拒絕的資訊;
SNAT:源IP地址轉換;
DNAT:目標IP地址轉換;
REDIRECT:在本機做埠映射;
-t <表>:指定要操縱的表;
-A <鏈>:向規則鏈中添加條目;
-D <鏈>:從規則鏈中刪除條目;
-I <鏈>:向規則鏈中插入條目;
-R <鏈>:替換規則鏈中的條目;
-L:顯示規則鏈中已有的條目;
-F:清楚規則鏈中已有的條目;
-Z:清空規則鏈中的數據包計算器和位元組計數器;
-N:創建新的用戶自定義規則鏈;
-P:定義規則鏈中的默認目標;
-h:顯示幫助資訊;
-p:指定要匹配的數據包協議類型;
-s:指定要匹配的數據包源ip地址;
-j <動作>:指定要進行的動作行為;
-i <網路介面>:指定數據包進入本機的網路介面;
-o <網路介面>:指定數據包要離開本機所使用的網路介面。
--dport <埠>:匹配目標埠號。
--sport <埠>:匹配來源埠號。
結束
歡迎大家點點關注,點點贊!