出于测试原因,我想根据特定数据包的选项或类型来阻止它们。
例如,在 DHCP DORA 事务中,我只想阻止 DHCP ACK 数据包。
是否可以使用 iptables 来做到这一点?如果不是,有哪些可能性?
答案1
您可以使用该u32
模块。 (参见联机帮助页iptables-extensions
)。它不太用户友好,但应该可用。
DHCP 解析起来有点困难,因为部分数据(包括 DHCP 消息类型)位于选项中,并且可以采用任意顺序。尽管消息类型选项可能是第一个。
DHCP 选项从 UDP 数据包中的偏移量 236 开始,IP 和 UDP 标头的长度为 20+8 字节。因此,我们对从偏移量 264 开始的字节感兴趣。前四个字节应该是魔术标识符,接下来的三个字节可以检查消息类型选项。类型代码是0x35
,长度始终是0x01
,DHCPACK
值是0x05
。 (这DHCP 数据包格式在 tcpipguide.com 上有描述)
所以 的表达式u32
可以是:
--u32 '268 >> 8 = 0x350105'
这只是意味着读取偏移量 268 处的 4 个字节(作为大端数字),将它们向右移动 8 位(以保留前三个字节),然后将其与预期值进行比较。
我们也可以检查幻数:
--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 标头不包含任何选项。