iptables是什么
iptables是linux中進(jìn)行網(wǎng)絡(luò)規(guī)則配置的工具,netfilter工作在內(nèi)核空間,iptables設(shè)置的規(guī)則是通過netfilter進(jìn)行生效的。
下圖展示了各個協(xié)議棧以及iptables中規(guī)則的應(yīng)用情況


netfilter hooks
netfilter 提供了 5 個 hook 點。包經(jīng)過協(xié)議棧時會觸發(fā)內(nèi)核模塊注冊在這里的處理函數(shù) 。觸發(fā)哪個 hook 取決于包的方向(是發(fā)送還是接收)、包的目的地址、以及包在上一個 hook 點是被丟棄還是拒絕等等。
下面幾個 hook 是內(nèi)核協(xié)議棧中已經(jīng)定義好的:
- NF_IP_PRE_ROUTING: 接收到的包進(jìn)入?yún)f(xié)議棧后立即觸發(fā)此 hook,在進(jìn)行任何路由判斷 (將包發(fā)往哪里)之前
- NF_IP_LOCAL_IN: 接收到的包經(jīng)過路由判斷,如果目的是本機,將觸發(fā)此 hook
- NF_IP_FORWARD: 接收到的包經(jīng)過路由判斷,如果目的是其他機器,將觸發(fā)此 hook
- NF_IP_LOCAL_OUT: 本機產(chǎn)生的準(zhǔn)備發(fā)送的包,在進(jìn)入?yún)f(xié)議棧后立即觸發(fā)此 hook
- NF_IP_POST_ROUTING: 本機產(chǎn)生的準(zhǔn)備發(fā)送的包或者轉(zhuǎn)發(fā)的包,在經(jīng)過路由判斷之后, 將觸發(fā)此 hook
iptables基礎(chǔ)概念
iptables 表
先來看看 iptables 提供的 table 類型。這些 table 是按規(guī)則類型區(qū)分的。
Filter Table
filter table 是最常用的 table 之一,用于判斷是否允許一個包通過。
在防火墻領(lǐng)域,這通常稱作“過濾”包(”filtering” packets)。這個 table 提供了防火墻 的一些常見功能。
NAT Table
nat table 用于實現(xiàn)網(wǎng)絡(luò)地址轉(zhuǎn)換規(guī)則。
當(dāng)包進(jìn)入?yún)f(xié)議棧的時候,這些規(guī)則決定是否以及如何修改包的源/目的地址,以改變包被 路由時的行為。nat table 通常用于將包路由到無法直接訪問的網(wǎng)絡(luò)。
Mangle Table
mangle (修正)table 用于修改包的 IP 頭。
例如,可以修改包的 TTL,增加或減少包可以經(jīng)過的跳數(shù)。
這個 table 還可以對包打只在內(nèi)核內(nèi)有效的“標(biāo)記”(internal kernel “mark”),后 續(xù)的 table 或工具處理的時候可以用到這些標(biāo)記。標(biāo)記不會修改包本身,只是在包的內(nèi)核 表示上做標(biāo)記。
Raw Table
iptables 防火墻是有狀態(tài)的:對每個包進(jìn)行判斷的時候是依賴已經(jīng)判斷過的包。
建立在 netfilter 之上的連接跟蹤(connection tracking)特性使得 iptables 將包 看作已有的連接或會話的一部分,而不是一個由獨立、不相關(guān)的包組成的流。連接跟蹤邏 輯在包到達(dá)網(wǎng)絡(luò)接口之后很快就應(yīng)用了。
raw table 定義的功能非常有限,其唯一目的就是提供一個讓包繞過連接跟蹤的框架。
Security Table
security table 的作用是給包打上 SELinux 標(biāo)記,以此影響 SELinux 或其他可以解讀 SELinux 安全上下文的系統(tǒng)處理包的行為。這些標(biāo)記可以基于單個包,也可以基于連接。
iptables 規(guī)則(鏈)
對于各個具體的鏈而言:
- INPUT 鏈:處理來自外部的數(shù)據(jù)。
- OUTPUT 鏈:處理向外發(fā)送的數(shù)據(jù)。
- FORWARD 鏈:數(shù)據(jù)轉(zhuǎn)發(fā)。通過路由表后發(fā)現(xiàn)目的地址非本機,則匹配該鏈中的規(guī)則。
- PREROUTING 鏈:處理剛到達(dá)本機并在路由轉(zhuǎn)發(fā)前的數(shù)據(jù)包。
- POSTROUTING 鏈: 處理即將離開本機的數(shù)據(jù)包。
iptables 常用命令
iptables -t filter -L