netfilter: IP オプションを持つパケットのドロップ

netfilter: IP オプションを持つパケットのドロップ

IPv4次のヘッダーを含むパケットをドロップするルールを追加したいと思いますIP option。私が理解したところ、IHLヘッダーの(インターネットヘッダー長さ)フィールドには、オプションを含むIPv4ヘッダーの32ビットワード数が含まれています。したがって、ルールはIHLフィールドからパケット+オプションの長さを取得し、20(オプションのないIPv4ヘッダーの長さ)と比較し、20より大きい場合はパケットを破棄する必要があることを理解します。

iptablesヘッダーを確認しIPて評価(算術演算を実行)できる特定のモジュールはありますか?

答え1

iptablesu32パケットペイロードのビット単位(任意の算術ではない)演算、範囲比較、および条件一致のためのポインタなどの間接的な実行を実行できるmatchメソッドが含まれています。

u32

U32は、パケットから抽出された最大4バイトの量が指定された値を持つかどうかをテストします。コンテンツ抽出の仕様は、TCPヘッダーまたはペイロードの指定されたオフセットからデータを見つけることができるほど一般的です。

これには独自のサブ言語構文があるので、ドキュメントの構文と例を確認する必要があります。

国際インド法IPヘッダーサイズ(バイトではなく32ビットブロック)で、ヘッダーの最初の32ビット(IPv4値が0x04のバージョンの場合は4ビット、その後にIHLの4ビット)が含まれます。オプションでは、このサイズは最小サイズ(20(バイト)/ 4(32ビットワードあたりのバイト))でなければなりません。したがって、IHL = 5(32ビットワード)です。 IHL < 5の間違った場合は処理しません。 IPv4スタックはすでにこれを処理する必要があります。

これは次のように翻訳されます。

  • 値の最初の32ビットを取得する
  • 国際人道法のセクションを隠す
  • 24ビットに移動
  • 等価を5と比較します(!一致するように結果を逆にします)。

したがって、このように着信パケットをドロップするにはiptables:

iptables -A INPUT -m u32 ! --u32 '0 & 0x0F000000 >> 24 = 5' -j DROP

反転なし(代わりに6以上と一致):

iptables -A INPUT -m u32 --u32 '0 & 0x0F000000 >> 24 = 6:0xF' -j DROP

マニュアルには、24ビットだけ移動してから4を掛けて(したがって22ビットのみを移動する)、32ビットワードの代わりに(u32後で使用されるポインタが8ビットアドレスを使用するため)バイトを取得し、レイヤ4ペイロードを検索する同様の例があります。そしてさらに進む:

... 0 >> 22 & 0x3C @ 0 >> 24 = 0"

最初の0はバイト0-3を読み取ることを意味し、>> 22は22ビットを右に移動することを意味します。 24ビットを移動すると最初のバイトが提供されるので、22ビットだけが4倍に多くのビットを加えたのです。その後、&3Cは右側の2つの追加ビットと最初のバイトの最初の4ビットを削除します。たとえば、IHL = 5の場合、IPヘッダーの長さは20(4 x 5)バイトです。
[...]

OPケース:

iptables -A INPUT -m u32 ! --u32 '0 >> 22 & 0x3C = 20' -j DROP

反転なし(そして与えられた値が大きい限り、次に最初の可能な値が21ではなく24でも正確な最大値でもない):

iptables -A INPUT -m u32 --u32 '0 >> 22 & 0x3C = 21:0xFF' -j DROP

最初のアプローチは次のように単純化できます。

  • 値の最初の32ビットを取得する
  • 国際人道法のセクションを隠す
  • (5<<24) と等価を比較します。つまり、0x05000000と比較します(上記と同じ)。

与える:

iptables -A INPUT -m u32 ! --u32 '0 & 0x0F000000 = 0x05000000' -j DROP

または:

iptables -A INPUT -m u32 --u32 '0 & 0x0F000000 = 0x06000000:0x0F000000' -j DROP

でも:

  • 値の最初の32ビットを取得する
  • 値を0x45000000から0x45FFFFFFの範囲と比較してOK(IPv4いつも4(IHL部分の後のすべての値は無視されます)で始まるか、0x46000000から0x4FFFFFFFの間の値は異常を示します。

与える:

iptables -A INPUT -m u32 ! --u32 '0 = 0x45000000:0x45FFFFFF' -j DROP

または:

iptables -A INPUT -m u32 --u32 '0 = 0x46000000:0x4FFFFFFF' -j DROP

必要なものを選択してください。

関連情報