1. 程式人生 > >kubernetes系列之二:iptables概覽

kubernetes系列之二:iptables概覽

一、前言

在基於虛擬化的雲系統中,網路虛擬化是不可或缺的關鍵部分。虛擬化的網路可以自由的在本地進行基於單機的網路配置或者藉助一些互聯技術(underlay、overlay或者點對點技術)在虛擬網路內部空間實現跨節點和資料中心的網路互聯,但是如果虛擬網路內部的服務要對外進行暴露,就不得不借助地址轉換或者埠轉換等資料包修改技術。而在現有的container管理框架中,iptables更是承擔了服務暴露和服務後端負載均衡等功能,是諸如kubernetes、Openshift等平臺上很重要的組成模組。

轉載自https://blog.csdn.net/cloudvtech

二、iptables基本概念

1.iptables的chain、table和rule

iptables基本概念包括五個鏈、四個表和若干規則。鏈由一些列規則組成、表則由一系列鏈組成。

五個鏈分別是PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

四個表分別是filter、nat、mangle、raw

4個表的優先順序由高到低的順序為:raw > mangle > nat > filter

2. 四個表的功能特點

  • filter表:匹配資料包以進行過濾
  • nat表:修改資料包進行地址或者埠的轉換
  • mangle表:用於修改資料包IP頭資訊中TOS、TTL、或者對資料包進行Mark以實現QoS或者特定路由策略
  • raw表:不經過iptables的狀態跟蹤功能而進行快速處理(iptables是一個有狀態的系統,會在raw表之後mangle表之前,對資料包進行connection tracking,而由於raw表是優先順序最高的表,資料包如果滿足raw表的內容匹配之後,便不會再經過後續connection tracking和地址埠轉換等操作,可以提高特定型別包的處理效率)

3. 五個鏈的功能特點

  • PREROUTING,作用在資料包進入核心網路模組之後,獲得路由之前
  • INPUT,作用在資料包被決定路由到本機之後
  • FORWARD作用在資料包被決定路由到其他主機之後
  • OUTPUT作用在離開本機的資料包進入核心網路模組之後
  • POSTROUTING作用在對於離開本機或者FORWARD的資料包,當資料包被髮送到網路之後

4. 鏈、表、路由和連線跟蹤的組合關係


轉載自https://blog.csdn.net/cloudvtech

三、關於connection tracking

很多iptables的功能需要藉助connection tracking實現,所以當資料包經過iptables在raw表處理之後mangle表處理之前,會進行connection tracking處理,從iptables的connection tracking

機制可以得知當前資料包所對應的連線的狀態:

  • NEW,該包請求一個新連線,現在沒有對應該資料包的連線
  • ESTABLISHED,資料包已經屬於某個連線
  • RELATED,資料包已經屬於某個連線,但是又請求一個新連線
  • INVALID,資料包不屬於任何連線

/proc/net/ip_conntrack裡面儲存了所有被跟蹤的連線,單個紀錄如下:

tcp 4 202713 ESTABLISHED src=192.168.166.103 dst=192.168.166.101 sport=3377 dport=11232 packets=22 bytes=17720 src=192.168.166.101 dst=192.168.166.103 sport=11232 dport=22 packets=92 bytes=4490 [ASSURED] mark=0 secmark=0 use=1

可以通過ip_conntrack_max和ip_conntrack timeout來調整系統connection tracking的能力:

net.ipv4.ip_conntrack_max =
net.ipv4.netfilter.ip_conntrack_max =
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established =
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait =
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait =
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait =

可以在raw表裡面設定-j NOTRACK跳過其它表和connection tracking處理,比如:

iptables -t raw -A PREROUTING -d A.B.C.D -p tcp --dport 80 -j NOTRACK

轉載自https://blog.csdnet/cloudvtech四、資料包流程

1.進入的資料包

在資料包由網絡卡進入協議棧之後,會依次經由raw、connectiong tracking、mangle、nat三個表的PREROUTING鏈進行處理,並進行路由選擇。路由結果如果是給本機的,則經由mangle、filter兩個表的INPUT鏈處理之後發給上層應用程式;如果是要轉發給其它主機的,則會經過mangle、filter兩個表的FORWAR鏈處理之後,再經由mangel、nat表的POSTROUTING鏈處理之後由網絡卡對外發送

2.出去的資料包

資料包由上層應用程式進入協議棧之後現進行路由選擇,然後經由raw、connectiong tracking、mangle、nat、filter表的OUTPUT鏈的處理,再經由mangel、nat表的POSTROUTING鏈處理之後由網絡卡對外發

3.更詳細的iptables包處理流程請參看下圖


轉載自https://blog.csdn.net/cloudvtech