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的數據包,這里面就有了 input 和 output的概念 ,在iptables中的名詞是鏈,也就是 四表五鏈中的五鏈之二,對于 四表五鏈,后面會詳細的講解。
上面的描述僅僅是邏輯的一種抽象表達,因為發起者也有可能不是客戶端而是其他的服務器,當本機開啟了ip_forward功能,就具備了路由轉發功能,這個時候就會用到iptables 四表五鏈 中的 PREROUTING、FORWARD、POSTROUTING。
當開啟了防火墻的時候,數據報文會經過以下的步驟完成,根據實際場景的改變,經過的鏈也會有所改變。
當數據報文不需要轉發的時候,會進入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做了分類管理,而這個功能就是我們上面提到的四表五鏈中的四表,所有的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
如下圖:
其實我們還需要注意一點,因為數據包經過一個”鏈”的時候,會將當前鏈的所有規則都匹配一遍,但是匹配時總歸要有順序,我們應該一條一條的去匹配,而且我們說過,相同功能類型的規則會匯聚在一張”表”中,那么,哪些”表”中的規則會放在”鏈”的最前面執行呢,這時候就需要有一個優先級的問題,我們還拿prerouting”鏈”做圖示。
另外需要注意的是,數據報文經過鏈的時候,會順序匹配所有rule,那么這里就會涉及到優先級的問題,哪些表的rule會先于鏈被執行?到底誰先被執行?
請看下圖:
如上所述,PREROUTING鏈可以被調用的是這三張表,其優先級是 raw --> mangle --> nat。
但是我們知道iptables的表是四張,當他們同時被應用在一個鏈的時候,優先級如下圖:
但是,如上述所言,某些鏈的rule不能被應用到某些表,所以,你要知道,當前能被四表調用的鏈只有OUTPUT鏈。
為了便于管理,可以在表中自定義鏈,把自己需要的rule放在這個自定義鏈中,但是要注意的是,這個鏈不能被表直接調用,而是在某個默認鏈將這個鏈引用,也就是在五鏈之一中的某個鏈中配置成動作才會生效。
iptables工作流程
下圖是數據包通過iptables的流程:
上圖描述的工作流程:
根據路由匹配發送給服務進程的數據包
- 數據包由客戶端發送到網卡,然后由網卡傳入內核態中的prerouting鏈,在raw、mangle、nat表 由上到下的順序對rule進行匹配,對數據包處理完成后,經過路由判斷,確定發送目標地址為本機的服務進程,進入input鏈,在mangle、nat、filter表 由上到下的順序對rule進行匹配,然后對數據包進行處理后,交由用戶空間的服務進程對數據包進行處理。
- 當數據包在用戶空間的服務進程處理完成后,由本機作為源地址根據路由判斷將數據包經由output鏈對raw、mangle、nat、filter由上到下的順序對rule進行匹配,對數據包進行處理,送由postrouting鏈,在mangle、nat表由上到下的順序對rule進行匹配,根據匹配rule對數據包進行最后的封裝處理,離開內核空間,經由網卡,返回給客戶端。
根據路由匹配發送給其他服務器的數據包
- 數據包由客戶端發送到網卡,然后傳入內核態中的prerouting鏈,在raw、mangle、nat表 由上到下的順序對rule進行匹配,對數據包處理完成后,經過路由判斷,如果不是發送本機的服務進程的數據包,則由forward鏈,在mangle、filter鏈由上到下的順序對rule進行匹配,對數據包進行處理。
- 當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思想對自動化運維改革的大道上,一直砥礪前行,從未停歇。
本文轉載自微信公眾號「Kubernetes技術?!梗梢酝ㄟ^以下二維碼關注。轉載本文請聯系Kubernetes技術棧公眾號。