netfilter/iptables 簡介


netfilter 是 Linux 內置的一種防火牆機制,我們一般也稱之為數據包過濾機制。iptables 則是一個命令行工具,用來配置 netfilter 防火牆。下圖展示了一個帶有防火牆的簡單網絡拓撲結構:

圖中的 Linux 主機既充當了路由器的角色,同時又充當了防火牆的角色。本文我們將以該拓撲結構介紹 netfilter/iptables 防火牆中的基本概念和主要功能。
說明:本文的演示環境為 ubuntu 16.04。

netfilter 與 iptables 的關系

netfilter 指整個項目,其官網叫 netfilter.org。在這個項目里面,netfilter 特指內核中的 netfilter 框架,iptables 指運行在用戶態的配置工具。

netfilter 在協議棧中添加了一些鈎子,它允許內核模塊通過這些鈎子注冊回調函數,這樣經過鈎子的所有數據包都會被注冊在相應鈎子上的函數所處理,包括修改數據包內容、給數據包打標記或者丟掉數據包等。netfilter 框架負責維護鈎子上注冊的處理函數或者模塊,以及它們的優先級。netfilter 框架負責在需要的時候動態加載其它的內核模塊,比如 ip_conntrack、nf_conntrack、NAT subsystem 等。

iptables 是運行在用戶態的一個程序,通過 netlink 和內核的 netfilter 框架打交道,並負責往鈎子上配置回調函數。

netfilter 防火牆原理

簡單說 netfilter 機制就是對進出主機的數據包進行過濾。 我們可以通過 iptables 設置一些規則(rules)。所有進出主機的數據包都會按照一定的順序匹配這些規則,如果匹配到某條規則,就執行這條規則對應的行為,比如拋棄該數據包或接受該數據包。下圖展示了 netfilter 依據 iptables 規則對數據包過濾的大致過程:

對數據包進行過濾。檢查通過則接受(ACCEPT)數據包進入主機獲取資源,如果檢查不通過,則予以丟棄(DROP)!如果所有的規則都沒有匹配上,就通過默認的策略(Policy)決定數據包的去向。注意,上圖中的規則是有順序的!比如數據包與 rule1 指定的規則匹配,那么這個數據包就會執行 action1 指定的行為,而不會繼續匹配后面的規則了。

下面我們看一個例子。假設我們的 Linux 主機提供了 web 服務,所以需要放行訪問 80 端口的數據包。
但是你發現來自 13.76.1.65 的數據包總是惡意的嘗試入侵我們的 web 服務器,所以需要丟棄來自 13.76.1.65 數據包。
我們的 web 服務器並不提供 web 服務之外的其它服務,所以直接丟棄所有的非 web 請求的數據包。
總結后就是我們需要下面三條規則:

  • rule1 丟棄來自 13.76.1.65 數據包
  • rule2 接受訪問 web 服務的數據包
  • rule3 丟棄所有的數據包

如果我們不小心把上面的規則順序寫錯了,比如寫成了下面的樣子:

  • rule1 接受訪問 web 服務的數據包
  • rule2 丟棄來自 13.76.1.65 數據包
  • rule3 丟棄所有的數據包

這時來自 13.76.1.65 的數據包是可以訪問 web 服務的,因為來自 13.76.1.65 的數據包是符合第一條規則的,所以會被接受,此時就不會再考慮第二條規則了。

iptables 中的 table 與 chain

iptables 用表(table)來分類管理它的規則(rule),這也是 iptables 名稱的由來。根據 rule 的作用分成了好幾個表,比如用來過濾數據包的 rule 就會放到 filter 表中,用於處理地址轉換的 rule 就會放到 nat 表中,其中 rule 就是應用在 netfilter 鈎子上的函數,用來修改數據包的內容或過濾數據包。下面我們簡單的介紹下最常用的 filter 表和 nat 表。
filter
從名字就可以看出,filter 表里面的規則主要用來過濾數據,用來控制讓哪些數據可以通過,哪些數據不能通過,它是最常用的表。
nat
里面的規則都是用來處理網絡地址轉換的,控制要不要進行地址轉換,以及怎樣修改源地址或目的地址,從而影響數據包的路由,達到連通的目的,這是路由器必備的功能。

下圖展示了 iptables 中常用的 tables 及其 rule chains:

從上圖可以看出,filter 和 nat 表中默認都存在着數條 rule chain。也就是說表中的規則(rule)又被編入了不同的鏈(chain),由 chain 來決定什么時候觸發 chain 上的這些規則。
iptables 里面有 5 個內置的 chain:

  • PREROUTING:接收的數據包剛進來,還沒有經過路由選擇,即還不知道數據包是要發給本機還是其它機器。這時會觸發該 chain 上的規則。
  • INPUT:已經經過路由選擇,並且該數據包的目的 IP 是本機,進入本地數據包處理流程。此時會觸發該 chain 上的規則。
  • FORWARD:已經經過路由選擇,但該數據包的目的 IP 不是本機,而是其它機器,進入 forward 流程。此時會觸發該 chain 上的規則。
  • OUTPUT:本地程序要發出去的數據包剛到 IP 層,還沒進行路由選擇。此時會觸發該 chain 上的規則。
  • POSTROUTING:本地程序發出去的數據包,或者轉發(forward)的數據包已經經過了路由選擇,即將交由下層發送出去。此時會觸發該 chain 上的規則。

我們可以通過下圖來理解這五條默認的規則鏈:

從上圖可知,不考慮特殊情況的話,一個數據包只會經過下面三個路徑中的一個:
A,主機收到目的 IP 是本機的數據包
B,主機收到目的 IP 不是本機的數據包
C,本機發出去的數據包

  • 路徑 A,數據包進入 Linux 主機訪問其資源,在路由判斷后確定是向 Linux 主機請求數據的數據包,此時主要是通過 filter 表的 INPUT 鏈來進行控制。
  • 路徑 B,數據包經由 Linux 主機轉發,沒有使用主機資源,而是流向后端主機。在路由判斷之前對數據包進行表頭的修改后,發現數據包需要透過防火牆去后端,此時的數據包就會通過路徑B。也就是說,該封包的目標並非我們的 Linux 主機。該場景下數據包主要經過的鏈是 filter 表的 FORWARD 以及 nat 表的 POSTROUTING 和 PREROUTING。
  • 路徑 C,數據包由 Linux 主機向外發送。比如響應客戶端的請求要求,或者是 Linux 主機主動發送出去的數據包,都會通過路徑 C。它會先進行路由判斷,在確定了輸出的路徑后,再通過 filter 表的 OUTPUT 鏈來傳送。當然,最終還是會經過 nat 表的 POSTROUTING 鏈。

由此我們可以總結出下面的規律。
filter 表主要跟進入 Linux 主機的數據包有關,其 chains 如下:

  • INPUT:主要與想要進入 Linux 主機的數據包有關
  • OUTPUT:主要與 Linux 主機所要發送出去的數據包有關
  • FORWARD:與 Linux 主機沒有關系,它可以對數據包進行轉發


nat(地址轉換) 表主要在進行來源與目的之 IP 或 port 的轉換,其 chains 如下:

  • PREROUTING:在進行路由判斷之前所要執行的規則(DNAT)
  • POSTROUTING:在進行路由判斷之后所要執行的規則(SNAT)
  • OUTPUT:與發送出去的數據包有關

iptables 中的規則(rules)

規則(rules)存放在特定表的特定 chain 上,每條 rule 包含下面兩部分信息:

Matching
Matching 就是如何匹配一個數據包,匹配條件很多,比如協議類型、源/目的IP、源/目的端口、in/out接口、包頭里面的數據以及連接狀態等,這些條件可以任意組合從而實現復雜情況下的匹配。

Targets
Targets 就是找到匹配的數據包之后怎么辦,常見的有下面幾種:

  • DROP:直接將數據包丟棄,不再進行后續的處理
  • RETURN: 跳出當前 chain,該 chain 里后續的 rule 不再執行
  • QUEUE: 將數據包放入用戶空間的隊列,供用戶空間的程序處理
  • ACCEPT: 同意數據包通過,繼續執行后續的 rule
  • 跳轉到其它用戶自定義的 chain 繼續執行

比如下面的規則,只要是來自內網的(192.168.1.0/24)數據包都被接受:

$ sudo iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT

用戶自定義 chains

除了 iptables 預定義的 5 個 chain 之外,用戶還可以在表中定義自己的 chain,用戶自定義的 chain 中的規則和預定義 chain 里的規則沒有區別,不過由於自定義的 chain 沒有和 netfilter 里面的鈎子進行綁定,所以它不會自動觸發,只能從其它 chain 的規則中跳轉過來。比如 docker 就創建了一些自定義的 chain:

總結

netfilter/iptables 是當前 Linux 系統的主要防火牆機制,學習並掌握它可以為我們使用 Linux 系統打下堅實的基礎。本文只是介紹了 netfilter/iptables 的概念和原理,在接下來的文章中,筆者將詳細地介紹 iptables 命令的用法以及典型用例的設置方法。

參考:
netfilter/iptables簡介
Iptables Tutorial
A Deep Dive into Iptables and Netfilter Architecture
《鳥哥的私房菜》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM