前言
虛擬化的網絡可以自由的在本地進行基於單機的網絡配置或者藉助一些互聯技術(underlay、overlay或者點對點技術)在虛擬網絡內部空間實現跨節點和數據中心的網絡互聯,但是如果虛擬網絡內部的服務要對外進行暴露,就不得不借助地址轉換或者端口轉換等數據包修改技術。而在現有的container管理框架中,iptables更是承擔了服務暴露和服務後端負載均衡等功能,是諸如kubernetes、Openshift等平臺上很重要的組成模塊。
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)鏈、表、路由和連接跟蹤的組合關係
關於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
數據包流程
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鏈處理之後由網卡對外發
iptables包處理流程參考:
https://en.wikipedia.org/wiki/File:Netfilter-packet-flow.svg