2020年2月1日このページはこんな方におすすめです自分でパケットを作って送信してみたいパケットの構造に興味がある今回はパケットジェネレータのサンプルとしてUDPパケットを送信します。その際、IPヘッダ−とUDPヘッダーを自ら設定します。パケットジェネレータの作成はパケットキャプチャと比べて難易度が上がります。パケットキャプチャの場合はネットワークを流れるIPヘッダーやUDPヘッダーを単純に表示させるだけでしたが、パケットジェネレータは自らヘッダーの値を設定しなければなりません。そのためには、ヘッダーの構造だけでなくヘッダー値の意味を理解していなくてはなりません。今回はパケットジェネレータの作成に必要な知識を羅列し、最後にサンプルコードと実行例を掲載します。7でおこなっています。Socket(生ソケット)を作成するソケットオプションについてIPヘッダー作成のポイントUDPヘッダー作成のポイント疑似ヘッダーパケットの送信方法サンプルコードと実行例サンプルコード実行例まとめパケットジェネレータのつくり方パケット送信の流れパケットの送信は以下のような流れになります。Socket(生ソケット)を作成する必要があります。今回はUDPパケットを作成して送信しますが、IPヘッダーも含めるため通常のソケットでは実現することができません。Socket(生ソケット)が必要です。Socketを使うにはセキュリティの関係上、ルート権限が必要になります。ソケットオプションについて今回はIPヘッダーを送信パケットに含める必要があるため、ソケットオプション(IP_HDRINCL)を設定しています。Linuxはこのオプションを設定しなくてもIPヘッダーを含めてパケットを送信できます。X)はソケットオプションが必須です。IPヘッダー作成のポイントIPヘッダーを作成する上で重要な点は「ip_len」「ip_off」の取り扱いです。rawソケットからの出力」)。Linuxはip_lenを設定しても無視し、sendto(2)で引数にとる送信サイズをip_lenへ自動的に設定します。そのため、今回のサンプルではip_lenとip_offは両方ともホストバイトオーダーで設定しています。チェックサムを計算して設定していますが、IPヘッダーのチェックサムはOSがパケット送信時に設定しますので、適当な値(123など)を設定しても問題なく送信できます。ホストバイトオーダー、その他はネットワークバイトオーダーIPヘッダーのチェックサムはOSが計算するUDPヘッダー作成のポイントUDPヘッダーの作成で注意するのはチェックサムの計算です。UDPはチェックサムを0にしても良いのですが、チェックサム計算の方法を理解するためにも、自分で計算してみましょう。疑似ヘッダーUDPのチェックサム計算には疑似ヘッダーというものを使います。|+--------+--------+--------+--------+疑似ヘッダーの末尾に、送信するUDPヘッダーとデータを付加します。疑似ヘッダーとUDPヘッダー、データを含めてチェックサムの計算をおこないます。次のようなデータ構造を用意してチェックサムの計算をおこないます。...チェックサムの計算に必要な関数は、BSDのping.cを流用します。パケットの送信方法パケットの送信にはsendto(2)を使用します。X)はLinuxと違って厳密なため、IPヘッダーで設定したip_lenの値とsendto(2)へ渡す送信サイズに差異があるとエラーになりますから注意してください。次のセクションでサンプルコードと実行例を掲載します。サンプルコードと実行例サンプルコードUDPはヘッダー構造が単純ですが、それでもコード行数はキャプチャに比べてかなり増えています。コードを単純にする目的でIPヘッダーやUDPヘッダー値の大半をハードコーディングしています。慣れてきたら引数でヘッダー値を設定できるようにすると、本格的なパケットジェネレータとなってくるはずです。サンプルコードはGitHubからも落とせます。実行するためには「送信元IPアドレス」「送信先IPアドレス」「送信先UDPポート番号」「データ文字列」の4つを引数に設定します。プログラムの実行はMacでおこないました。ルート権限が必要であることに注意してください。7でtcpdumpの結果を確認します。kernel#IPヘッダーが正しく設定できていることを確認するために、念のためTOSを1に設定しました。ご覧のとおりtcpdumpの結果からTOSが1になっていることが判ります。送信元IPアドレスも1.2.3.4となっています。まとめパケットジェネレータの作成はパケットキャプチャに比べると難易度は高いですが、UDPパケットの送信ならばさほど難しくないと思います。TCPはヘッダー構造が異なるだけでやる事は同じですから、応用してTCPにも挑戦してみてください。イーサネットヘッダーまで送信できるようになると、LAN内であらゆる事ができるようになります。イーサネットヘッダーの送信については、また別の機会に書きたいと思います。最後にチェックポイントをまとめておきます。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。