iptables的使用

2023-03-15 15:01:15

iptables的使用

容器系列文章

容器系列視訊

iptables介紹

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是如何檢視主機上的規則,以及如何對規則輸出的結果進行分析。

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規則做了哪些改動,敬請期待。