iptables 丢弃负面 DNS 响应

iptables 丢弃负面 DNS 响应

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

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

来自 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)

我认为 -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

答案1

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 的想法,并将在我的某些网络上进行测试。

答案2

这将删除 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: "

答案3

@DukeLion 是正确的,但您还应该注意 NOERROR 和 NOANSWER。要删除此错误,请添加以下 iptables 规则:

iptables -I INPUT -m u32 -p udp --sport 53 --u32 "32&0xFFFF=0x0000" -j DROP

PS. IP 数据包中的 DNS RCODE“实际”偏移量为 31.5 字节,因此我不喜欢使用0x1e&0x30000=0x30000

答案4

删除否定响应工作正常,直到我添加了多个search/etc/resolv.conf:libc 按顺序尝试后缀,如果我删除了 libc 解析器最初选择的错误后缀的否定响应,它会在尝试正确的后缀之前放弃并超时。

所以我决定延迟负面响应,而不是丢弃它们。这确保dnsmasq在从其他服务器获得负面响应之前,先从正确的服务器获得正面响应。

延迟不是用iptables而是用 来完成的iproute2。这是我针对现代 systemd Linux 的配​​置:

/etc/modules-load.d/my-tc.conf

ifb

/etc/systemd/system/my-tc.service

[Unit]
Before=NetworkManager.service

[Service]
Type=oneshot
ExecStart=/bin/bash -c "/usr/bin/ip link set dev ifb0 up && /usr/bin/tc qdisc add dev ifb0 root netem delay 900ms"
ExecStop=/bin/bash -c "/usr/bin/tc qdisc del dev ifb0 root && /usr/bin/ip link set dev ifb0 down"
RemainAfterExit=true

[Install]
WantedBy=network.target

/etc/NetworkManager/dispatcher.d/my-tc.sh

#!/bin/bash
if [ "enp0s3 up" = "$1 $2" ]; then
  tc qdisc add dev enp0s3 ingress
  tc filter add dev enp0s3 parent ffff: protocol ip \
    u32 \
      match ip protocol 17 0xff \
      match ip sport 53 0xffff \
      match u32 0x03 0x0F at 28 \
    flowid 1:1 action mirred egress redirect dev ifb0
fi

相关内容