Linux

iptables 丟棄否定的 DNS 響應

  • June 19, 2021

如何在 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

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 的想法,並將在我的一些網路中對其進行測試。

這會丟棄對目前欺騙性 UDP 查詢的 BIND9“拒絕”回复!

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: "

引用自:https://serverfault.com/questions/477298