Linuxのrawソケットを介してパケットを受信する機能


Linux(たとえば、FreeBSDの場合とは異なります)では、送信だけでなくデータの受信にもrawソケットを使用できます。 この場所には、私が踏み込んだ興味深い熊手があります。 今では、C ++であろうとPythonであろうと、お気に入りのプログラミング言語を使用して誰もが試せるように、まだ知らない人にそれらをお見せします。

すくいの本質は図に示されているので、すでに知識のある人が時間を無駄にしないようにします。

Cで例を作成しますが、LinuxでTCP \ IPスタックを使用した低レベルの作業の可能性を提供する他の言語に移植できます。

いくつかの概念


生のソケットを初期化するために、プロトコルのタイプを示すパラメーターを渡すことを思い出させてください。 たとえば、UDP:

socket(AF_INET, SOCK_RAW, IPPROTO_UDP)

このプロトコルを、生のソケットが機能するレベルと呼びます。 この例では、UDPレベルで生のソケットを作成しました。

rawソケットレベルは、送信するパケットの形成を制限しません。UDPヘッダーとIPヘッダーの両方を個別に構成できます。 しかし、データを受け取ると、楽しみが始まります...

すくい


UDPレベルで2つのrawソケットを作成し、そのうちの1つを使用してUDPパケットをUDPエコーサーバーに送信するとします。 EchoはUDPペイロードを返します。 したがって、TCP \ IP Stack は、受信したパケットを受信したパケットのヘッダーのProtocol IPフィールドに示されているレベルのすべての rawソケットにコピーします 。 もう一度繰り返します-EVERYTHINGでは、他のアプリケーションで開いているアプリケーションでも(このため、rawソケットで動作するアプリケーションはスーパーユーザー権限でのみ実行できます)。 UDPエコーサーバーはUDPパケットで応答するため、すべての未加工UDPレベルソケットがそれを受信します。

もう1つの重要な機能に注意してください。 生のソケットレベルに関係なく、IPヘッダーを含む完全なパケットが配信されます。

したがって、Linuxのすべてのrawソケットは、作成されたレベルのスニファーです。 アプリケーションを開発するときは、このことに留意してください。


ノートにコードをロードしませんでした。 試してみたい人には、私は
私の例をgithubに投稿しました。 単純なUDPエコーサーバーを収集するcmakeプロジェクトと、2つのraw UDPレベルソケットを作成するアプリケーションがあります。一方はデータを送信しますが、両方が応答を待ってepollに送信されます。 実験の純度を高めるために、エコーサーバーとサンプルを異なるマシンで実行することをお勧めします(IP-shnikamiに従ってコードを修正することを忘れないでください)。 楽しみのために、この例の複数のインスタンスを実行できます。

課外読書のための良い記事があります。

ご清聴ありがとうございました!

Source: https://habr.com/ru/post/J183316/


All Articles