
Por motivos de teste, gostaria de bloquear pacotes específicos dependendo de suas opções ou tipo.
Por exemplo, em uma transação DHCP DORA, gostaria de bloquear apenas pacotes DHCP ACK.
É possível fazer isso usando iptables? Se não, quais são as possibilidades?
Responder1
Você poderia usar o u32
módulo. (Veja opágina de manual paraiptables-extensions
). Não é muito fácil de usar, mas deve ser utilizável.
O DHCP também é um pouco difícil de analisar 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 provavelmente seja a primeira.
As opções 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 começando 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 do tipo é 0x35
, o comprimento é sempre 0x01
e DHCPACK
o valor é 0x05
. (OO formato do pacote DHCP é descrito, por exemplo, em tcpipguide.com)
Então 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 três primeiros bytes) e comparar isso com o valor esperado.
Poderíamos verificar o número mágico também:
--u32 '264 = 0x63825363 && 268 >> 8 = 0x350105'
Verificar se realmente temos um pacote UDP indo para a porta correta é mais fácil de fazer com iptables
regras regulares, então usaríamos 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 possam estar em qualquer ordem, esse não é um método robusto, especialmente se alguém tentar ativamente contorná-lo. Mas talvez para testar isso pudesse servir. Além disso, presumi que o cabeçalho IP não contém nenhuma opção.