這不僅僅是我在這裏要做的捕獲。我想首先捕獲數據包,然後實時檢查特定數據的有效負載,將其刪除,注入簽名並將數據包重新注入堆棧,以便像以前一樣發送。掛鉤到C中的TCP協議棧
我讀過使用IPFW的ipfw divert套接字,它看起來很有希望。怎麼樣修改數據包並使用divert套接字將它們重新注入堆棧?另外,出於好奇,是否有可能使用Java從套接字讀取數據,或者這會限制我如何封裝和重新注入等?
這不僅僅是我在這裏要做的捕獲。我想首先捕獲數據包,然後實時檢查特定數據的有效負載,將其刪除,注入簽名並將數據包重新注入堆棧,以便像以前一樣發送。掛鉤到C中的TCP協議棧
我讀過使用IPFW的ipfw divert套接字,它看起來很有希望。怎麼樣修改數據包並使用divert套接字將它們重新注入堆棧?另外,出於好奇,是否有可能使用Java從套接字讀取數據,或者這會限制我如何封裝和重新注入等?
我打算迴應推薦iptables的其他響應(取決於您嘗試匹配的模式以及您想要進行的數據包修改的複雜性) - 直到我注意到BSD標記在這個問題上。
由於Stephen Pellicer已經提到,libpcap是捕獲數據包的好選擇。不過,我相信libpcap也可以用來發送數據包。作爲參考,我很確定tcpreplay使用它來重放pcap格式的文件。
查看divert插座:Divert Sockets mini HOWTO。
它們通過將匹配某個ipfw規則的流量傳遞給一個特殊的原始套接字來工作,該套接字然後可以將更改後的流量重新注入網絡層。
如果您只是在尋找數據包捕獲,libpcap非常受歡迎。它用於tcpdump和ethereal等基本工具。至於「掛鉤」,除非你打算從根本上改變網絡實現的方式(即添加你自己的層或改變TCP的行爲),你使用IPF進行數據包修改或干預的想法似乎是最好的選擇。在Linux中,它們具有用於用戶空間模塊的特定重定向目標,IPF可能具有類似的東西,或者可以修改IPF來執行類似的操作。
如果您只是想看看數據包,那麼libpcap就是要走的路。你可以在這裏找到它:http://www.tcpdump.org/
我可以用用戶空間與QUEUE或NFQUEUE iptables目標來做到這一點。客戶端應用程序附加到一個隊列並接收所有匹配的數據包,它們可以在重新注入之前進行修改(如果需要,它也可以放棄)。
有一個客戶端庫libnetfilter_queue它需要鏈接。令人遺憾的文檔是最小的,但有一些郵件列表帖子和示例敲門。
由於性能方面的原因,您不會希望對每個數據包都執行此操作,而只需要使用標準iptables規則匹配的特定匹配項。如果做得不夠,你需要編寫你自己的netfilter內核模塊。