Назад | Перейти на главную страницу

iptables отбрасывает отрицательные ответы DNS

Как отказаться от входящих отрицательных ответов DNS в Linux? (Вместо этого я хочу тайм-аут) Я думаю о создании правила iptables:

iptables -I INPUT -p udp --sport 53 -m u32 ...

Из wirehark:

000E start of IP Packet (fixed, at first, I wrote 0010)
0022 start of UDP Packet
002A start of DNS message
002C  Flags
        .... .... .... 0000 = Reply code: No error (0)
        .... .... .... 0011 = Reply code: No such name (3)

Я думаю, что смещение для -m u32 отсчитывается от заголовка ip. Также вычитаем 2, чтобы получить 32 бит.

$ echo $(( 0x002C - 0x000E - 2 ))
28

Маска для последних 4 бит - 0xF
Итак, правило должно быть примерно таким:

iptables -I INPUT -p udp --sport 53 -m u32 --u32 "28&0xF=3" -j DROP

Смещение для флагов DNS в пакете ip составляет 28 байтов, и вам нужно проверить последние 2 бита в 2-байтовом поле u32 правило, для этого "28&0x000F=0x03"

Мое тестовое правило: iptables -A INPUT -m u32 -p udp --sport 53 --u32 "28&0x000F=0x03" -j LOG

Кстати, мне нравится идея использовать это правило брандмауэра для DNS с разделением горизонта, я собираюсь протестировать его в некоторых своих сетях.

Это отбрасывает "отклоненные" ответы BIND9 на текущие поддельные запросы UDP!

iptables -F OUTPUT 
#iptables -A OUTPUT -p udp --sport 53 -j LOG --log-prefix="OUT-UPD-RAW : "
#iptables -A OUTPUT -m u32 -p udp --sport 53 --u32 "28&0xFFFF=0x8105" -j LOG --log-prefix="STOPPED-DNS-REJECTED-REPLY "
iptables -A OUTPUT -m u32 -p udp --sport 53 --u32 "28&0xFFFF=0x8105" -j DROP
iptables -A OUTPUT -p udp --sport 53 -j LOG --log-prefix="OUT-UPD-SENT: "