介紹
防火牆是一個重要的工具,可以配置來保護您的伺服器和基礎設施。在Linux生態系統中,iptables
是一個廣泛使用的防火牆工具,它與內核的netfilter
封包過濾框架一起工作。由於複雜的語法和涉及的相互關聯部分眾多,創建可靠的防火牆策略可能讓人望而生畏。
在本指南中,我們將深入探討iptables
的架構,旨在使其對需要構建自己的防火牆策略的用戶更加易懂。我們將討論iptables
如何與netfilter
互動,以及各個組件如何結合在一起,提供全面的過濾系統。
什麼是IPTables和Netfilter?
多年來,在Linux中最常用的防火牆軟體被稱為iptables
。在某些發行版中,它已被一個名為nftables
的新工具取代,但iptables
的語法仍然常用作基準。 iptables
防火牆通過與Linux內核網絡堆棧中的封包過濾鉤子進行交互工作。這些內核鉤子被稱為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
防火牆使用表格來組織其規則。這些表格根據規則所做的決策類型進行分類。例如,如果一個規則涉及網絡地址轉換,它將被放置在 nat
表中。如果該規則用於決定是否允許數據包繼續到達其目的地,它可能會被添加到 filter
表中。
在每個 iptables
表中,規則進一步在獨立的 “鏈” 中組織。雖然表格由其保存的規則的一般目的所定義,但內置鏈表示觸發它們的 netfilter
鉤子。鏈確定了規則何時將被評估。
內置鏈的名稱與它們關聯的 netfilter
鉤子的名稱相對應:
PREROUTING
:由NF_IP_PRE_ROUTING
鉤子觸發。INPUT
:由NF_IP_LOCAL_IN
鉤子觸發。FORWARD
:由NF_IP_FORWARD
鉤子觸發。OUTPUT
:由NF_IP_LOCAL_OUT
鉤子觸發。POSTROUTING
:由NF_IP_POST_ROUTING
鉤子觸發。
鏈允許管理員控制規則在數據包傳遞路徑中的評估位置。由於每個表格都有多個鏈,因此表格的影響可以在處理的多個點上施加。由於某些類型的決策只在網絡堆疊的某些點上才有意義,因此每個表格不會在每個內核鉤子上註冊一個鏈。
只有五個netfilter
內核鉤子,所以來自多個表的鏈在每個鉤子上都註冊。例如,三個表都有PREROUTING
鏈。當這些鏈在相應的NF_IP_PRE_ROUTING
鉤子上註冊時,它們指定一個優先順序,該順序決定了每個表的PREROUTING
鏈的呼叫順序。在移動到下一個PREROUTING
鏈之前,將順序評估最高優先級PREROUTING
鏈中的每個規則。我們將稍後查看每個鏈的具體順序。
哪些表是可用的?
讓我們暫時退後一步,看看iptables
提供的不同表。這些代表根據關注的區域組織的一套独特的规则。
過濾表
過濾表是iptables
中使用最廣泛的表之一。過濾表用於決定是否允許數據包繼續到其預定目的地還是拒絕其請求。在防火牆术语中,這被稱為對數據包進行“過濾”。該表提供了人們在討論防火牆時所考慮的大部分功能。
NAT 表
nat
表用於實現網絡地址轉換規則。當封包進入網絡棧時,此表中的規則將決定是否以及如何修改封包的源地址或目的地地址,從而影響封包及任何響應流量的路由方式。這通常用於在直接訪問不可能時將封包路由到網絡。
Mangle 表
mangle
表用於以各種方式修改封包的 IP 標頭。例如,您可以調整封包的 TTL(生存時間)值,從而延長或縮短封包可以支持的有效網絡跳數。其他 IP 標頭可以以類似的方式進行修改。
此表還可以在封包上放置內部核心“標記”,以便在其他表和其他網絡工具中進一步處理。此標記不會觸及實際封包,而是將標記添加到內核對封包的表示中。
原始表
防火牆 iptables
是有狀態的,意味著對於先前的封包會進行評估。建立在 netfilter
框架之上的連接跟蹤功能使得 iptables
能夠將封包視為正在進行的連接或會話的一部分,而不是一系列離散且不相關的封包流。連接跟蹤邏輯通常在封包到達網絡接口後很快應用。
raw
表具有非常狹義的功能。它的唯一目的是提供一種機制,用於標記封包以便退出連接跟蹤。
安全表
security
表用於在封包上設置內部 SELinux 安全上下文標記,這將影響 SELinux 或其他能夠解釋 SELinux 安全上下文的系統如何處理封包。這些標記可以應用於每個封包或每個連接的基礎上。
鏈與表之間的關係
如果三個表都有 PREROUTING
鏈,它們會按照什麼順序進行評估?
以下表格顯示了從左到右讀取時每個iptables
表中可用的鏈。例如,我們可以看到raw
表中有PREROUTING
和OUTPUT
鏈。從上到下讀取時,還顯示了每個鏈在觸發相應的netfilter
鉤子時被呼叫的順序。
A few things should be noted. In the representation below, the nat
table has been split between DNAT
operations (those that alter the destination address of a packet) and SNAT
operations (those that alter the source address) in order to display their ordering more clearly. We have also include rows that represent points where routing decisions are made and where connection tracking is enabled in order to give a more holistic view of the processes taking place:
Tables↓/Chains→ | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
(routing decision) | ✓ | ||||
raw | ✓ | ✓ | |||
(connection tracking enabled) | ✓ | ✓ | |||
mangle | ✓ | ✓ | ✓ | ✓ | ✓ |
nat (DNAT) | ✓ | ✓ | |||
(routing decision) | ✓ | ✓ | |||
filter | ✓ | ✓ | ✓ | ||
security | ✓ | ✓ | ✓ | ||
nat (SNAT) | ✓ | ✓ |
當一個封包觸發一個netfilter
鉤子時,相應的鏈將按照上表中從上到下的順序進行處理。封包觸發的鉤子(列)取決於它是傳入封包還是傳出封包,所做的路由決策以及封包是否通過過濾條件。
某些事件將導致跳過處理表的鏈。例如,只有連接中的第一個封包將根據NAT規則進行評估。對第一個封包做出的任何nat
決策將應用於連接中的所有後續封包,而無需進行額外評估。對NAT連接的回應將自動應用反向NAT規則以正確路由。
鏈遍歷順序
假設服務器知道如何路由封包並且防火牆規則允許其傳輸,在不同情況下將遍歷以下路徑:
- 傳入本地系統的封包:
PREROUTING
->INPUT
- 傳送到另一台主機的傳入封包:
PREROUTING
->FORWARD
->POSTROUTING
- 本地生成的封包:
OUTPUT
->POSTROUTING
如果我們將上述資訊與之前表格中的排序結合起來,我們可以看到,傳入本地系統的封包將首先根據raw
、mangle
和nat
表的PREROUTING
鏈進行評估。然後將遍歷mangle
、filter
、security
和nat
表的INPUT
鏈,最終傳送到本地套接字。
IPTables規則
規則放置在特定表的特定鏈中。當調用每個鏈時,將根據該鏈中的每個規則來檢查所討論的封包。每個規則都有一個匹配組件和一個動作組件。
匹配
規則的匹配部分指定了封包必須滿足的條件,才能執行相應的動作(或”目標”)。
匹配系統非常靈活,可以通過額外的iptables
擴展進一步擴展。規則可以根據協議類型、目的地或來源地址、目的地或來源端口、目的地或來源網絡、輸入或輸出接口、標頭或連接狀態等條件進行匹配。這些條件可以組合起來創建複雜的規則集,以區分不同的流量。
目標
A “target” refers to the actions that are triggered when a packet meets the matching criteria of a rule. Targets are generally divided into two categories:
- 終止目標:終止目標執行一個終止該鏈內部評估並將控制返回給
netfilter
鉤子的動作。根據提供的返回值,鉤子可能會丟棄封包或允許封包繼續進行下一階段的處理。 - 非終止目標:非終止目標執行一個動作並在鏈內部繼續評估。雖然每個鏈最終必須返回最終的終止決策,但可以在此之前執行任意數量的非終止目標。
每個目標在規則中的可用性將取決於上下文。例如,表和鏈的類型可能會決定可用的目標。規則中激活的擴展和匹配條件也可能會影響目標的可用性。
跳轉至用戶定義的鏈
還有一類特殊的非終止目標:跳轉目標。跳轉目標是導致評估轉移到另一個鏈進行附加處理的操作。我們已經介紹了與調用它們的netfilter
鉤子相關聯的內置鏈。然而,iptables
還允許管理員為組織目的創建自己的鏈。
規則可以像放置在內置鏈中一樣放置在用戶定義的鏈中。不同之處在於,只能通過從規則跳轉到它們(它們本身未向netfilter
鉤子註冊)來達到用戶定義的鏈。
用戶定義的鏈充當調用它們的鏈的擴展。例如,在用戶定義的鏈中,如果到達規則列表的末尾或者匹配的規則激活了RETURN
目標,評估將返回到調用鏈。評估還可以跳轉到其他用戶定義的鏈。
此構造允許更好地組織並提供實現更強大分支所需的框架。
IPTables和連接跟蹤
我們在討論 raw
表和連接狀態匹配標準時,介紹了建立在 netfilter
框架上的連接跟踪系統。連接跟踪允許 iptables
在進行連接狀態匹配時對封包做出決策。連接跟踪系統為 iptables
提供執行 “有狀態” 操作所需的功能。
連接跟踪系統在封包進入網絡堆棧後很快就會應用。僅在將封包與連接關聯之前,raw
表鏈和一些健全性檢查是對封包執行的唯一邏輯。
系統會對每個封包檢查一組現有的連接。如果需要,它將更新連接的狀態並在必要時將新連接添加到系統中。在一些 raw
鏈中標記為 NOTRACK
目標的封包將繞過連接跟踪例程。
可用狀態
由連接跟踪系統跟踪的連接將處於以下狀態之一:
NEW
:當到達的封包與現有連接不關聯,但不作為第一個封包無效時,將向系統添加具有此標籤的新連接。這適用於 TCP 等具有連接意識的協議和 UDP 等無連接的協議。已建立
:在反方向接收到有效响应时,连接从新
更改为已建立
。对于TCP连接,这表示SYN/ACK
,而对于UDP和ICMP流量,则表示原始数据包的源和目标已交换的响应。相关
:不属于现有连接但与系统中已有连接相关的数据包被标记为相关
。这可能是辅助连接,如FTP数据传输连接,或可能是其他协议连接尝试的ICMP响应。无效
:如果数据包与现有连接无关,不适合打开新连接,无法识别或无法路由等原因,可以将其标记为无效
。未跟踪
:如果数据包在raw
表链中被选中以绕过跟踪,则可以将其标记为未跟踪
。SNAT
:当源地址通过NAT操作更改时,设置此虚拟状态。这由连接跟踪系统使用,以便在回复数据包中知道要更改源地址。DNAT
:当目标地址通过NAT操作更改时,设置此虚拟状态。这由连接跟踪系统使用,以便在路由回复数据包时知道要更改目标地址。
連接跟踪系統中跟踪的狀態允許管理員制定針對連接生命週期中特定點的規則。這提供了更全面和安全的規則所需的功能。
結論
netfilter
封包過濾框架和iptables
防火牆是Linux伺服器上大多數防火牆解決方案的基礎。netfilter
內核鉤子與網絡堆疊足夠接近,可以在系統處理封包時對其進行強大的控制。iptables
防火牆利用這些功能,向內核提供了一種靈活、可擴展的通信策略需求方法。通過了解這些組件如何配合,您可以更好地利用它們來控制和保護您的伺服器環境。
如果您想了解有關如何選擇有效的iptables
策略的更多信息,請查看本指南。
以下指南可以幫助您開始實施iptables
防火牆規則: