我怎样才能阻止由iptables发送绑定到相同的IP地址拒绝的数据包序列?
我想过使用string扩展寻找“拒绝”。 这会保护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
不要这样做。
您正在创build一个拒绝服务向量 。 由于DNS查询很容易被欺骗,这个策略为攻击者打开了一扇门,让你的DNS服务器忽略来自特定IP地址的stream量。 他们所要做的只是欺骗性的查询,会产生REFUSED的回应,这个“智能”的防火墙会乐于开始忽略来自受害者的stream量。
REFUSED回应对攻击者来说并不有用。 希望利用DNS进行肮脏工作的攻击者通常会寻找某种forms的放大效应,这些查询并不会产生这种效果。 大多数DNS专家认为这是不必要的过度工程。
log2ban风格策略只适用于处理具有确认来源IP的stream量。 TCP通过3次握手内置了这种保护,但是UDP没有。
我不能完全得到你想要达到的目标,但是失败的原因很简单,因为DNS响应实际上并不包含stringREFUSED 。
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– 由于策略原因,名称服务器拒绝执行指定的操作。 例如,名称服务器可能不希望将信息提供给特定的请求者,或名称服务器可能不希望执行特定数据的特定操作(例如,区域传送)。
从HBruijn的答案大写,这里将是,在DNS服务器上如何使用U32匹配与拒绝的RCODE的任何UDP DNS答复
iptables -I OUTPUT -p udp --sport 53 -m u32 --u32 '0>>22&0x3C@8 & 0x800F=0x8005' -j DROP
它跳过IP头,然后跳过多于8个字节的UDP头,并在有效负载开始时检查第一个u32数据的内容:第一位是1(回复),最后4位值= 5(拒绝)。
正如我所提醒的那样,禁止一个源IP进行UDP查询是一个坏主意,因为对于IP欺骗,这是一个DoS。 没有收到拒绝答复似乎并不是一个真正的问题。 我刚刚从这个答案中删除了“最近”的规则。