最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一文詳解netfilter框架

2022-09-24 15:55 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

1. 掛接點(diǎn)(hooknum)

netfilter是Linux2.4/2.6內(nèi)核中自帶的防火墻架構(gòu),定義了5個(gè)掛接點(diǎn):

netfilter定義了一個(gè)二維的鏈表頭數(shù)組struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS]來表示所有協(xié)議族的各個(gè)掛接點(diǎn),NPROTO值為32,可表示linux所支持所有32個(gè)協(xié)議族(include/linux/socket.h文件中定義),也就是使用socket(2)函數(shù)的第一個(gè)參數(shù)的值,如互聯(lián)網(wǎng)的TCP/IP協(xié)議族PF_INET(2)。每個(gè)協(xié)議族有NF_MAX_HOOKS(8)個(gè)掛接點(diǎn),但實(shí)際只用了如上所述的5個(gè),數(shù)組中每個(gè)元素表示一個(gè)協(xié)議族在一個(gè)掛接點(diǎn)的處理鏈表頭,。

以下分析使用2.4.26內(nèi)核中的netfilter代碼。

在IPv4(PF_INET協(xié)議族)下,各掛接點(diǎn)定義在:

NF_IP_PRE_ROUTING,在IP棧成功接收sk_buff包后處理,掛接點(diǎn)在在net/ipv4/ip_input.c的函數(shù) int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)中定義:

NF_IP_LOCAL_IN,在對接收的sk_buff包完成路由分類判斷是到達(dá)自身的包后進(jìn)行處理,掛接點(diǎn)在在net/ipv4/ip_input.c的函數(shù)int ip_local_deliver(struct sk_buff *skb)中定義:

NF_IP_FORWARD,在對接收的sk_buff包完成路由分類判斷是需要進(jìn)行轉(zhuǎn)發(fā)的包進(jìn)行處理,掛接點(diǎn)在在net/ipv4/ip_input.c的函數(shù)int ip_forward(struct sk_buff *skb)中定義:

NF_IP_LOCAL_OUT,在對自身發(fā)出的包進(jìn)行處理,掛接點(diǎn)在在net/ipv4/ip_output.c的函數(shù) int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk, ? ? u32 saddr, u32 daddr, struct ip_options *opt) 中定義:

NF_IP_POST_ROUTING,在IP棧成功接收sk_buff包后處理,掛接點(diǎn)在在net/ipv4/ip_output.c的函數(shù)inline int ip_finish_output(struct sk_buff *skb)中定義:

2.掛接點(diǎn)操作

掛接點(diǎn)的操作由結(jié)構(gòu)struct nf_hook_ops定義:


數(shù)組中的元素說明如下: struct list_head list: 鏈表頭,用于將此結(jié)構(gòu)接入操作鏈表 nf_hookfn *hook:用戶定義的掛接處理函數(shù) int pf:協(xié)議族 hooknum:掛接點(diǎn) priority:優(yōu)先級

每個(gè)struct nf_hook_ops結(jié)構(gòu)需要掛接到nf_hooks數(shù)組中的某個(gè)鏈表中才起作用,每個(gè)協(xié)議族的各種處理形成一個(gè)處理鏈表,鏈表上可以掛接多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)是一個(gè)數(shù)據(jù)處理結(jié)構(gòu)(struct nf_hook_ops),用來描述對數(shù)據(jù)包進(jìn)行如何處理,這些節(jié)點(diǎn)根據(jù)優(yōu)先級順序進(jìn)行排序處理,優(yōu)先級是有符號的32位數(shù),值越小優(yōu)先級越高,如果優(yōu)先級相同,則按掛接的順序依次處理,netfilter預(yù)定義了以下優(yōu)先級:每個(gè)struct nf_hook_ops結(jié)構(gòu)需要掛接到nf_hooks數(shù)組中的某個(gè)鏈表中才起作用,每個(gè)協(xié)議族的各種處理形成一個(gè)處理鏈表,鏈表上可以掛接多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)是一個(gè)數(shù)據(jù)處理結(jié)構(gòu)(struct nf_hook_ops),用來描述對數(shù)據(jù)包進(jìn)行如何處理,這些節(jié)點(diǎn)根據(jù)優(yōu)先級順序進(jìn)行排序處理,優(yōu)先級是有符號的32位數(shù),值越小優(yōu)先級越高,如果優(yōu)先級相同,則按掛接的順序依次處理,netfilter預(yù)定義了以下優(yōu)先級:

由此可見,netfilter的處理順序是先連接跟蹤、然后是mangle處理,再目的NAT(PREROUTING),然后是過濾(FILTER),然后是源NAT(POSTROUTING),這就是為什么mangle鏈的規(guī)則會先執(zhí)行。

在各個(gè)處理點(diǎn)處理數(shù)據(jù)包時(shí),如果發(fā)現(xiàn)需要丟棄數(shù)據(jù)包,那么數(shù)據(jù)包就被立即釋放而不再進(jìn)入后面的處理點(diǎn);如果該處理點(diǎn)的最終結(jié)論是接受,那該數(shù)據(jù)包還會繼續(xù)進(jìn)入下一處理點(diǎn)進(jìn)行匹配檢查,所以對于最終通過防火墻的數(shù)據(jù)包,是經(jīng)過了所有處理點(diǎn)的匹配的。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ??

3.連接跟蹤

連接跟蹤的struct nf_hook_ops結(jié)構(gòu)在net/ipv4/netfilter/ip_conntrack_standalone.c中定義, 這是對用戶隱藏的,也就是用戶不能通過iptables規(guī)則對此操作點(diǎn)進(jìn)行配置,是有系統(tǒng)自動完成的。

定義如下:定義如下:

分別掛接在外部數(shù)據(jù)包進(jìn)入(NF_IP_PRE_ROUTING)和自身數(shù)據(jù)發(fā)出(NF_IP_LOCAL_OUT)時(shí)進(jìn)行處理,其功能就是判斷該數(shù)據(jù)包是什么狀態(tài),填充該數(shù)據(jù)包struct sk_buff結(jié)構(gòu)中struct nf_ct_info *nfct項(xiàng)的值,維護(hù)連接狀態(tài)表,從而實(shí)現(xiàn)狀態(tài)檢測,具體處理過程分析可見另一篇文章:Linux下如何實(shí)現(xiàn)狀態(tài)檢測。

4.規(guī)則表(table)

為了定義每個(gè)處理點(diǎn)上要執(zhí)行哪些規(guī)則,netfilter定義了表(table)的概念,每個(gè)表由一個(gè)struct ipt_table來描述,如缺省的filter/nat/mangle表,每個(gè)表可單獨(dú)分成幾個(gè)規(guī)則鏈,分別在幾個(gè)掛接點(diǎn)起作用,如filter表是在只在NF_IP_LOCAL_IN/NF_IP_LOCAL_OUT/NF_IP_FORWARD上起作用,然后通過函數(shù)ipt_do_table()來實(shí)現(xiàn)對某個(gè)表中某個(gè)hooknum的規(guī)則集進(jìn)行匹配處理。而由結(jié)構(gòu)struct nf_hook_ops所定義的各個(gè)處理點(diǎn)的處理函數(shù)都是直接或間接的調(diào)用了ipt_do_table()函數(shù)來實(shí)現(xiàn)對規(guī)則集的調(diào)用。

下面是系統(tǒng)缺省的三個(gè)表的定義情況:

每個(gè)數(shù)據(jù)處理表(table)中就是定義各自的規(guī)則集,是用動態(tài)長度的數(shù)組的形式保存,每個(gè)數(shù)組節(jié)點(diǎn)是一個(gè)規(guī)則,規(guī)則用struct ipt_entry結(jié)構(gòu)進(jìn)行描述,每條規(guī)則除了基本項(xiàng)外,其他附加匹配條件項(xiàng)還形成一個(gè)動態(tài)長度的匹配數(shù)組,struct ipt_entry中保存數(shù)組頭的地址,每個(gè)匹配用結(jié)構(gòu)struct ipt_match描述。規(guī)則的動作如果是擴(kuò)展動作的話,用struct ipt_target描述。

用戶可以自己定義自己的新的表,可以以缺省表為藍(lán)本,然后定義新的struct nf_hook_ops操作節(jié)點(diǎn),在該操作節(jié)點(diǎn)中調(diào)用ipt_do_table()函數(shù)將該ops和新表聯(lián)系起來,這樣就可以用iptables定義新的規(guī)則集。如果不定義新表,用戶也可以在ops處理函數(shù)中對包直接進(jìn)行判斷處理,適合需要對包進(jìn)行固定方式處理的場合。

5.總結(jié)

netfilter架構(gòu)以nf_hooks數(shù)組為基點(diǎn),掛接在內(nèi)核的協(xié)議處理的幾個(gè)基本點(diǎn)上,通過鏈表方式鏈接struct nf_hook_ops處理結(jié)構(gòu),這些處理結(jié)構(gòu)可以是在內(nèi)核內(nèi)部自動固定處理,如狀態(tài)檢測;也可以通過和struct ipt_table聯(lián)系,通過iptables來動態(tài)配置處理規(guī)則,實(shí)現(xiàn)了一個(gè)擴(kuò)展性很高的防火墻處理架構(gòu),不過實(shí)現(xiàn)細(xì)節(jié)部分仍然很復(fù)雜,各種細(xì)節(jié)功能將在后續(xù)文章里分析。netfilter架構(gòu)以nf_hooks數(shù)組為基點(diǎn),掛接在內(nèi)核的協(xié)議處理的幾個(gè)基本點(diǎn)上,通過鏈表方式鏈接struct nf_hook_ops處理結(jié)構(gòu),這些處理結(jié)構(gòu)可以是在內(nèi)核內(nèi)部自動固定處理,如狀態(tài)檢測;也可以通過和struct ipt_table聯(lián)系,通過iptables來動態(tài)配置處理規(guī)則,實(shí)現(xiàn)了一個(gè)擴(kuò)展性很高的防火墻處理架構(gòu),不過實(shí)現(xiàn)細(xì)節(jié)部分仍然很復(fù)雜,各種細(xì)節(jié)功能將在后續(xù)文章里分析。




一文詳解netfilter框架的評論 (共 條)

分享到微博請遵守國家法律
晋宁县| 桐城市| 大新县| 河间市| 盘锦市| 丰镇市| 门源| 蒲城县| 利辛县| 乌拉特中旗| 金阳县| 五峰| 江北区| 陆良县| 赞皇县| 罗平县| 时尚| 英德市| 鄂伦春自治旗| 沂水县| 高邑县| 静安区| 隆子县| 师宗县| 平罗县| 台前县| 寻甸| 德安县| 留坝县| 丹凤县| 昭觉县| 昭通市| 洛宁县| 大关县| 剑川县| 南漳县| 华蓥市| 肇源县| 辰溪县| 巴塘县| 通河县|