聊聊Iptables 的五表五鏈,你學(xué)會(huì)了嗎?
概述
iptables 是一個(gè)配置 Linux 內(nèi)核防火墻的命令行工具,它基于內(nèi)核的包過濾框架(packet filtering framework) netfilter, 主要用于管理數(shù)據(jù)包過濾和 NAT 規(guī)則。
圖片來源: https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg
iptables? 與協(xié)議棧內(nèi)有包過濾功能的 hook 交 互來完成工作。這些內(nèi)核 hook 構(gòu)成了 netfilter? 框架。每個(gè)進(jìn)入網(wǎng)絡(luò)系統(tǒng)的包(接收或發(fā)送)在經(jīng)過協(xié)議棧時(shí)都會(huì)觸發(fā)這些 hook, 程序可以通過注冊 hook 函數(shù)的方式在一些關(guān)鍵路徑上處理網(wǎng)絡(luò)流量。iptables? 相關(guān)的內(nèi)核模塊在這些 hook 點(diǎn)注冊了處理函數(shù),因此可以通過配置 iptables 規(guī)則來使得網(wǎng)絡(luò)流量符合防火墻規(guī)則。
理解 iptables? 是學(xué)習(xí) Docker?, Kubernetes 等開源項(xiàng)目中網(wǎng)絡(luò)功能實(shí)現(xiàn)的基礎(chǔ)。
規(guī)則
規(guī)則? 就是網(wǎng)絡(luò)管理員預(yù)定義的條件,一般的定義為 如果數(shù)據(jù)包頭符合當(dāng)前條件,處理這個(gè)數(shù)據(jù)包,反之執(zhí)行下一個(gè)判斷條件, 規(guī)則? 存儲(chǔ)在內(nèi)核空間的過濾表中,這些規(guī)則分別指定了 源地址、目的地址、傳輸協(xié)議?(如TCP、UDP、ICMP)和 服務(wù)類型?(如 HTTP、FTP 和 SMTP)等, 當(dāng)數(shù)據(jù)包與 規(guī)則? 匹配時(shí),內(nèi)核會(huì)執(zhí)行具體的 行為。
配置防火墻的主要工作就是添加、修改和刪除規(guī)則。
行為
動(dòng)作 | 描述 |
ACCEPT | 接收數(shù)據(jù)包 |
DROP | 丟棄數(shù)據(jù)包,進(jìn)行完此動(dòng)作后,將直接中斷檢測過程,不再檢測其它規(guī)則 |
REDIRECT | 將封包重新導(dǎo)向到另一個(gè)端口(PNAT),進(jìn)行完此動(dòng)作后,繼續(xù)比對其它規(guī)則,這個(gè)功能可以用來實(shí)現(xiàn)透明代理或用來保護(hù)應(yīng)用服務(wù)器 |
SNAT | 源地址轉(zhuǎn)換 |
DNAT | 目的地址轉(zhuǎn)換 |
MASQUERADE | IP偽裝(NAT),用于 ADSL |
LOG | 日志記錄 |
SEMARK | 添加 SEMARK 標(biāo)記以供網(wǎng)域內(nèi)強(qiáng)制訪問控制(MAC) |
QUEUE | 將數(shù)據(jù)包傳遞到用戶空間 |
REJECT | 攔截?cái)?shù)據(jù)包,并返回?cái)?shù)據(jù)包通知對方 |
RETURN | 防火墻停止執(zhí)行當(dāng)前鏈中的后續(xù)規(guī)則,并返回到調(diào)用鏈中繼續(xù)檢測 |
5鏈
鏈? 是數(shù)據(jù)包傳播的路徑,每一個(gè) 鏈? 中可以有 N 個(gè) 規(guī)則? (N >= 0)。當(dāng)數(shù)據(jù)包到達(dá)一個(gè) 鏈? 時(shí),iptables? 就會(huì)從鏈中第一個(gè)規(guī)則開始檢測, 如果數(shù)據(jù)包滿足規(guī)則所定義的條件,系統(tǒng)會(huì)執(zhí)行具體的 行為?,否則 iptables? 繼續(xù)檢查下一個(gè)規(guī)則。 如果數(shù)據(jù)包不符合鏈中任一個(gè)規(guī)則,iptables 就會(huì)根據(jù)該鏈預(yù)先定義的默認(rèn)策略來處理數(shù)據(jù)包。
名稱 | 描述 |
INPUT | 處理接收的數(shù)據(jù)包 |
OUTPUT | 處理發(fā)送的數(shù)據(jù)包 |
FORWARD | 處理轉(zhuǎn)發(fā)的數(shù)據(jù)包,常用于 ? |
PREROUTING | 修改到達(dá)且還未轉(zhuǎn)發(fā)的數(shù)據(jù)包,常用于 ? |
POSTOUTING | 修改發(fā)送前的的數(shù)據(jù)包,常用于 ? |
5 表
表有 N 個(gè)鏈,鏈有 N 個(gè)規(guī)則。
大部分場景僅需使用 Filter 表 和 NAT 表。
Raw 表
Raw 表用于在 連接跟蹤、NAT 和路由表處理之前 對數(shù)據(jù)包進(jìn)行處理,包含 2 種內(nèi)置鏈:
? PREROUTING
? OUTPUT
因?yàn)閮?yōu)先級最高,所以如果使用了 Raw? 表,那么在 Raw? 表處理完后, 將跳過 NAT? 表和 ip_conntrack 處理, 也就是避免了 連接跟蹤、NAT 和路由表前置 處理。
Filter 表
Filter? 是 iptables? 的默認(rèn)表,用于過濾數(shù)據(jù)包,如果沒有定義表的情況下將使用 Filter 表,包含 3 種內(nèi)置鏈:
- ? INPUT
- ? OUTPUT
- ? FORWARD
在 Filter 表中只允許對數(shù)據(jù)包進(jìn)行接受,丟棄的操作,而無法對數(shù)據(jù)包進(jìn)行更改。
NAT 表
NAT 用于實(shí)現(xiàn)網(wǎng)絡(luò)地址轉(zhuǎn)換,包含 3 種內(nèi)置鏈:
? PREROUTING
? POSTROUTING
? OUTPUT
Mangle 表
Mangle 用于對指定數(shù)據(jù)包報(bào)頭進(jìn)行修改、標(biāo)記或重定向,包含 5 種內(nèi)置鏈:
? INPUT
? OUTPUT
? FORWARD
? PREROUTING
? POSTROUTING
Security 表
Security 用于給包打上 SELinux 標(biāo)記,以此影響 SELinux 或其他可以解讀 SELinux 安全上下文的系統(tǒng)處理包的行為。這些標(biāo)記可以基于單個(gè)包,也可以基于連接。
表和鏈關(guān)系圖
表和鏈關(guān)系圖
表的檢測優(yōu)先級
Raw -> Mangle -> Nat -> Filter
圖片來源: https://www.frozentux.net/iptables-tutorial/images/tables_traverse.jpg
任何一個(gè)數(shù)據(jù)包必然經(jīng)過 5 個(gè)鏈中的其中一個(gè)。
? 一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),首先進(jìn)入 PREROUTING 鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的 IP 判斷是否需要轉(zhuǎn)發(fā)
? 如果數(shù)據(jù)包是進(jìn)入本機(jī)的,它就會(huì)沿著圖向下移動(dòng),到達(dá) INPUT? 鏈,數(shù)據(jù)包到了INPUT鏈后,任何進(jìn)程都會(huì)收到它,本機(jī)上程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包會(huì)經(jīng)過 OUTPUT? 鏈,然后到達(dá) POSTROUTING 鏈輸出
? 如果數(shù)據(jù)包是轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包會(huì)經(jīng)過 FORWARD? 鏈,然后到達(dá) POSTROUTING 鏈輸出
常用命令
查看類
字段名稱 | 描述 |
target | 規(guī)則行為 |
prot | 協(xié)議 |
opt | 選項(xiàng) |
source | 源 IP 地址 |
destination | 目的 IP 地址 |
操作類
命令選項(xiàng)輸入順序
示例
以下命令在生產(chǎn)環(huán)境中謹(jǐn)慎使用。
查看已添加的iptables規(guī)則
清空當(dāng)前的所有規(guī)則和計(jì)數(shù)
設(shè)置默認(rèn)規(guī)則
開放指定端口
白名單
黑名單
防止 SYN 洪水攻擊
小結(jié)
撰寫本文過程中,筆者發(fā)現(xiàn)中文內(nèi)容幾乎說的都是 四表五鏈?,不知是作者刻意跳過 Security? 表,還是抄襲導(dǎo)致的同質(zhì)化太嚴(yán)重。 雖然 Security 表不是常用功能,但是我們不能忽略其存在。
Reference
- ? Traversing of tables and chains[1]
- ? iptables(8) - Linux man page[2]
- ? iptables[3]
- ? iptables詳解[4]
- ? iptables command[5]
- ? 深入理解 iptables 和 netfilter 架構(gòu)[6]
- ? iptables 基礎(chǔ)知識(shí)與命令速查
引用鏈接
[1]? Traversing of tables and chains: ??https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#TRAVERSINGOFTABLES[2]??? iptables(8) - Linux man page: ??https://linux.die.net/man/8/iptables??
[3]? iptables: ??https://wiki.archlinuxcn.org/wiki/Iptables??
[4]? iptables詳解: ??https://lixiangyun.gitbook.io/iptables_doc_zh_cn/??
[5]? iptables command: ??https://wangchujiang.com/linux-command/c/iptables.html??
[6]? 深入理解 iptables 和 netfilter 架構(gòu): https://arthurchiao.art/blog/deep-dive-into-iptables-and-netfilter-arch-zh/