一個 firewall 是一種安全裝置(硬體/軟體),透過過濾流量並阻擋對私有資料的未經授權/不必要的存取來保護網路。擁有合適的防火牆對於保護您的伺服器和基礎設施至關重要。它不僅可以阻擋不必要的流量,還可以防止惡意軟體感染系統。
在 Linux 生態系統中,iptables 是一款熱門的防火牆,它與 netfilter 框架(位於 Linux 核心上)進行互動。大多數現代 Linux 系統都預裝了這些工具。為了充分利用這些系統,理解它們的架構至關重要。否則,制定可靠的防火牆策略可能會令人望而生畏。這可能會導致建立複雜的語法、框架中相互關聯的部分等。
本指南將深入探討 iptables 的架構,以幫助需要建立自己防火牆策略的使用者。我們還將探索 iptables 如何與 netfilter 進行互動,以及各個組件如何協同工作。
Iptables 與 Netfilter
在 Linux 中,iptables 防火牆 是最常見的一種。它的工作原理是與 Linux 核心網路堆疊中的封包過濾掛鉤(hooks)進行互動。正是這些核心掛鉤被統稱為 netfilter 框架。
系統中的每個傳入/傳出封包在流經堆疊時都會觸發這些掛鉤。因此,註冊到這些掛鉤的程式能夠在關鍵節點與流量進行互動。最後,與 iptables 關聯的核心模組會連接到這些掛鉤,以執行指定的防火牆規則。
Netfilter 掛鉤
為了讓程式能夠連接,共有五個不同的 netfilter 掛鉤。當封包流經堆疊時,這些掛鉤會觸發與其註冊的核心模組。觸發條件取決於多種因素,例如:封包方向(傳入/傳出)、封包目的地、封包是否在先前的節點被捨棄/拒絕等。
以下是代表網路堆疊中各個明確定義節點的掛鉤:
-
NF_IP_PRE_ROUTING:此掛鉤由任何傳入流量觸發。觸發發生在對封包的目的地做出任何路由決策之前。
-
NF_IP_LOCAL_IN:此掛鉤在對傳入封包進行路由後觸發。該封包的目的地還必須是本機系統。
-
NF_IP_FORWARD:此掛鉤也是在對傳入封包進行路由後觸發。然而,只有在封包要被路由到另一個主機時才會觸發。
-
NF_IP_LOCAL_OUT:任何本機傳出流量,一旦進入網路堆疊,就會觸發此掛鉤。
-
NF_IP_POST_ROUTING:此掛鉤由任何在路由發生後、封包到達實體線路之前的傳出/轉發流量觸發。
想要在這些掛鉤上註冊的核心模組必須提供一個優先級數字。此數值有助於確定觸發掛鉤後呼叫它們的順序。這種機制允許有多個模組(不同的模組或同一個模組的多個複本)以確定的順序連接到每個掛鉤。每個模組在處理封包後,都會向 netfilter 框架返回一個決策。
Iptables 中的表與鏈
為了組織其規則, iptables 防火牆使用了「表(tables)」。這些表根據規則所做決策的類型對規則進行分類。例如,如果某條規則涉及 NAT(網路位址轉換),則該規則會被放在 nat 表中。同樣地,如果一條規則是決定是否允許/拒絕封包到達其目的地,它就會被新增到 filter 表中。
在 iptables 的每個表中,規則會被進一步組織在不同的“鏈(chains)”中。表代表它們所包含規則的類型,而鏈則描述了觸發這些規則的 netfilter 掛鉤。簡而言之,鏈決定了何時評估該規則。
以下是 iptables。有趣的是,鏈的名稱也與相關聯的 netfilter 鉤子:
| 鏈 (iptables) | 用途 |
| PREROUTING | NF_IP_PRE_ROUTING |
| INPUT | NF_IP_LOCAL_IN |
| FORWARD | NF_IP_FORWARD |
| OUTPUT | NF_IP_LOCAL_OUT |
| POSTROUTING | NF_IP_POST_ROUTING |
透過使用這些鏈,管理員可以決定在封包傳遞的哪個階段評估規則。由於每個表都包含多個鏈,它也可以在處理過程的多個點上擴展其影響。某些決策僅在網路堆疊的特定點上才有意義。因此,並非每個表都會在每個核心鉤子(kernel hook)上註冊鏈。
The netfilter 框架僅提供 5 個核心鉤子。因此,來自多個表的鏈會註冊在鉤子的每個點上。例如,如果三個鏈擁有 PREROUTING 鏈,那麼它就會註冊到 NF_IP_PRE_ROUTING 鉤子。它們中的每一個都必須提供一個優先級,以決定每個表的 PREROUTING 鏈被呼叫的順序。最高優先級的 PREROUTING 鏈會最先被評估,次高優先級的鏈會第二個被評估,依此類推。
iptables 表
讓我們退一步,來看看 iptables 所提供的表。如前所述,每個表代表不同的規則集,按關注領域進行組織,用於封包評估。
-
filter 表
在 iptables 中, filter 表是最常用的表之一。它用於決定是否允許封包繼續傳送到其目的地。在防火牆術語中,此過程稱為“過濾”封包。
人們在討論防火牆時(在大多數情況下)所指的,正是 filter 表的功能。
-
nat 表
此表實現了規範 NAT 的規則。當封包進入網路堆疊時,此表中描述的規則會決定如何修改封包的來源/目的地地址,從而影響封包的路由以及任何回應流量。
通常, nat 表被用來將封包路由到無法直接存取的網路。
-
mangle 表
此表包含以各種方式修改封包 IP 標頭的規則。例如,它可以透過延長/縮短封包可以承受的有效網路躍點數來修改封包的 TTL(存活時間)值。此外, mangle 表也可以用類似的方式修改其他 IP 標頭。
此表還允許在封包上加上內部核心“標記”(mark),以便其他表和網路工具可以獲取該標記以進行進一步處理。此標記不會影響實際的封包,而是將標記添加到核心對該封包的表示中。
-
raw 表
The iptables 防火牆是有狀態的,這意味著封包是在它們與先前封包的關係上下文中進行評估的。在 netfilter 框架之上開發的連線追蹤功能允許 iptables 將封包視為進行中連線或工作階段的一部分,而不是離散、無關聯的封包流。通常,連線追蹤邏輯會在封包到達網路介面後很快被套用。
The raw 表的功能定義非常狹窄。此表的唯一目的是提供一種標記封包的機制,以便選擇不進行連線追蹤。
-
security 表
The security 表在封包上加上內部 SELinux 安全性內文標記。這進而會影響 SELinux(或任何其他解讀 SELinux 安全性內文的應用程式)處理封包的方式。
SELinux 標記可以基於每個封包或每個連線來套用。
每個表中實現的鏈
到目前為止,我們已經分別討論了表和鏈。是時候來看看每個表中有哪些可用的鏈了。這個主題擴展了關於註冊到同一個鉤子的鏈的評估順序的討論。例如,如果三個表都有 PREROUTING 鏈,會發生什麼事?它們的評估順序是什麼?
接下來,請看以下表格。它指出了每個 iptables 表內可用的鏈。
| PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING | |
|
(路由決策) |
✓ | ||||
|
raw |
✓ | ✓ | |||
|
(已啟用連線追蹤) |
✓ | ✓ | |||
|
mangle |
✓ | ✓ | ✓ | ✓ | ✓ |
|
nat (DNAT) |
✓ | ✓ | |||
|
(路由決策) |
✓ | ✓ | |||
|
filter |
✓ | ✓ | ✓ | ||
|
security |
✓ | ✓ | ✓ | ||
|
nat (SNAT) |
✓ | ✓ |
從左到右閱讀時,它描述了哪些表包含哪些鏈。例如, raw 表同時擁有 PREROUTING 與 OUTPUT 鏈。從上到下閱讀時,它描述了當其關聯的 netfilter 鉤子被觸發時,各個鏈被呼叫的順序。
請注意, nat 表被拆分為 DNAT 操作(修改封包的目的地)與 SNAT 操作(修改封包的來源地),以更清楚地指定它們的順序。該表還包含了進行路由決策以及啟用連線追蹤的表示點。
封包將觸發的鉤子(欄位)取決於封包的性質(傳入/傳出)、所做的路由決策,以及封包是否符合過濾條件。
在處理過程中,某些事件可以跳過表的鏈。例如,只有連線中的第一個封包會根據 nat 表所描述的 NAT 規則進行評估。同一連線中的任何後續封包都將套用相同的 nat 決策,而無需進行任何額外的評估。對 NAT 連線的回應將自動套用反向 NAT 規則,以進行正確的路由。
鏈走訪順序
假設伺服器知道封包路由規則,且防火牆規則允許傳輸,以下流程表示將如何走訪不同的路徑:
-
目的地為本地系統的傳入封包: PREROUTING >> INPUT
-
目的地為其他主機的傳入封包: PREROUTING >> FORWARD >> POSTROUTING
-
本地產生的封包: OUTPUT >> POSTROUTING
總結來說,結合我們目前討論的所有資訊,我們可以看到任何目的地為本地系統的傳入封包都將根據 PREROUTING 鏈(屬於 raw、, mangle、以及 nat 表)進行評估。然後,它將通過 INPUT 鏈(屬於 mangle、, filter、, security、以及 nat 表),最後才到達本地 Socket。
Iptables 規則
這些 iptables 防火牆規則被放置在特定表的特定鏈中。當呼叫某個鏈時,系統將根據該鏈中的每條規則對相關封包進行評估。每條規則包含兩個部分:比對部分和動作部分。
-
比對
規則的比對部分指定了在執行指定動作(或“目標”)之前,封包必須滿足的條件。
比對系統提供了極佳的靈活性。其功能也可以藉由 iptables 擴充功能來進行擴充。可以將規則描述為根據協定類型、來源/目的地位址、來源/目的地連接埠、來源/目的地網路、輸入/輸出介面、標頭、連線狀態和其他條件來比對封包。一條規則也可以結合這些條件,從而產生複雜的規則集以區分不同的流量。
-
目標
目標是當封包符合規則的比對條件時所採取的動作。一般而言,目標分為兩組:
-
-
終止性目標: 它會終止鏈內的評估程序,並將控制權交還給 netfilter 鉤子。根據傳回值,該鉤子將允許封包繼續傳輸或將其丟棄。
-
非終止性目標: 該目標執行某個動作,並繼續進行鏈中的評估。雖然每個鏈都必須經過最終的終止決策,但在這之前可以執行任意數量的非終止性目標。
-
規則中每個目標(target)的可用性取決於上下文。例如,鏈(chain)和表(table)的類型可能會影響目標的可用性。其他可能的原因包括規則中啟用的擴充功能以及比對條件(matching clauses)。
使用者自訂鏈
還有一種特殊的非終止目標:跳轉目標(jump target)。跳轉目標是當評估從一個鏈轉移到另一個鏈以進行額外處理時所執行的動作。到目前為止,我們已經討論了與呼叫它們的 netfilter 鉤子(hooks)緊密相連的內建鏈。然而, iptables 也允許管理員建立自訂鏈。
使用者自訂鏈中的規則也與內建鏈中的規則相似。關鍵區別在於,使用者自訂鏈只能透過從規則“跳轉”到它們來存取。這是因為使用者自訂鏈沒有與任何 netfilter 鉤子(hooks)相關聯。
您可以將使用者自訂鏈視為最初呼叫它們的鏈的延伸。例如,在使用者自訂鏈中,如果評估到達規則清單的末尾,或者比對規則執行了 RETURN 目標,評估將傳回呼叫鏈。有趣的是,使用者自訂鏈也可以將評估“跳轉”到另一個使用者自訂鏈。
此功能為更好的組織奠定了基礎,並為強健的分支提供了必要的框架。
連線追蹤
在討論 raw 表和連線狀態比對條件時,我們討論了在 netfilter 框架之上實現的連線追蹤系統。此功能允許 iptables 在進行中連線的上下文中檢視封包。連線追蹤系統還為 iptables 提供了執行“狀態化”操作所需的功能。
在封包進入網路堆疊後,就會立即套用連線追蹤。raw 表鏈和一些基本的完整性檢查是將封包與連線關聯起來的所有邏輯。
系統會根據一組現有連線檢查每個封包。如果需要,系統將更新現有連線的狀態或建立新連線。在任何 raw 表鏈中被標記為 NOTRACK 目標的封包將繞過進一步的連線追蹤程序。
-
可用狀態
由連線追蹤系統追蹤的連線將被分配以下任一狀態:
-
-
NEW : 當收到一個與現有連線無關、但作為第一個封包並非無效的封包時,系統會為新連線新增此標籤。這適用於連線導向的協定(例如 TCP)和無連線的協定(例如 UDP)。
-
ESTABLISHED: 連線的狀態會從 NEW 更新為 ESTABLISHED ,當它從相反方向收到有效的回應時。對於 TCP 連線,它表示 SYN/ACK。對於 UDP 和 ICMP 流量,它表示原始封包的來源地和目的地對調的回應。
-
RELATED: 不屬於連線的一部分但與已建立連線相關的封包會被標記為 RELATED 。它可以表示輔助連線(例如,在 FTP 資料傳輸連線中),或對其他協定的連線嘗試做出的 ICMP 回應。
-
INVALID: 不屬於已建立連線、被認為不適合開啟新連線、無法識別、不可路由等的封包會被標記為 INVALID.
-
UNTRACKED: 封包可以被標記為 UNTRACKED ,如果它們在 raw 表鏈中被指定以繞過追蹤。
-
SNAT: 它表示當來源位址被 NAT 操作修改時設定的虛擬狀態。它由連線追蹤系統處理,以便在回應封包中轉換來源位址。
-
DNAT: 類似於 SNAT, 它表示當目的地地址被 NAT 操作修改時的虛擬狀態。連接追蹤系統會處理它,以便在路由回覆封包時知道要將目的地地址轉換回來。
-
連接追蹤系統追蹤的這些狀態讓管理員能夠針對連接生命週期中的特定時間點制定特定的規則。它為更徹底、更安全的規則提供了必要的功能。
結語
在 Linux 中, netfilter 架構與 iptables 防火牆是大多數防火牆的基礎。netfilter 鉤子足夠接近網路堆疊,從而能夠對系統處理的封包進行強大的控制。利用這些功能, iptables 防火牆提供了一種靈活的方法來向核心傳達策略需求。
本指南深入探討了 netfilter 架構與 iptables 防火牆的內部結構。此外,它還討論了連接追蹤系統。透過了解這些部分如何協同工作,您可以更好地利用它們來構建更強健、更安全的伺服器環境。
最後,雖然本指南探討了內部運作原理,但請參考這篇關於 設定 iptables 的指南以將其實際應用。此外,您可以了解 UFW 防火牆 如何進一步簡化 iptables。此外,學習如何 列出並刪除 iptables 防火牆規則.
祝您使用愉快!
留言
目前尚無留言。成為第一個留言的人吧。