
テスト上の理由から、オプションやタイプに応じて特定のパケットをブロックしたいと思います。
たとえば、DHCP DORA トランザクションでは、DHCP ACK パケットのみをブロックしたいと思います。
iptables を使用してこれを行うことは可能ですか? そうでない場合、どのような可能性がありますか?
答え1
モジュールを使うこともできますu32
。(のマニュアルページiptables-extensions
)。あまりユーザーフレンドリーではありませんが、使えるはずです。
DHCP は、DHCP メッセージ タイプを含むデータの一部がオプション内にあり、順序が任意であるため、解析が少し難しくなります。ただし、メッセージ タイプ オプションが最初のオプションになる可能性が高くなります。
DHCP オプションは UDP パケットのオフセット 236 から始まり、IP および UDP ヘッダーの長さは 20+8 バイトです。したがって、オフセット 264 から始まるバイトに注目します。最初の 4 バイトはマジック識別子で、次の 3 バイトはメッセージ タイプ オプションで確認できます。タイプ コードは0x35
、長さは常に0x01
、DHCPACK
値は です0x05
。(DHCPパケットフォーマットは、例えばtcpipguide.comで説明されています。)
したがって、の表現はu32
次のようになります。
--u32 '268 >> 8 = 0x350105'
これは、オフセット 268 の 4 バイト (ビッグ エンディアン数として) を読み取り、それを右に 8 ビットシフトし (最初の 3 バイトを保持するため)、それを予想される値と比較することを意味します。
マジックナンバーも確認できます:
--u32 '264 = 0x63825363 && 268 >> 8 = 0x350105'
実際に UDP パケットが正しいポートに送信されるかどうかを確認するのは、通常のiptables
ルールを使用する方が簡単なので、次のようなルールを使用して、予想される DHCP パケットを照合します。
iptables -A foo -m udp --dport bootpc -m u32 --u32 '264 = 0x63825363 && 268 >> 8 = 0x350105'
ただし、前述のように、DHCP オプションは任意の順序で指定できるため、特に誰かが積極的に回避しようとする場合、これは堅牢な方法ではありません。ただし、テストには使用できる可能性があります。また、IP ヘッダーにはオプションが含まれていないと想定しました。