1

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 システム以外のシステムに移植する知識や意図はありません。

私の質問は次のとおりです。

  1. GNU/Linux のパケット注入ライブラリで RAW/PACKET ソケットを使用するのは賢明で安全ですか?
  2. libnet の使用をやめる場合、GNU/Linux ディストリビューション間の RAW/PACKET ソケットの移植性に関して考慮すべきいくつかの問題を知っていますか?
  3. RAW/PACKET ソケット インターフェイスは、カーネルの将来のバージョンで変更される可能性がありますか?

どうもありがとうございました :-)

4

1 に答える 1

1

オープン ソースの素晴らしい点は、実際にソースを閲覧できることです

そして、Packet::send が効率的ではないことを確認しました。システム コールが多すぎて (デバイス名を毎回実際のインターフェイスに一致させる)、毎回ソケットを開いてパケットを送信すると思われる libnet 関数を呼び出します。とにかく、パケットを送信するにはオーバーヘッドが多すぎます。

生で送信してください。関数コードは見ていませんが、send(). もし私があなたなら、sendRawPacket() 関数に満足できなければ、単純に行ソケットを使用して送信します。パケットがgetRawBuffer()関数を提供することを見てきました。

raw ソケットの詳細については、 http ://www.tenouk.com/Module43a.html を参照して、google を試してください。

あなたの質問:

1) 「安全」とはどういう意味ですか? 一般的な答えは「はい、慎重に」です

2) 移植性については、raw ソケットの使用は POSIX 標準の一部であるため、どの Linux ディストリビューションでも動作し、おそらく Windows でも動作します。libcraft が Windows に移植可能かどうかはわかりませんが、どの Linux ディストリビューションでも実行できるはずです。そうでない場合は、ライブラリに貢献して移植可能にすることができます。

3) 将来に関する質問にはお答えできません。繰り返しますが、これは長年にわたってあまり変更されていない POSIX 標準です。将来変更される可能性があります。私は預言者ではありませんが、近い将来に変わるとは思いません。

于 2012-06-02T11:42:33.857 に答える