NetFilter (1)

        以高效網絡著稱的 Linux,網絡安全當然也不容忽視,如何能以高效強大的手段對網絡數據包的處理進行配置也就顯得尤爲重要,而 NetFilter 就是承擔這一重任的組件。
        Linux 的了火牆發展至今,已經更新換代至由 NetFilter 作爲核心來完成內核態的功能。我們知道,在用戶態,iptables 工具可以很方便地進行防火牆的配置,但它只是提供一些人性化的配置命令,然後下發給內核空間讀取,在內核態 NetFilter 就會根據用戶的配置來進行匹配及執行操作。
        本文以 ipv4 包的處理爲例來講解,且只講原理,不觸及細節,在瞭解大致原理及框架後,要想知道細節,源碼將會告訴你答案。基於 Linux 2.6.27.62.

        簡單點來講,防火牆其實就是在恰當的點,來接過 ip 包的處理,然後根據配置的規則來決定採取怎樣的處理。那麼問題來了,如何選擇恰當的點呢。見下圖:


        上圖是摘抄了網絡上的一張圖,其中的五個位置,就是 Linux 支持的幾個攔截點,那麼問題的第一步就變得非常簡單了,在這些位置的函數實現中 hook 一下就可以了。這樣當數據包經過這些函數處理時,就可以調用到我們的函數,我們就有機會去處理了,NetFilter 也不能免俗,幸好,內核的網絡部分與 NetFilter 完美兼容,它提供出了註冊機制,只要表明一下自己的網絡類型以及想要 hook 的地點,那麼你的回調函數就將有機會在 hook 被執行。

extern struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS];

int nf_register_hook(struct nf_hook_ops *reg)
{
	struct nf_hook_ops *elem;
	int err;

	err = mutex_lock_interruptible(&nf_hook_mutex);
	if (err < 0)
		return err;
	list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) {
		if (reg->priority < elem->priority)
			break;
	}
	list_add_rcu(&reg->list, elem->list.prev);
	mutex_unlock(&nf_hook_mutex);
	return 0;
}

        nf_register_hook 就是爲你提供便利的函數,代碼中可見,我們註冊的回調,會連接到 nf_hooks 上,這個全局變量就記錄了,不同網絡類型,不同掛載點的所有回調函數,到時候數據包經過相應的點時,遍歷一下就可以依次處理所有註冊的回調了。
        當然,你也可以自己註冊一個自己的回調,來做一個自己的防火牆功能。 (未完待續)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章