三張圖徹底搞懂 iptables 和 netfilter

我們都知道,iptables 和 netfilter 構成了 Linux 防火牆的堅實屏障,這兩個技術涉及的知識點太廣了,面面俱到的話足以寫成一本書。但其實抓住重點核心知識的話,三張圖就可以搞定了,本文就來說說這三張圖。

首先,先來看看 iptables 和 netfilter 是什麼關係?

01 第一張圖:iptables 和 netfilter 的關係

iptables 和 netfilter 是一套 Linux 防火牆組合工具,共同合作完成系統的防護工作。iptables 是客戶端工具,netfilter 是服務端程序,iptables 工作在用戶態,netfilter 工作在內核態,用戶可以通過 iptables 命令作用到服務端的 netfilter,netfilter 觸發相應的回調函數(hook 機制)執行相應的防護動作。

整個調用關係如下圖所示:

用戶通過 iptables 下發安全規則或策略,netfilter 執行規則所對應的動作,來完成對系統的防護。netfilter 的本質就是 對報文進行規則的匹配,針對不同的規則,執行相應的動作 。

這些規則有不同的功能,也有相同的功能,在報文傳輸的整個過程中,有不同的作用點,有的作用在入口,有的作用在出口,有的作用在中間協議棧等等。爲了方便管理這些規則集,netfilter 實現上引入了兩個概念: 鏈(chain)和表(table) 。

02 第二張圖:iptables 的 4 表 5 鏈

表集合了相同功能的規則集,iptables 總共實現了 5 張表,但常用的只有 4 張表,我們也只重點以這 4 張表作爲講解:

raw 表 :負責去除數據包上的連接追蹤機制(iptables 默認會開啓對數據包的連接追蹤)mangle 表 :負責數據包的拆解、修改、再封裝等功能nat 表 :負責數據包的網絡地址轉換功能filter 表 :負責數據包過濾(放行、丟棄或拒絕)功能,防火牆功能的真正體現

由於在數據包傳輸過程中,會經歷很多“關卡”,每個“關卡”都有可能匹配多種不同的規則集,也就是匹配不同的表。爲了方便管理這些“關卡”,因此就有了鏈的概念。

鏈就是由多張表串聯組合起來的,充當數據包進出系統的“關卡”。iptables 總共實現了 5 條鏈,分別是:

PREROUTING 鏈 :處理剛進入系統路由前的數據包,可進行 DNATINPUT 鏈 :處理輸入本地進出的數據包FORWARD 鏈 :處理轉發到其他機器的數據包OUTPUT 鏈 :處理本地進出輸出的數據包POSTROUTING 鏈 :處理從系統出去路由後的數據包,可進行 SNAT

這 5 條鏈,每一條鏈也並不會串聯所有的表,因爲每個“關卡”負責的功能不一樣,可以匹配的規則自然也就不一樣,下面總結下每條鏈的規則都可以存在哪些表中:

PREROUTING 鏈 :raw, mangle, natINPUT 鏈 :mangle, nat, filterFORWARD 鏈 :raw, mangle, nat, filterOUTPUT 鏈 :mangle, filterPOSTROUTING 鏈 :mangle, nat

當然這些表的優先級也是不一樣的,修改數據包的優先級肯定要比查找數據包的大,所以,從功能上說,這 4 張表的優先級分別爲:

raw > mangle > nat > filter

連接追蹤 raw 表是數據包剛進入就要記錄的,所以優先級最高,過濾表 filter 表作爲最後一道屏障,優先級是最低的。

以上梳理了 4 表 5 鏈之間的關係,我們可以用下面一張圖來記憶它們,相信你看完,就會對 iptables 的 4 表 5 鏈比較清晰了。

至此,Linux 系統就通過這 4 表 5 鏈設置好了一道道的屏障,當網絡數據包進來或者有數據包向外發出時,必然會經過這些屏障,根據預先設定的規則,就可以對這些數據包進行有效的轉發或過濾。

03 第三張圖:iptables 的過濾轉發流程

結合第一張圖,我們可以看到,netfilter 從網絡層開始介入,對進出的數據包進行控制。一般的數據包處理主要經過以下三個流程:

1.到本機某進程進行處理的報文(請求報文):PREROUTING->INPUT2.從本機轉發的報文(中轉報文):PREROUTING->FORWARD->POSTROUTING3.從本機某進程發出的報文(響應報文):OUTPUT->POSTROUTING

我們可以用以下這張圖來表示:

這張圖一看就清楚了,不用過多解釋。我們重點從代碼層面來看看,首先看“入方向”,數據包從網卡接收進入網絡層之後(ip_rcv 接收),會經過預先註冊好的 hook 函數(NF_INET_PRE_ROUTING),當即進入 PREROUTING 鏈,經由三張表(raw、mangle、nat)洗刷,合格的報文隨即進入下一個階段,這個階段首先會經由一次路由判斷,判斷是進入本機進程的報文,通過 ip_local_deliver 函數,觸發 hook NF_INET_LOCAL_IN 進入 INPUT 鏈,再通過三張表洗刷一次,最後纔會往上送入傳輸層(udp_rcv)。

而判斷是其他主機的報文,則會通過 ip_forwad 觸發 NF_INET_FORWARD 進入 FORWARD 鏈,完了再通過 POSTROUTING 鏈轉發出去。

接着來看“出方向”,數據包由本地某進程發出,到達網絡層,觸發這裏的 hook NF_INET_LOCAL_OUT 進入 OUTPUT 鏈,過濾之後繼續通過 POSTROUTING 鏈發送出去。

關於以上的更多細節,可以參考 Linux 收發數據包的流程,這裏我們只是提一下 iptables 在 Linux數據包收發過程中所起的作用。從圖中可以看到,iptables 和 netfilter 的作用只是在網絡層中,通過設置一層層的“關卡”(hook 函數)來達到過濾和修改數據包的目的。

知道每條鏈都含哪些表,我們就可以通過 iptables 命令爲不同的表和鏈指定不同的規則了,從而達到控制和過濾數據包的目的。


參考:

文章圖參考 http://www.zsythink.net/archives/tag/iptables/https://www.cnblogs.com/marility/p/7448407.html


後臺回覆“加羣”,帶你進入高手如雲交流羣

推薦閱讀:

救命,Linux正在喫掉我的內存!

別再說你不懂Linux內存管理了

強烈安利的幾款畫圖工具

LVS 實戰抓包分析

1000 多萬條數據,用MySQL如何處理?

故障排查:K8s中Pod無法正常解析域名

詳解Linux中3個文件查找相關命令

網絡排錯大講解~

如何診斷 Linux 服務器的性能?

用了HTTPS就安全了嗎?

HTTP/3 原理實戰

Linux 下10個幫助你調試的命令

Nginx爲什麼快到根本停不下來?

OVS 和 OVS-DPDK 對比

微軟出品的最新K8S學習指南3.0下載

瞭解HTTPS工作原理,看這一篇就夠了


喜歡,就給我一個“在看”


10T 技術資源大放送!包括但不限於:雲計算、虛擬化、微服務、大數據、網絡、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公衆號內回覆「1024,即可免費獲取!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章