私は生のソケットプログラミングとIPヘッダのなりすましを研究しています。
Scapyを使用してPythonコンソールで次のコマンドを実行すると、WiresharkはICMPエコー要求と応答を表示し、Cプログラムを使用してシステムに入出力するICMPパケットをスニッフィングできます。
>>> from scapy.all import *
>>> send( IP()/ICMP()/b'abcdef' )
ただし、以下のように無効なIPヘッダー長フィールドを設定すると、WiresharkはICMPエコー要求のみを表示し、応答を受信せず、パケットスニファの出力も表示しません。
>>> from scapy.all import *
>>> send( IP(len=4000)/ICMP()/b'abcdef' )
私の意見では、Linuxカーネルが無効なIPヘッダー「合計長」フィールドを持つパケットを破棄しているようです。システムがこれらのパケットを破棄するのをどうやって防ぐことができますか?私のコンピュータがこれらのパケットに応答するかどうかは重要ではありませんが、プログラムでこれらのパケットの内容にアクセスできるようにしたいです。
答え1
IP(インターネットプロトコル)はRFC 791で定義されています。 RFC は IP ヘッダーの形式を指定します。ヘッダーには、ヘッダーの長さを32ビットワードとして指定する4ビット長のInternet Header Length(IHL)フィールドがあります。 IHLフィールドには、0(2進数0000)から15(2進数1111)までの値を含めることができます。
最も長いインターネットヘッダー(IPヘッダー)サイズは、15 * 32ビット= 480ビット= 60バイトです。
最も短いヘッダーサイズは20バイトで、インターネットヘッダーフィールドの値は5(0101)です。ヘッダーのすべての必須フィールドには20バイトのスペースが必要なためです。