天天看點

《Kubernetes網絡權威指南》讀書筆記 | iptables

作者:熱愛程式設計的通信人

書籍來源:《Kubernetes網絡權威指南:基礎、原理與實踐》

一邊學習一邊整理讀書筆記,并與大家分享,侵權即删,謝謝支援!

附上彙總貼:《Kubernetes網絡權威指南》讀書筆記 | 彙總_COCOgsta的部落格-CSDN部落格

iptables在Docker和Kubernetes網絡中應用甚廣。例如,Docker容器和主控端的端口映射、Kubernetes Service的預設模式、CNI的portmap插件、Kubernetes網絡政策等都是通過iptables實作的。

1.5.1 祖師爺netfilter

iptables的底層實作是netfilter。netfilter的架構就是在整個網絡流程的若幹位置放置一些鈎子,并在每個鈎子上挂載一些處理函數進行處理。

IP層的5個鈎子點的位置,對應iptables就是5條内置鍊,分别是PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD。netfilter原理圖如圖1-13所示。

《Kubernetes網絡權威指南》讀書筆記 | iptables

圖1-13 netfilter原理圖

當網卡上收到一個包送達協定棧時,最先經過的鈎子是PREROUTING,可在這裡對資料包進行目的位址轉換(DNAT)。

如果是發送給其他機器,就會經過FORWARD鈎子,可設定包過濾鈎子函數,例如reject函數。

發到協定棧外的包都會經過POSTROUTING鈎子,可在這裡進行源位址轉換(SNAT)或源位址僞裝(Masquerade,簡稱Masq)。

如果是發給本地程序,就會經過INPUT鈎子。

本地程序收到資料包後,回程封包會先經過OUTPUT鈎子,然後經過一次路由決策,最後同樣會經過POSTROUTING鈎子。

netfilter是Linux核心網絡子產品的一個經典架構,如圖1-14所示。

《Kubernetes網絡權威指南》讀書筆記 | iptables

圖1-14 netfilter在Linux網絡中的地位

Kubernetes網絡之間用到的工具就有ebtables、iptables/ip6tables和conntrack,其中iptables是核心。

1.5.2iptables的三闆斧:table、chain和rule

iptables是使用者空間的一個程式,通過netlink和核心的netfilter架構打交道,負責往鈎子上配置回調函數。一般情況下用于建構Linux核心防火牆,特殊情況下也做服務負載均衡。iptables的工作原理如圖1-15所示。

《Kubernetes網絡權威指南》讀書筆記 | iptables

圖1-15 iptables的工作原理

我們常說的iptables 5X5,即5張表(table)和5條鍊(chain)。5條鍊即iptables的5條内置鍊,對應上文介紹的netfilter的5個鈎子。這5條鍊分别是:

  • INPUT鍊:處理輸入本地程序的資料包;
  • OUTPUT鍊:處理本地程序的輸出資料包;
  • FORWARD鍊:處理轉發到其他機器/network namespace的資料包;
  • PREROUTING鍊:進行DNAT;
  • POSTROUTING鍊:進行SNAT。

5張表如下所示。

  • filter表:控制資料包是放行、丢棄(drop)或拒絕(reject);
  • nat表:修改資料包的源和目的位址;
  • mangle表:修改資料包的IP頭資訊;
  • raw表:iptables對資料包有連接配接追蹤(connection tracking)機制,而raw是用來去除這種追蹤機制的;
  • security表:不常用。

這5張表的優先級從高到低是:raw、mangle、nat、filter、security。

如果我們擴充圖1-13,給它加上iptables的5張表,那麼一個網絡包經過iptables的處理路徑如圖1-16所示。

《Kubernetes網絡權威指南》讀書筆記 | iptables

圖1-16 一個網絡包經過iptables的處理路徑

iptables的規則是使用者真正要書寫的規則。一般包含兩部分資訊:比對條件和動作。比對條件即比對資料包的“捕獲”條件,例如協定類型、源IP、目的IP、源端口、目的端口、連接配接狀态等。

資料包比對後常見的動作有下面幾個:

  • DROP:直接丢棄。可以用來模拟當機;
  • REJECT:給用戶端傳回一個connection refused或destination unreachable封包,這裡沒有你要的服務内容;
  • QUEUE:将資料包放入使用者空間的隊列,供使用者空間的程式處理;
  • RETURN:跳出目前鍊,該鍊裡後續的規則不再執行;
  • ACCEPT:同意資料包通過,繼續執行後續的規則;
  • JUMP:跳轉到其他使用者自定義的鍊繼續執行。

1.5.3iptables的正常武器

接下來以iptables在Kubernetes網絡中的使用為背景,簡單介紹iptables的常見用法。

  1. 檢視所有iptables規則

Kubernetes一個節點上的iptables規則輸出如下。

《Kubernetes網絡權威指南》讀書筆記 | iptables

使用iptables指令,預設針對filter表操作。是以,如果想輸出nat表的所有iptables規則,可以使用如下指令:

《Kubernetes網絡權威指南》讀書筆記 | iptables

使用-n選項将以數字形式列出資訊,即将域名解析成IP位址。想輸出更詳細的資訊,可以使用-v選項。

從上面的輸出結果可以看出,filter表上挂了5條鍊,分别是INPUT、FORWARD和OUTPUT這三條系統内置鍊,以及KUBE-FIREWALL和KUBE-FORWARD這兩條使用者自定義鍊。

iptables的内置鍊都有預設規則,INPUT、FORWARD和OUTPUT的預設規則是ACCEPT,即全部放行。使用者自己定義的鍊,KUBE-FIREWALL和KUBE-FORWARD,後面都有一個引用計數,它們分别在INPUT和FORWARD中被引用。

iptables的每條鍊下面的規則處理順序是從上到下逐條周遊的。如果這條規則的動作是JUMP,則跳到這條鍊周遊其下的所有規則,然後跳回來周遊原來那條鍊後面的規則。以上過程如圖1-17所示。

《Kubernetes網絡權威指南》讀書筆記 | iptables

圖1-17 iptables周遊規則

在我們的例子中,iptables規則的周遊順序應該是rule 1,1→rule 1,2→rule 2,1→rule 2,2→rule 2,3→rule 1,3。

  1. 配置内置鍊的預設政策

可以配置内置鍊的預設政策,決定是放行還是丢棄,如下所示:

《Kubernetes網絡權威指南》讀書筆記 | iptables
《Kubernetes網絡權威指南》讀書筆記 | iptables
  1. 配置防火牆規則政策

防火牆預設政策是“全通”,例如上文的policy ACCEPT,就要定義一些政策來封堵;反之,就要定義一些政策來解封。如果是做通路控制清單(ACL),用解封政策更常用。我們将用幾個實際的例子來說明。

1)配置允許SSH連接配接

《Kubernetes網絡權威指南》讀書筆記 | iptables

這條iptables規則的意思是允許源位址是10.20.30.40/24這個網段的包發到本地TCP 22端口。

2)阻止來自某個IP/網段的所有連接配接

如果要阻止10.10.10.10上所有的包,則可以使用以下指令:

《Kubernetes網絡權威指南》讀書筆記 | iptables

也可以使用-j REJECT,這樣就會發一個連接配接拒絕的回程封包,用戶端收到後立刻結束。

3)封鎖端口

要阻止從本地程序對外部1234端口建立連接配接,可以使用以下指令:

《Kubernetes網絡權威指南》讀書筆記 | iptables

如果要阻止外部連接配接通路本地1234端口,指令如下:

《Kubernetes網絡權威指南》讀書筆記 | iptables

4)端口轉發

《Kubernetes網絡權威指南》讀書筆記 | iptables

以上指令的意思是比對eth0網卡上接收到的包,發到TCP 80端口的流量轉發(REDIRECT)給8080端口。

5)禁用PING

大部分的公有雲預設都是屏蔽ICMP的,即禁止ping封包:

《Kubernetes網絡權威指南》讀書筆記 | iptables

6)删除規則

最暴力地清除目前所有的規則指令(請慎用):

《Kubernetes網絡權威指南》讀書筆記 | iptables

要清空特定的表可以使用-t參數進行指定:

《Kubernetes網絡權威指南》讀書筆記 | iptables

删除規則使用iptables的-D參數:

《Kubernetes網絡權威指南》讀書筆記 | iptables

當某條鍊上的規則被全部清除變成空鍊後,可以使用-X參數删除(隻能删除使用者自定義的空鍊):

7)自定義鍊

建立自定義鍊(filter表中建立):

《Kubernetes網絡權威指南》讀書筆記 | iptables
  1. DNAT

DNAT根據指定條件修改資料包的目标IP位址和目标端口:

《Kubernetes網絡權威指南》讀書筆記 | iptables
  1. SNAT/ 網絡位址欺騙

SNAT根據指定條件修改資料包的源IP位址:

《Kubernetes網絡權威指南》讀書筆記 | iptables

網絡位址僞裝是一種特殊的源位址轉換,封包從哪個網卡出就用該網卡上的IP位址替換該封包的源位址。下面這條規則的意思是:源位址是10.8.0.0/16的封包都做一次Masq。

《Kubernetes網絡權威指南》讀書筆記 | iptables
  1. 儲存與恢複

上述方法對iptables規則做出的改變是臨時的,重新開機機器後就會丢失。如果想永久儲存這些更改:

《Kubernetes網絡權威指南》讀書筆記 | iptables

iptables-save在儲存系統所有iptables規則的同時,可以将标準輸出列印重定向到一個檔案:

《Kubernetes網絡權威指南》讀書筆記 | iptables

可以使用iptables-restore指令還原iptables-save指令備份的iptables配置:

《Kubernetes網絡權威指南》讀書筆記 | iptables