Linux的內核提供的防火牆功能通過netfiter框架實現,並提供iptables工具配置和修改防火牆的規則
netfilter的通用框架不依賴於具體的協議,而是為每種網絡協議定義一套鈎子函數。這些鈎子函數在
數據包經過協議棧的幾個關鍵點時被調用,在這幾個點中,協議棧將數據包及鈎子函數作為參數,傳遞
netfilter框架
對於每種網絡協議定義的鈎子函數,任何內核模塊可以對每種協議的一個或多個鈎子函數進行注冊,
實現掛接。這樣當某個數據包被傳遞給netfilter框架時,內核能檢測到是否有有關模塊對該協議和鈎子函
數進行了注冊,如發現注冊信息則調用該模塊在注冊時使用的回調函數,然后對應模塊去檢查、修改、
丟棄該數據包及指示netfilter將該數據包傳入用戶空間的隊列
鈎子函數提供了一種方便的機制,以便在數據包通過Linux內核的不同位置上截獲和操作處理數據包
如下圖所示;
鈎子函數說明:
NF_IP_PRE_ROUTING:網絡數據包進入系統,經過簡單的檢測后,數據包轉交給該函數進行處理,
然后根據系統設置的規則對數據包進行處理,如果數據包不被丟棄則交給
路由函數進行處理,在該函數中可替換IP包的目的地址,即DNAT;
NF_IP_LOCAL_IN:所有發送給系統的數據包都要能過該函數的處理,該函數根據系統設置的規則對
數據包進行處理,如果數據包不被丟棄則交給本地的應用程序;
NF_IP_FORWARD:所有不是發送給本機的數據包都要能過該函數進行處理,該函數會根據系統設置
的規則對數據包進行處理,如數據包不被丟棄則轉 NF_IP_POST_ROUTING 進行處理。
NF_IP_LOCAL_OUT:所有從本地應用程序出來的數據包必須通過該函數的處理,該函數根據系統設置的
規則對數據包進行處理,如果數據包不被丟棄則交給路由函數進行處理。
NF_IP_POST_ROUTING:所有數據包在發給其他主機之前需要通過該函數的處理,該函數根據系統設置
的規則對數據包進行處理,如果數據包不被丟棄,將數據包發給數據鏈路層,在
該函數中可以替換IP包的源地址,即SNAT.