1. 程式人生 > 其它 >Linux防火牆iptables之概念篇

Linux防火牆iptables之概念篇

  • 為什麼要學Linux防火牆?當你所在公司,出於安全原因,想上防火牆,而各大雲廠商雲防火牆和硬體防火牆費用及其昂貴,出於成本考慮,此時Linux的防火牆就是最好的解決方案,如果有較高且複雜的防護需求時,也可以考慮上開源的WAF,如OpenResty、OpenWAF等,這裡就不過多敘述了,可以自行谷歌瞭解。
  • Docker底層的網路轉發是通過Linux核心模組netfilter/iptables完成工作的,以及流行編排工具Kubernetes的各個網路外掛也是,如果對iptables的理解不夠深入以及操作不熟練的話,那麼在排查網路、路由問題的時候,必然會困難重重。所以學好netfilter/iptables,必將事半功倍。

netfilter/iptables是什麼?

netfilter/iptables 是在Linux下工作的免費防火牆,完成拆包、過濾、封包、重定向、網路地址轉換(NAT)等功能。相比各大廠商昂貴的硬體防火牆來比,它是當前最完善最穩定的防火牆解決方案。

Linux的iptables只是作為核心netfilter的代理,轉儲rule,真正完成安全防護功能的是位於核心空間中的netfilter模組。

iptables只是作為使用者操作的一個記錄、更新、刪除rule的使用工具。

iptables中最核心的是 四表五鏈,所有rule動作都是基於 四表五鏈 操作核心模組netfilter完成工作的。

對於ubuntu的ufw,是基於iptables封裝的一層及其友好的操作命令,會在第二篇 Linux防火牆iptables之Kubernetes篇

中,做延伸講解。

為了更好的理解iptables原理與實踐,引入Kubernetes作為演示案例,以圖文形式循序漸進的來講解iptables在Kubernetes中是怎樣完成工作的。

此篇主要是通過圖文形式講解iptables的四表五鏈對應關係、工作過程以及相關名詞,用於瞭解iptables的整體概念。

iptables 基礎

我們都知道iptables是按照rule來工作的,rule其實就是操作人員預定義的條件,rule一般的定義為: "如果資料包符合條件,就對對應的資料進行操作"。rule存放在核心空間的資訊包filter表中,這些規則包括了源地址、目標地址、源埠、目標埠、傳輸協議(如ICMP/UDP/TCP)與服務協議(HTTP/FTP/SSH)等。當資料包與rule匹配時,iptables會根據rule定義的條件來處理對應的資料包,比如accept/rejct/drop等操作,用於對防火牆rule的新增、修改、刪除等。

如果僅僅通過上述就可以理解netfilter/iptables,那是基本不可能的,因為iptables的抽象層級還是非常高的,為了能很好的理解netfilter/iptables,我們簡單的舉個栗子來理解。

當客戶端訪問伺服器的某個服務的時候,首先是客戶端傳送資料報文到網絡卡,而TCP/IP協議棧是屬於核心的一部分,客戶端的資訊會通過核心的TCP協議傳輸給使用者空間(使用者態)的某服務程序,此時,客戶端的資料報文到目標地址為服務所監聽的套接字IP地址:埠上,服務響應客戶端請求時,會發出響應資料報文的目標地址是客戶端,也就是說目標地址轉換成了源地址。上面已經提過,netfilter是防火牆的核心工作模組,工作在Linux核心中,想讓防火牆達到防護的功能,就需要對核心中的netfilter配置對應的攔截rule,可以理解為檢查站。所有進出的資料報文必須經過檢查站,經過rule篩選後,放行符合rule的資料包,攔截拒絕rule的資料包,這裡面就有了 inputoutput的概念 ,在iptables中的名詞是,也就是 四表五鏈中的五鏈之二,對於 四表五鏈,後面會詳細的講解。

上面的描述僅僅是邏輯的一種抽象表達,因為發起者也有可能不是客戶端而是其他的伺服器,當本機開啟了ip_forward功能,就具備了路由轉發功能,這個時候就會用到iptables 四表五鏈 中的 PREROUTINGFORWARDPOSTROUTING

當開啟了防火牆的時候,資料報文會經過以下的步驟完成,根據實際場景的改變,經過的鏈也會有所改變。

當資料報文不需要轉發的時候,會進入input鏈到使用者空間經過服務處理完成後,然後在由output鏈通過postrouting鏈返回目標地址。如果資料報文需要轉發的時候,會直接在核心中通過forward鏈完成轉發動作,經由output鏈直接將資料報文送向目標地址。

由上圖可以看出來,四表五鏈中的五鏈完整的的工作過程。

  • 由當前主機轉發資料報文: prerouting –> forward –> postrouting

  • 進入當前主機,到達使用者空間的服務程序資料報文: prerouting –> input

  • 由當前主機中的使用者空間服務程序處理的資料報文: output –> postrouting

什麼是鏈?

通過上述已經瞭解到,iptables是對經過的資料報文匹配rule,然後執行對應的操作,當資料報文經過檢查站的時候,必須匹配當前檢查站的rule,而每個檢查站中存在的不是一個rule,而是由多個rule組成,當所有rule被應用執行的時候,就形成了鏈。每個鏈經過的資料報文都會以順序匹配對應rule,對符合條件的做對應的操作,如下圖所示。

什麼是表?

通過上述已經瞭解到了什麼是鏈,而且也瞭解到每個鏈是對n+1的rule做匹配與資料報文處理,那麼我們現在想要實現另外一個功能,比如rule1是修改資料報文,rule2是對IP埠做開放或限制,這個時候,我們就用到了iptables中的功能。iptables的其實就是把不同功能的rule做了分類管理,而這個功能就是我們上面提到的四表五鏈中的四表,所有的規則都是由以下的四表歸類管理。

filter 負責過濾功能。

模組: iptables_filter

nat 網路地址轉換。

模組:iptable_nat

mangle 對資料報文拆解、修改、重新封裝的功能;

模組: iptable_mangle

raw 關閉nat表上啟用的連線追蹤機制

模組: iptable_raw

鏈與表的關係

首先要知道,某些鏈並不是萬能的,它可能不具備你需要的功能,所以這個時候,必須要了解每個鏈上的rule與每個表的對應關係。

如下圖,來看看filter表支援哪些鏈?

上圖的意思其實就是說 filler表 所具備的功能可以被應用的鏈被限定為input foward output

綜上所述,我們可以總結一下表鏈之間的關係:

Filter 可以被應用的鏈為 INPUT、FORWARD、OUTPUT。

Nat 可以被應用的鏈為OUTPUT、PREROUTING、POSTROUTING

Mangle 可以被用應用在所有鏈:INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING。

Raw 可以被應用的鏈為OUTPUT、PREROUTING

如下圖:

為了更好的理解,換個思路在理解一下對應關係,哪些鏈的rule可以被哪些表呼叫?

INPUT 可以呼叫的表:mangle、filter

OUTPUT 可以呼叫的表:raw、mangle、nat、filter

PREROUTING 可以呼叫的表:raw、mangle、nat

FORWARD 可以呼叫的表:mangle、filter。

POSTROUTING 可以呼叫的表:mangle、nat

如下圖:

另外需要注意的是,資料報文經過鏈的時候,會順序匹配所有rule,那麼這裡就會涉及到優先順序的問題,哪些表的rule會先於鏈被執行?到底誰先被執行?

請看下圖:

如上所述,PREROUTING鏈可以被呼叫的是這三張表,其優先順序是 raw --> mangle --> nat

但是我們知道iptables的表是四張,當他們同時被應用在一個鏈的時候,優先順序如下圖:

但是,如上述所言,某些鏈的rule不能被應用到某些表,所以,你要知道,當前能被四表呼叫的鏈只有OUTPUT鏈。

為了便於管理,可以在表中自定義鏈,把自己需要的rule放在這個自定義鏈中,但是要注意的是,這個鏈不能被表直接呼叫,而是在某個預設鏈將這個鏈引用,也就是在五鏈之一中的某個鏈中配置成動作才會生效。

iptables工作流程

下圖是資料包通過iptables的流程:

上圖描述的工作流程:

根據路由匹配發送給服務程序的資料包

  1. 資料包由客戶端傳送到網絡卡,然後由網絡卡傳入核心態中的prerouting鏈,在raw、mangle、nat表 由上到下的順序對rule進行匹配,對資料包處理完成後,經過路由判斷,確定傳送目標地址為本機的服務程序,進入input鏈,在mangle、nat、filter表 由上到下的順序對rule進行匹配,然後對資料包進行處理後,交由使用者空間的服務程序對資料包進行處理。
  2. 當資料包在使用者空間的服務程序處理完成後,由本機作為源地址根據路由判斷將資料包經由output鏈對raw、mangle、nat、filter由上到下的順序對rule進行匹配,對資料包進行處理,送由postrouting鏈,在mangle、nat表由上到下的順序對rule進行匹配,根據匹配rule對資料包進行最後的封裝處理,離開核心空間,經由網絡卡,返回給客戶端。

根據路由匹配發送給其他伺服器的資料包

  1. 資料包由客戶端傳送到網絡卡,然後傳入核心態中的prerouting鏈,在raw、mangle、nat表 由上到下的順序對rule進行匹配,對資料包處理完成後,經過路由判斷,如果不是傳送本機的服務程序的資料包,則由forward鏈,在mangle、filter鏈由上到下的順序對rule進行匹配,對資料包進行處理。
  2. forwanrd鏈對資料包處理完成後,送由postrouting鏈,在mangle、nat表由上到下的順序rule匹配,對資料包進行最後封裝處理,離開核心空間,經由網絡卡,傳送給其他伺服器。

當把上述圖以及流程理解透徹了,這個時候,你對iptables的工作流程已經完全掌握了,在後續的實踐操作中可以靈活的應用各種rule了。

什麼是rule?

在上述中四表五鏈中提的rule的時候,都是簡單的一帶而過,現在我們來詳細的說下什麼是rule,rule其實就是根據既定條件匹配每個鏈經過的資料報文,當匹配到對應的rule以後,則由匹配的rule配置好的相關動作來處理對應的操作。

其實簡單來講,就如上訴所言iptables每條鏈都是一個檢查站,每個通過檢查站的資料報文都要在此處經過rule規則處理一遍,如果匹配,則對資料報文進行對應的操作。比如:此時rule配置中對80埠開放了通行規則,而沒有對443開放,這個時候倆個帶有標記的資料報文在進入檢查站的時候,80會匹配對應的規則而被放行,進入到目標地址,經過資料的拆包、封裝等處理之後返回給客戶端。而443不在放行規則內,則會被丟棄。這裡的80、443是rule當中的一種條件,而放行、拒絕則是rule匹配之後對應的動作,也就是說,條件+動作組成了相應的規則。

匹配條件

匹配條件分為基本匹配條件與擴充套件匹配條件。

  1. 基本匹配條件

    源地址 Source IP

    目標地址 Destination IP

  2. 擴充套件匹配條件:

    除了基本匹配條件之外,還有名詞為擴充套件匹配條件,這些屬於netfilter中的一部分,只是以模組形式存在,如果想使用對應的擴充套件匹配條件,需要依賴對應的擴充套件模組。

    源地址 Source IP:Port

    目標地址 Destination IP:Port

處理動作

處理動作在iptables中名詞為target,動作分為基本動作和擴充套件動作。

ACCEPT 允許資料包通過。

DROP 直接丟棄資料包,不返回任何迴應資訊,只對超時時間才有迴應資訊。

REJECT 拒絕資料包通過,必要時會給資料傳送端一個響應的資訊,客戶端剛請求就會收到拒絕的資訊。

SNAT 對源地址做出轉換,用於內網使用者用同一個公網地址上網。

MASQUERADE 是SNAT的一種特殊形式,適用於動態的IP上。

DNAT 目標地址轉換。

REDIRECT 在本機埠轉發、對映。

LOG 只是記錄對應的資料包傳遞過程的日誌,不對資料報文做任何動作,用於審計與DEBUG。

  • 本文對iptables中四表五鏈的對應關係、工作流程通過圖文的形式做了詳細講解,也對相關名詞做了簡要的描述,讀完的同學,對iptables的概念基本瞭解清楚了,下一篇 Linux防火牆iptables之Kubernetes篇 中,會引入Kubernetes作為案例使大家對iptables有更為詳細深入的理解。
  • 本文提及到核心態到使用者態程序之間切換涉及到的知識點,並沒有深入講解,後面會單獨出一個對核心以圖文方式由淺入深講解的文章,敬請期待。

在基於DevOps思想對自動化運維改革的大道上,一直砥礪前行,從未停歇。

道阻且長,行則將至,行而不輟,未來可期。

歡迎搜尋 k8stech 關注公眾號 Kubernetes技術棧,定時更新關於運維開發、雲原生、SRE等文章。