Você pode usar o módulo u32
. (Veja a página de manual para iptables-extensions
). Não é muito amigável, mas deve ser utilizável.
O DHCP é um pouco difícil de analisar também porque partes dos dados, incluindo o tipo de mensagem DHCP, estão nas opções, que podem estar em ordem arbitrária. Embora a opção de tipo de mensagem seja provavelmente a primeira.
As opções de DHCP começam no deslocamento 236 no pacote UDP, e os cabeçalhos IP e UDP têm 20 + 8 bytes de comprimento. Portanto, estamos interessados nos bytes que começam no deslocamento 264. Os primeiros quatro bytes devem ser o identificador mágico e os próximos três podem ser verificados para a opção de tipo de mensagem. O código de tipo é 0x35
, o comprimento é sempre 0x01
e, para DHCPACK
, o valor é 0x05
.
(O formato de pacote DHCP é descrito, por exemplo, em tcpipguide.com )
Portanto, a expressão para u32
poderia ser:
--u32 '268 >> 8 = 0x350105'
O que significa simplesmente ler 4 bytes no deslocamento 268 (como número big-endian), deslocá-los 8 bits para a direita (para manter os primeiros três bytes) e compará-los ao valor esperado.
Também podemos verificar o número mágico:
--u32 '264 = 0x63825363 && 268 >> 8 = 0x350105'
Verificar se realmente temos um pacote UDP para a porta correta é mais fácil de fazer com as regras regulares de iptables
, portanto, usamos algo como o seguinte para corresponder aos pacotes DHCP esperados.
iptables -A foo -m udp --dport bootpc -m u32 --u32 '264 = 0x63825363 && 268 >> 8 = 0x350105'
Embora, como dito, as opções de DHCP podem estar em qualquer ordem, então este não é um método robusto, especialmente se alguém tenta ativamente contorná-lo. Mas talvez para testes, isso possa ser feito. Além disso, assumi que o cabeçalho IP não contém opções.