一千萬個為什麽

搜索

pcap和iptables爭鬥

我在機器上設置了DNS服務器。我想在機器發出之前捕獲DNS回復,並更改其中的一些字段然後發送數據包。

我只能更改數據包中的字段我的pcap代碼(用C語言編寫)捕獲,這似乎是一個副本,因為原始數據包也被傳輸。

我試過iptables丟棄來自機器的數據包,但它也丟棄了pcap註入的數據包。

有什麽方法可以解決這個問題嗎?

謝謝

最佳答案

如果您正在尋找僅限pcap的解決方案,那麽您將不得不攔截DNS請求數據包,檢查它,並在DNS服務器回復之前收集正確的回復。這似乎並不真實可靠,因為如果DNS服務器有緩存的條目,它可能會在您的自定義代碼之前回復以組裝數據包並將其發送完畢。

最可靠的方法是編寫一個netfilter鉤子的內核模塊。 Netfilter掛鉤能夠在數據包離開計算機之前檢查數據包並影響數據包的處理。掛鉤在NF_IP_LOCAL_OUT級別。然後,您可以檢查傳出數據包,看看它是否符合您的條件的DNS回復。下一部分我還沒有完成,但由於您可以直接訪問skb(套接字緩沖區)作為自定義鉤子函數的輸入參數,您可以在那裏修改數據包並返回NF_ACCEPT以將響應傳遞給客戶端。如果您需要對請求本身進行一些處理,則可以掛鉤到NF_IP_LOCAL_IN,並以任意多種方式處理它,包括將其傳遞給用戶空間程序。

Google上有許多關於Linux內核編程的例子(搜索:Linux內核模塊編程)以及netfilter鉤子示例。

轉載註明原文: pcap和iptables爭鬥