我需要更有經驗的網絡程序員對GNU/Linux系統上有關數據包注入的一些意見/建議。我正在開發一個用於數據包注入和嗅探的開源C++庫。圖書館是libcrafter。在頁面上有幾個例子來看看圖書館是如何工作的。Libnet vs Raw Sockets用於數據包注入
我有一個困境,並希望你的想法。目前,圖書館「提供」兩種方式在網上寫封包。首先,數據包被構建:
pck.Send("eth0");
2)或使用RawSocketSend()函數(這是一個 「實驗」:
Packet pck = IP()/UDP()/DNS();
1),然後與發送()函數所發送函數,我用於基準測試但可用於用戶):
pck.RawSocketSend(sd);
其中sd是套接字描述符。如果數據包具有鏈路層協議(如以太網),sd應該是PACKET套接字描述符。如果不是,應該是一個RAW套接字描述符。
使用Send()方法發送數據包的標準方法和記錄方式。目前,Send()方法使用libnet在線路上寫入數據包。
事情是Send()函數比RawSocketSend()慢得多......我經常要做很多棘手和煩人的事情來適應libcrafter處理協議字段的方式使用libnet_build *函數(這會導致性能損失)。每次我實現一個協議時,我必須看看libnet文檔,並使開發過程非常繁瑣和緩慢。所以,我正在考慮停止使用libnet進行數據包注入,並在Send()函數中直接使用RAW/PACKET套接字。
Libcrafter旨在爲用戶以透明的方式處理所有繁瑣的數據包製作工作(校驗和計算,字節排序,標題長度等)。使用RAW/PACKET套接字(RawSocketSend函數),最流行的GNU/Linux系統(Ubuntu,Fedora,Debian)一切正常。
我使用libnet的唯一原因是可移植性問題。但我沒有知識或意圖將libcrafter移植到其他系統,而不是GNU/Linux系統。
我的問題是:
- 是謹慎和安全上的數據包注入庫爲GNU/Linux使用RAW /包插座?
- 如果我決定停止使用libnet,你知道一些我應該考慮的有關GNU/Linux發行版之間RAW/PACKET套接字可移植性的問題嗎?
- 未來版本的內核中RAW/PACKET套接字接口可能會改變嗎?
非常感謝你:-)
謝謝你的答案,我不知道這個問題是否清楚,但我是libcrafter的開發者,而不是用戶。我想要做的是改變發送函數的下一個版本,以寫入原始套接字而不是使用libnet,出於性能的原因...我的開發系統是Ubuntu,而「安全」我的意思是如果我可以安全地假設在ubuntu中運行良好的東西(字節排序,使用setsockopt時的行爲等)將在其他發行版中這樣做。正如你所說,如果其他系統符合POSIX標準,一切都應該沒問題,對吧? – LarryPel
是的,因爲以上所有都是系統調用,所以實際的過程是在內核級完成的。由於它支持POSIX,所以不應該改變。 無論如何,你可以隨時檢查其他分區。在虛擬機中 - 檢查Linux KVM –