書籍來源:《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所示。
圖1-13 netfilter原理圖
當網卡上收到一個包送達協定棧時,最先經過的鈎子是PREROUTING,可在這裡對資料包進行目的位址轉換(DNAT)。
如果是發送給其他機器,就會經過FORWARD鈎子,可設定包過濾鈎子函數,例如reject函數。
發到協定棧外的包都會經過POSTROUTING鈎子,可在這裡進行源位址轉換(SNAT)或源位址僞裝(Masquerade,簡稱Masq)。
如果是發給本地程序,就會經過INPUT鈎子。
本地程序收到資料包後,回程封包會先經過OUTPUT鈎子,然後經過一次路由決策,最後同樣會經過POSTROUTING鈎子。
netfilter是Linux核心網絡子產品的一個經典架構,如圖1-14所示。
圖1-14 netfilter在Linux網絡中的地位
Kubernetes網絡之間用到的工具就有ebtables、iptables/ip6tables和conntrack,其中iptables是核心。
1.5.2iptables的三闆斧:table、chain和rule
iptables是使用者空間的一個程式,通過netlink和核心的netfilter架構打交道,負責往鈎子上配置回調函數。一般情況下用于建構Linux核心防火牆,特殊情況下也做服務負載均衡。iptables的工作原理如圖1-15所示。
圖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所示。
圖1-16 一個網絡包經過iptables的處理路徑
iptables的規則是使用者真正要書寫的規則。一般包含兩部分資訊:比對條件和動作。比對條件即比對資料包的“捕獲”條件,例如協定類型、源IP、目的IP、源端口、目的端口、連接配接狀态等。
資料包比對後常見的動作有下面幾個:
- DROP:直接丢棄。可以用來模拟當機;
- REJECT:給用戶端傳回一個connection refused或destination unreachable封包,這裡沒有你要的服務内容;
- QUEUE:将資料包放入使用者空間的隊列,供使用者空間的程式處理;
- RETURN:跳出目前鍊,該鍊裡後續的規則不再執行;
- ACCEPT:同意資料包通過,繼續執行後續的規則;
- JUMP:跳轉到其他使用者自定義的鍊繼續執行。
1.5.3iptables的正常武器
接下來以iptables在Kubernetes網絡中的使用為背景,簡單介紹iptables的常見用法。
- 檢視所有iptables規則
Kubernetes一個節點上的iptables規則輸出如下。
使用iptables指令,預設針對filter表操作。是以,如果想輸出nat表的所有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所示。
圖1-17 iptables周遊規則
在我們的例子中,iptables規則的周遊順序應該是rule 1,1→rule 1,2→rule 2,1→rule 2,2→rule 2,3→rule 1,3。
- 配置内置鍊的預設政策
可以配置内置鍊的預設政策,決定是放行還是丢棄,如下所示:
- 配置防火牆規則政策
防火牆預設政策是“全通”,例如上文的policy ACCEPT,就要定義一些政策來封堵;反之,就要定義一些政策來解封。如果是做通路控制清單(ACL),用解封政策更常用。我們将用幾個實際的例子來說明。
1)配置允許SSH連接配接
這條iptables規則的意思是允許源位址是10.20.30.40/24這個網段的包發到本地TCP 22端口。
2)阻止來自某個IP/網段的所有連接配接
如果要阻止10.10.10.10上所有的包,則可以使用以下指令:
也可以使用-j REJECT,這樣就會發一個連接配接拒絕的回程封包,用戶端收到後立刻結束。
3)封鎖端口
要阻止從本地程序對外部1234端口建立連接配接,可以使用以下指令:
如果要阻止外部連接配接通路本地1234端口,指令如下:
4)端口轉發
以上指令的意思是比對eth0網卡上接收到的包,發到TCP 80端口的流量轉發(REDIRECT)給8080端口。
5)禁用PING
大部分的公有雲預設都是屏蔽ICMP的,即禁止ping封包:
6)删除規則
最暴力地清除目前所有的規則指令(請慎用):
要清空特定的表可以使用-t參數進行指定:
删除規則使用iptables的-D參數:
當某條鍊上的規則被全部清除變成空鍊後,可以使用-X參數删除(隻能删除使用者自定義的空鍊):
7)自定義鍊
建立自定義鍊(filter表中建立):
- DNAT
DNAT根據指定條件修改資料包的目标IP位址和目标端口:
- SNAT/ 網絡位址欺騙
SNAT根據指定條件修改資料包的源IP位址:
網絡位址僞裝是一種特殊的源位址轉換,封包從哪個網卡出就用該網卡上的IP位址替換該封包的源位址。下面這條規則的意思是:源位址是10.8.0.0/16的封包都做一次Masq。
- 儲存與恢複
上述方法對iptables規則做出的改變是臨時的,重新開機機器後就會丢失。如果想永久儲存這些更改:
iptables-save在儲存系統所有iptables規則的同時,可以将标準輸出列印重定向到一個檔案:
可以使用iptables-restore指令還原iptables-save指令備份的iptables配置: