iptables是基於核心提供的netfilter框架實現的,網路協定棧是分層的,在tcp ip網路模型裡,tcp傳輸層下面的一層就是ip網路層,而netfilter就是工作在ip網路層,通過定義勾點函數,允許使用者程式碼干預資料在協定棧中的過濾邏輯。
在進出ip路由前後,都定義了相關的勾點函數,可以在勾點函數內部加上過濾封包的邏輯,但直接使用netfilter還是比較麻煩,需要寫程式碼。
而iptables則是基於netfilter提供的功能,讓使用者能用設定的方式替代之前直接寫程式碼的操作。可以說它簡化了netfilter的使用。
在看iptables使用規則前,得先明白這5個勾點函數的觸發規則。
PREROUTING:
在進入 IP 路由之前觸發,就意味著只要接收到的封包,無論是否真的發往本機,也都會觸發這個勾點。它一般是用於目標網路地址轉換(Destination NAT,DNAT)。
INPUT:
報文經過 IP 路由後,如果確定是發往本機的,將會觸發這個勾點,它一般用於加工發往本地程序的封包。
FORWARD:
報文經過 IP 路由後,如果確定不是發往本機的,將會觸發這個勾點,它一般用於處理轉發到其他機器的封包。
OUTPUT:
從本機程式發出的封包,在經過 IP 路由前,將會觸發這個勾點,它一般用於加工本地程序的輸出封包。
POSTROUTIN:
從本機網路卡出去的封包,無論是本機的程式所發出的,還是由本機轉發給其他機器的,都會觸發這個勾點,它一般是用於源網路地址轉換(Source NAT,SNAT)
在使用iptables時,能夠在特定的勾點函數上定義一條條規則,而為了更好的管理這些規則,iptables將這些規則按功能進行分類,這樣相同目的的規則就形成了規則表。
我們來看看:
raw 表:
用於去除封包上的連線追蹤機制(Connection Tracking)。
mangle 表:
用於修改封包的報文頭資訊,比如服務型別(Type Of Service,ToS)、生存週期(Time to Live,TTL)。
nat 表:
用於修改封包的源或者目的地址等資訊,典型的應用是網路地址轉換(Network Address Translation)。
filter 表:
用於對封包進行過濾,控制到達某條鏈上的封包是繼續放行、直接丟棄或拒絕(ACCEPT、DROP、REJECT),典型的應用是防火牆。
security 表:
用於在封包上應用SELinux,這張表並不常用。
nat和filter表用的很頻繁,這也是今天分析的重點。
五張表能夠在相應的勾點函數上設定規則,而如果碰到不同表在相同的勾點函數上設定規則,那麼規則誰先誰後呢,這就需要知道表的優先順序順序。
表優先順序:raw→mangle→nat→filter→security。
這裡你要注意,在 iptables 中新增規則時,需要按照規則的意圖指定要存入到哪張表中,如果沒有指定,就預設會存入 filter 表。此外,每張表能夠使用到的勾點函數也有所不同。
有了這些基礎之後,我們再來看看iptables的命令格式:
iptables -t nat 命令 規則鏈 規則
在使用iptables的時候,我們用-t 指定定義的規則是屬於哪張規則表的,如果不指定,則預設是指filter表。 而命令則是說明需要對規則表所進行的操作,比如檢視新增刪除規則鏈。
iptables命令 -L 代表檢視 -A 代表插入到尾部, -D 刪除規則 -F 清空規則
規則鏈則是具體的定義按什麼規則去匹配封包,如篩選出源ip是10.1.0.1的封包,或者目的埠是8080的封包。 規則即是對匹配的封包所做的操作,比如是丟棄還是接受。
這裡我列幾個比較常用的規則;
DROP:直接將封包丟棄。
REJECT:給使用者端返回 Connection Refused 或 Destination Unreachable 報文。
RETURN:跳出當前鏈,該鏈裡後續的規則不再執行。
ACCEPT:同意封包通過,繼續執行後續的規則。
JUMP:跳轉到其他使用者自定義的鏈繼續執行。
REDIRECT:在本機做埠對映。
MASQUERADE:地址偽裝,自動用修改源或目標的 IP 地址來做 NAT。
來看一個實際的iptables的實際使用例子。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
這條命令就代表往nat規則表中新增一條規則,規則在POSTROUTING勾點函數處觸發,規則是將源ip是192.168.10.0/24網段的封包都做一次snat操作。 -s 指定源ip地址或ip網段
iptables -A INPUT -p tcp -s 192.168.10.0/24 -j DROP
上面這條命令沒有用-t引數則說明預設是往filter規則表中新增,規則是在INPUT勾點函數處被觸發,-p 指定匹配的協定,這裡將源ip是192.168.10.0/24網段的tcp協定的封包都丟掉了。-j 指定的就是規則鏈之後的動作。
除了新增內建的規則表中新增規則 ,iptables還允許使用者自定義規則連結串列,這裡將不再深入分析,本文目的僅是簡單的瞭解下iptables的使用,以及能看懂iptables的輸出即可,為後續分析容器網路環境做準備。
知道iptables命令是如何使用之後,我們再來看看iptables是如何檢視主機上的規則,以及如何對規則輸出的結果進行分析。
iptables -nvL
這個命令能直接輸出主機上的filter表的規則鏈,-n 代表不解析ip地址的域名,-v則是能輸出更多的資訊,-L則是檢視命令了。
關於iptables 的命令引數有很多,更多詳細的規則都可以通過man iptables去檢視。
看看輸出結果。
root@master:/home/parallels# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
20M 4214M KUBE-NODEPORTS all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes health check service ports */
293K 23M KUBE-EXTERNAL-SERVICES all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate NEW /* kubernetes externally-visible service portals */
20M 4220M KUBE-FIREWALL all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 FLANNEL-FWD all -- * * 0.0.0.0/0 0.0.0.0/0 /* flanneld forward */
0 0 KUBE-FORWARD all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes forwarding rules */
.......
Chain KUBE-KUBELET-CANARY (0 references)
pkts bytes target prot opt in out source destination
Chain KUBE-NODEPORTS (1 references)
pkts bytes target prot opt in out source destination
輸出的規則按不同規則鏈進行了歸類,除了之前提到的iptables內建的5個規則連結串列,還有一些是自定義的規則鏈,自定義的規則鏈只能通過內建的規則鏈去進行跳轉。
比如這裡的第一行輸出:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
20M 4214M KUBE-NODEPORTS all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes health check service ports */
則表示,匹配所有經過INPUT鏈的封包(source 為0.0.0.0/0 表示任意源ip地址,destination為0.0.0.0/0 表示任意目的ip地址,prot 為all表示任意協定,in out皆為all 表示輸入輸出可以是任意網路裝置,opt則是一些定義規則鏈時候的擴充套件引數,這裡為空) 都將跳轉到KUBE-NODEPORTS這條自定義規則鏈。
pkts 表示經過此規則的包數量,bytes則是經過此規則的包大小,都是累加值。
然後
Chain KUBE-NODEPORTS (1 references)
pkts bytes target prot opt in out source destination
看到KUBE-NODEPORTS 沒有定義規則,則回到上層規則鏈處,繼續執行下一條規則。
通過上面的分析,應該能夠看懂iptables的輸出了,後續我將會結合iptables命令,看看容器環境下,對主機的iptables規則做了哪些改動,敬請期待。