【摘要】本文討論并分析了Netfilter的功能框架、工作原理及數據包處理的實現機制,設計了在Netfilter框架中實現配電終端報文預處理的hook模塊,實現去除通訊遙控報文數字簽名的功能,為配網自動化的二次安防提供幫助,同時為其他通信應用中修改tcp包數據提供借鑒參考。
【關鍵詞】Netfilter;hook模塊;mangle函數;報文處理
引言
配電終端是典型的嵌入式設備,多基于linux系統,是配電自動化建設的重要組成部分。國家電網公司物資采購標準的專用技術規范中提出,配電終端應配備符合國調〔2011〕168號文件技術功能要求的非對稱密鑰技術單向認證模塊,終端側應能夠鑒別配電主站(open3200)的數字簽名。
配電主站與配電終端建立tcp連接后,以104規約通信,主站發往終端的重要104規約報文會單向加密并數字簽名。本文hook模塊設計的報文預處理功能正是用于終端側,在通信報文到達終端前定位tcp數據包中的data區報文內容,對報文進行數字簽名鑒別等預處理。
1.netfilter處理報文的流程
1.1 netfilter的框架
Netfilter是Linux 2.4版本引入的一個子系統,它作為一個通用的、抽象的框架,提供一整套的hook函數管理機制,使得諸如數據包過濾、網絡地址轉換(NAT)和基于協議類型的連接跟蹤成為可能[1]。同時netfilter也支持用戶自定義hook函數擴充以上功能。
Netfilter把數據包處理的更流程化,并且實現了擴展過濾策略而不必修改內核的功能[2]。該框架為每種網絡協議( IPv4、IPv6等)定義了數據包處理過程,并定義一些鉤子點(Hook) ,在內核中建立了一個函數指針鏈表,函數指針所指的函數稱為鉤子函數,其返回值告訴協議棧如何處理數據包[3]。
1.2 報文處理的實現原理
Tcp包經過netfilter時的處理流程以及各“鉤點”如圖1所示。
圖1 數據包在netfilter中的處理流程
對于收到的每個數據包,都從“PRE_ROUTING”點進來,經過路由判決,如果是發送給本機的就經過“LOCAL_IN”點,然后往協議棧的上層繼續傳遞;否則,如果該數據包的目的地不是本機,那么就經過“RORWARD”點,由“POST_ROUTING”點將該包轉發出去。對于上層協議棧發送的每個數據包,首先也有一個路由判決,以確定該包是從哪個接口出去,然后經過“LOCAL_OUT”點,最后也是順著“POST_ROUTING”點將該包發送出去[4]。
2.netfilter下報文預處理功能設計與實現
2.1 報文預處理的功能設計
本文設計的報文預處理功能是在L inux內核Netfilter框架上開發的一個內核模塊,具有tcp包勾取、識別、數據修改(加密或加數字簽名)等基本功能,通過動態加載到
Linux內核中實現預處理功能。本文用到的鉤子點是POST_ROUTING,在該點編寫了相應的鉤子函數,并進行注冊和掛接,將tcp數據包鉤出來進行處理再放回去。
通信tcp包在通過linux網關轉發時由預處理hook程序進行處理,程序流程設計如 圖2所示:
圖2 程序設計流程圖
2.2 報文預處理的hook函數實現
下文按圖2流程介紹報文處理的hook函數部分源代碼。
(1)hook函數定義如圖3所示:
圖3 hook函數定義
(2)獲取存放當前tcp包數據的skb_buff:
圖4 讀取skb_buff
(3)判斷數據包是否來自目標進程的端口號:
if (likely(ntohs(sport) = 5381)) {
return NF_ACCEPT;
} "http://判斷主站進程端口號是否為538
(4)判斷數據包是否需要處理
payload = (void *) skb-gt;data + 40;
//+40是從data區偏移出 ip包頭與tcp包頭
if (*payload==0x68) {
//判斷是否為104規約報文
if (*(payload+6)==0x2E) {
//判斷是否為遙控報文
.......}
}
(5)取出tcp數據包中的應用層數據(data區)也就是實際的規約報文,存入replace字符串:
payload = (void *) skb-gt;data + 40;
replace = payload ;
(6)如圖5處理報文,以0x00替換16 L1 L2 16型數字簽名,若想做其他處理都可以借助對指針字符串replace編程實現:
圖5 替換尾端報文16 L1 L2 16
(7)重新封裝tcp包,放入傳輸序列:
if (skb!=NULL) {
nf_nat_mangle_tcp_packet(skb,ct,ctinfo, 0,strlen(replace),(char*)replace,strlen(replace)); " " " " "http://重新封裝tcp包 return NF_ACCEPT;
}
這里的mangle函數調用是整個hook功能實現的核心。
用于修復seq的hook函數如圖6所示:
圖6 修復seq
3.測試運行
本文實驗環境是在windows系統下,用Linux虛擬機作為數據進出內網和外網的網關,報文預處理程序運行在該Linux虛擬機上,同時在該windows下用兩個網絡調試助手分別模擬外網主站與內網終端。內網終端與外網主站通過網關虛擬機交換數據,示意圖見圖7所示:
圖7 模擬通信示意圖
將104規約下的遙控報文68 0E 06 00 46 00 2E 01 06 00 01 00 01 60 00 82 16 77 74 16從模擬主站(Tcp server)發往終端(Tcp client),報文尾端16 77 74 16為簡單數字簽名。如圖8所示:
圖8 主站側發出遙控報文
終端接受到報文如圖9所示,可見報文的數字簽名已被解除,由00 00 00 00替代,如果要對報文做其他處理,可以在程序中對指針字符串replace做相應的處理。
4.結論
本文基于netfilter防火墻提出了一種報文預處理方法,用于配電終端側鑒別并處理配電主站(open3200)的遙控報文數字簽名。本方法能夠在傳輸網關準確定位到tcp包中的原始報文數據,可按用戶需求對通信報文進行預處理,無需再在終端應用層進行報文處理,減輕了終端的處理壓力、提高終端的響應速度。
圖9 終端側收到的遙控報文
本文設計亦可用于其他的tcp通信場合,提供了一種修改tcp包應用層data區數據的實現方法。
參考文獻
[1]陳慧春.Linux操作系統網絡協議棧的設計與實現研究. 成都:電子科技大學碩士論文,2004:44-47.
[2]岳新. Linux2. 4內核下基于Netfilter框架可擴展性研究與實現. 哈爾濱:哈爾濱理工大學碩士論文,2005.
[3]詹瑾,謝贊福. Linux內核netfilter包過濾防火墻的設計與實現[J].科學技術與工程,2010,10(18):4525.
[4]wjlkoorey,洞悉linux下Netfilteramp;iptables:什么是Netfilter[EB/OL].ChinaUnix.net,2012.