我已經在機器上設置了DNS服務器。我想在機器發出之前捕獲DNS回覆,並更改其中的一些字段,然後發送數據包。pcap和iptables打鬥
我只能改變數據包中的字段my pcap代碼(寫在C)捕獲,這看起來像一個副本,因爲原始數據包也被傳輸。
我試過iptables丟棄來自機器的數據包,但它也丟棄了pcap注入的數據包。
有沒有什麼辦法呢?
謝謝
我已經在機器上設置了DNS服務器。我想在機器發出之前捕獲DNS回覆,並更改其中的一些字段,然後發送數據包。pcap和iptables打鬥
我只能改變數據包中的字段my pcap代碼(寫在C)捕獲,這看起來像一個副本,因爲原始數據包也被傳輸。
我試過iptables丟棄來自機器的數據包,但它也丟棄了pcap注入的數據包。
有沒有什麼辦法呢?
謝謝
如果你正在尋找一個PCAP唯一的解決方案,你將不得不攔截DNS請求數據包,仔細看了看,組裝DNS服務器回覆之前正確的答覆。這似乎並不真實可靠,因爲如果DNS服務器有條目緩存,它可能會在您的自定義代碼之前回復以組裝數據包併發送出去。
最可靠的方法是編寫一個netfilter鉤子的內核模塊。 Netfilter鉤子能夠在數據包離開機器之前的幾個點檢查數據包並影響處理。掛鉤在NF_IP_LOCAL_OUT級別。然後,您可以檢查傳出數據包,並查看它是否符合您的條件的DNS答覆。下一部分我還沒有完成,但由於您可以直接訪問skb(套接字緩衝區)作爲自定義掛接函數的輸入參數,因此您可以在那裏修改數據包並返回NF_ACCEPT以將響應傳遞給客戶端。如果您需要對請求本身進行一些處理,則可以將其掛接到NF_IP_LOCAL_IN,並以任意數量的方式處理它,包括將它傳遞給用戶空間程序。
在Google for Linux內核編程(搜索:Linux內核模塊編程)和netfilter鉤子示例上有很多例子。
更簡單的解決方案(到目前爲止)將是修改名稱服務器的源代碼... – bortzmeyer 2010-05-09 16:46:07