我如何阻止 iptables 绑定到同一 ip 地址并拒绝发送的数据包序列?
我考虑使用字符串扩展来查找“Refused”。这是否可以保护 DNS 免受 DoS 攻击?
我的尝试:
iptables -A INPUT -p udp -m udp --sport 53 -m string --string "Refused" --algo bm -m recent --set --name block-dns --rsource
iptables -A INPUT -p udp -m udp --sport 53 -m string --string "Refused" --algo bm -m recent --rcheck --seconds 10 --hitcount 1 --name block-dns --rsource -j DROP
答案1
不要这样做。
您正在创建一个拒绝服务向量。由于 DNS 查询很容易被欺骗,因此这种策略为攻击者打开了大门,让他们训练您的 DNS 服务器忽略来自特定 IP 地址的流量。他们所要做的就是欺骗查询,生成响应,
REFUSED
然后这个“智能”防火墙就会很乐意开始忽略来自受害者的流量。REFUSED
响应对攻击者来说一开始就毫无用处。希望利用 DNS 进行肮脏工作的攻击者通常希望获得某种形式的放大效应,而这些查询不会产生这种效应。大多数 DNS 专业人士认为这是不必要的过度设计。
log2ban 样式策略仅在处理具有已确认源 IP 的流量时才有效。TCP 通过三次握手内置了这种保护,但 UDP 没有。
答案2
我不太明白您想要实现什么,但失败的原因很简单,因为 DNS 响应实际上并不包含字符串REFUSED
。
RFC 1035定义一个响应头,其中 4 位字段设置为RCODE
响应代码,其中 的值5
代表“拒绝”:
4.1.1. Header section format
The header contains the following fields:
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
RCODE 5
- 名称服务器由于策略原因拒绝执行指定操作。例如,名称服务器可能不希望向特定请求者提供信息,或者名称服务器可能不希望对特定数据执行特定操作(例如区域传输)。
答案3
利用 HBruijn 的回答,在 DNS 服务器上如何使用 u32 匹配删除任何带有 REFUSED RCODE 的 UDP DNS 回复
iptables -I OUTPUT -p udp --sport 53 -m u32 --u32 '0>>22&0x3C@8 & 0x800F=0x8005' -j DROP
它跳过 IP 标头,然后跳过 UDP 标头的另外 8 个字节并检查有效负载开始处第一个 u32 数据的内容:第一位为 1(回复),最后 4 位值 = 5(拒绝)。
正如我所提醒的,禁止源 IP 执行 UDP 查询不是一个好主意,因为对于伪造的 IP,这是一种 DoS。没有收到拒绝回复似乎不是一个真正的问题。我刚刚从这个答案中删除了“最近”规则。