
В целях тестирования я хотел бы заблокировать определенные пакеты в зависимости от их параметров или типа.
Например, в транзакции DHCP DORA я хотел бы блокировать только пакеты DHCP ACK.
Можно ли это сделать с помощью iptables? Если нет, то какие есть возможности?
решение1
Вы можете использовать u32
модуль. (См.страница руководства дляiptables-extensions
). Это не слишком удобно, но должно быть применимо.
DHCP немного сложно анализировать еще и потому, что части данных, включая тип сообщения DHCP, находятся в опциях, которые могут быть в произвольном порядке. Хотя опция типа сообщения, скорее всего, будет первой.
Параметры DHCP начинаются со смещения 236 в пакете UDP, а заголовки IP и UDP имеют длину 20+8 байт. Поэтому нас интересуют байты, начинающиеся со смещения 264. Первые четыре байта должны быть магическим идентификатором, а следующие три можно проверить для параметра типа сообщения. Код типа — 0x35
, длина всегда — 0x01
, а для DHCPACK
значения — 0x05
. (Формат пакета DHCP описан, например, на tcpipguide.com)
Таким образом, выражение для u32
может быть:
--u32 '268 >> 8 = 0x350105'
Это просто означает, что нужно прочитать 4 байта по смещению 268 (как число с обратным порядком байтов), сдвинуть их на 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 не содержит никаких параметров.