如何阻止 iptables 从绑定发送到同一 IP 地址的拒绝数据包序列?
我考虑过使用字符串扩展名来寻找“拒绝”。这会保护 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
我无法完全理解您想要实现的目标,但它失败的原因很简单,因为 DNS 响应实际上并不包含 string
REFUSED
。RFC 1035定义了一个响应标头,其中在该标头中将 4 位字段设置为
RCODE
; 响应代码,其中的值5
代表“拒绝”:不要这样做。
您正在创建拒绝服务向量。由于 DNS 查询很容易被欺骗,这种策略为攻击者打开了大门,可以训练您的 DNS 服务器忽略来自特定 IP 地址的流量。他们所要做的就是欺骗会产生 的响应的查询
REFUSED
,并且这个“智能”防火墙会很高兴地开始忽略来自受害者的流量。REFUSED
响应一开始对攻击者没有用处。希望利用 DNS 进行肮脏工作的攻击者通常是在寻找某种形式的放大效应,而这些查询不会产生这种效应。大多数 DNS 专业人士会认为这是不必要的过度设计。log2ban 样式策略仅在您处理具有已确认源 IP 的流量时才有效。TCP 通过 3 次握手内置了这种保护,但 UDP 没有。
利用 HBruijn 的回答,这里将是,在 DNS 服务器上,如何使用 u32 匹配丢弃任何带有 REFUSED RCODE 的 UDP DNS 回复
它跳过 IP 报头,然后为 UDP 报头再跳过 8 个字节,并在有效负载开始时检查第一个 u32 数据的内容:第 1 位是 1(回复),最后 4 位值 = 5(拒绝)。
正如我被提醒的那样,禁止源 IP 进行 UDP 查询是个坏主意,因为使用欺骗性 IP,这就是 DoS。没有收到拒绝回复似乎不是一个真正的问题。我刚刚从这个答案中删除了“最近的”规则。