テスト上の理由から、オプションやタイプに応じて特定のパケットをブロックしたいと思います。
たとえば、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 ヘッダーにオプションが含まれていないと仮定します。