GNU/Linux システムでのパケット インジェクションに関するいくつかの事柄について、経験豊富なネットワーク プログラマーの意見/アドバイスが必要です。私は、パケット インジェクションとスニッフィング用のオープン ソース C++ ライブラリに取り組んでいます。ライブラリはlibcrafterです。このページには、ライブラリがどのように機能するかを確認するためのいくつかの例があります。
私にはジレンマがあり、あなたの考えに感謝します。現在、ライブラリはネットワーク上でパケットを書き込む 2 つの方法を「提供」しています。まず、パケットが構築されます。
Packet pck = IP()/UDP()/DNS();
1) そして、Send() 関数で送信されます。
pck.Send("eth0");
2) または RawSocketSend() 関数を使用する (これは、ベンチマークに使用している「実験的」関数ですが、ユーザーが利用できます):
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/PACKET ソケットを使用するのは賢明で安全ですか?
- libnet の使用をやめる場合、GNU/Linux ディストリビューション間の RAW/PACKET ソケットの移植性に関して考慮すべきいくつかの問題を知っていますか?
- RAW/PACKET ソケット インターフェイスは、カーネルの将来のバージョンで変更される可能性がありますか?
どうもありがとうございました :-)