iptables 丢弃负面的 DNS 响应

bas*_*sin 2 domain-name-system linux iptables iproute2

如何在 Linux 中删除传入的负面 DNS 响应?(我想要超时)我正在考虑创建一个 iptables 规则:

iptables -I INPUT -p udp --sport 53 -m u32 ...
Run Code Online (Sandbox Code Playgroud)

来自wireshark:

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)
Run Code Online (Sandbox Code Playgroud)

我认为 -m u32 的偏移量是从 ip 标头计算的。还减去 2 得到 32 位。

$ echo $(( 0x002C - 0x000E - 2 ))
28
Run Code Online (Sandbox Code Playgroud)

最后 4 位的掩码是 0xF
所以规则应该是这样的:

iptables -I INPUT -p udp --sport 53 -m u32 --u32 "28&0xF=3" -j DROP
Run Code Online (Sandbox Code Playgroud)

Duk*_*ion 5

ip 数据包中 DNS 标志的偏移量为 28 字节,您需要检查 2 字节字段 u32 规则中的最后 2 位是 "28&0x000F=0x03"

我的测试规则是: iptables -A INPUT -m u32 -p udp --sport 53 --u32 "28&0x000F=0x03" -j LOG

顺便说一句,我喜欢将这个防火墙规则用于水平分割 DNS 的想法,打算在我的一些网络中测试它。