2015-11-20 34 views
1

我正在寫一個內核模塊,通過使用網絡過濾器來阻止訪問特定的網站,它的工作效果很好。我已經爲NF_INET_PRE_ROUTING註冊了鉤子,並且可以檢查請求是否是http請求,並且是否進行了IP地址請求。從這裏,我想擴展我的模塊的功能,使對特定網站的請求重定向到另一個網站。我正在考慮重寫iphdr結構體的saddr屬性。這是可行的方法嗎?我試圖重寫saddr屬性,但請求沒有被重定向。 Wget只是停止響應。是否有可能重寫iphdr的saddr屬性?

這是我的代碼片段 -

// This code is inside hook function 
__be32 test = ntohl(0xCC4FC5C8); 
ip_header = (struct iphdr *)skb_network_header(skb);  
ip_header->saddr = test; 
return NF_ACCEPT; 

內核版本 - 3.19 Ubuntu的

回答

1

我不認爲這是可能通過使用網絡過濾器重定向TCP請求。如果我沒有記錯,只有包含有效載荷的數據包纔會通過netfilter框架,但三向握手中的數據包(如同步)將由接口卡處理和響應。這樣做的原因可能是性能。

因此,您的程序可能發生的情況是,帶有http請求的數據包實際上被重定向到test,但不是用於syns,這意味着您的客戶端和test之間甚至沒有建立tcp連接。我建議使用wireshark檢查是否所有數據包都重定向到test

也許你可以嘗試代理服務器,而不是在內核模塊中做所有事情。

如果我錯了,請務必糾正我。

+0

對不起,延遲迴復。我沒有用wireshark進行測試,但很可能你說的是真實的。我使用printk測試瞭解發生了什麼,發現客戶端不斷向同一個IP地址發送請求,並且不承認我做出的任何更改。我正在考慮使用連接系統調用的不同方法。 – user30646

+1

我剛剛意識到你忘了重新計算ip頭的校驗和。網卡將丟棄具有無效校驗和的數據包。 – ruofan

+0

你知道如何重新計算校驗和嗎? – user30646

1

我實際上正在處理類似於這個,但在用戶空間。

您可能需要做的就是嗅探數據包,直到獲得GET請求和Host標頭。如果它與要重定向到其他位置的主機相匹配,則假設來自Web服務器的響應爲302 Redirect響應。您可能仍需要跟蹤連接本身以處理FIN等。

祝您好運!

1

你的方法是健全的,你幾乎在那裏。

首先,按照@ruofan的建議,您需要確保更新重定向數據包的IP頭校驗和。根據你在做什麼,你可能還必須更新他們的TCP頭部校驗和。

此外,如果您希望將針對一個網站的流量重定向到另一個網站,則應該編輯ip標頭的daddr字段,而不是它們的saddr字段。請注意,您稍後可能需要更改應用程序的響應數據包的ip頭字段以正確處理它們。

最後但並非最不重要的一點,請記住,您應該修改與註冊爲NF_INET_PRE_ROUTING的掛鉤相關的目標相關字段,以及註冊爲NF_INET_POST_ROUTING的掛鉤的源相關字段。

祝你好運!

相關問題