上一篇文章《防御Source Engine Query泛洪攻击(二)》介绍了将被攻击的端口短暂封禁的方法,以避免服务器因响应查询包发送大量数据影响服务器的上行带宽,但这种方法也会导致正常玩家在端口遭受DDoS攻击时无法搜索到服务器,本文将介绍使用白名单的方法来实现降低服务器在攻击时无法被正常玩家搜索到的几率。
由于UDP数据包的来源IP地址极易被伪造,大量Source Engine Query攻击都采用了伪造的来源IP,单纯地针对攻击来源IP加入黑名单反而会导致黑名单集合异常庞大,降低匹配速度,且封禁的成效微乎其微。因此,我们最终的策略是在端口请求速率正常的情况下将接收到的查询的来源IP都视为合法玩家IP加入白名单,而在端口受到攻击时只放行白名单中的请求。
- 在上文的第(1)个步骤中,我们对Source Engine查询包进行了标记。然后,我们需要在其后添加白名单规则。首先建立一个白名单IP列表集合。timeout即白名单过期时间,选择适当的过期时间能够保证大部分玩家IP的正常访问且降低攻击源IP被误加入到白名单产生的影响,此处我们设置过期时间为86400秒(即一天)。
ipset create SourceEngineQuery_WhiteList hash:ip,port timeout 86400
- 加入一条放行白名单内IP的规则,此规则在端口受到攻击时将匹配白名单数据并决定是否放行。
iptables -t raw -A PREROUTING -i eth0 -m set --match-set SourceEngineQuery_WhiteList src -j ACCEPT
- 在端口封禁规则后,加入一条在端口请求速率正常的情况下将来源IP加入白名单的规则,其中匹配速率可根据业务实际需求调整。
iptables -t raw -A PREROUTING -i eth0 -p udp -m mark --mark 1 -m hashlimit --hashlimit-name SourceEngineQuery_CheckPort --hashlimit-mode srcip,dstport --hashlimit-upto 20/second --hashlimit-burst 1 --hashlimit-htable-expire 30000 -j SET --add-set SourceEngineQuery_WhiteList src --timeout 86400
- 最后,完整的规则顺序应该是这样的。
# 标记Source Engine Query iptables -t raw -A PREROUTING -p udp -m string --hex-string '|ff ff ff ff 54 53 6f 75 72 63 65 20|' --algo kmp -j MARK --set-mark 1 # 白名单内的源IP放行处理 iptables -t raw -A PREROUTING -i eth0 -m mark --mark 1 -m set --match-set SourceEngineQuery_WhiteList src -j ACCEPT # 丢弃被封禁端口的请求 iptables -t raw -A PREROUTING -p udp -m mark --mark 1 -m set --match-set SourceEngineQuery_BanPort dst,dst -j DROP # 判断端口请求是否超过速率,如超过则添加到封禁端口集合中 iptables -t raw -A PREROUTING -p udp -m mark --mark 1 -m hashlimit --hashlimit-name SourceEngineQuery_BanPort --hashlimit-mode dstip,dstport --hashlimit-above 1500/second --hashlimit-burst 2 --hashlimit-htable-expire 10000 -j SET --add-set SourceEngineQuery_BanPort dst,dst # 判断端口请求是否超过速率,如果没有超过则将当前请求源IP加入白名单(也可以在此添加timeout参数来指定加入到集合的超时时间) iptables -t raw -A PREROUTING -i eth0 -p udp -m mark --mark 1 -m hashlimit --hashlimit-name SourceEngineQuery_CheckPort --hashlimit-mode srcip,dstport --hashlimit-upto 20/second --hashlimit-burst 1 --hashlimit-htable-expire 30000 -j SET --add-set SourceEngineQuery_WhiteList src --timeout 86400
通过本系列的三篇文章,相信你也已经一步步地建立并完善了自己的防御方案。本篇介绍的防御策略是当前比较完美的方案,已在生产环境中得到广泛的验证,在服务器性能允许、且服务器未被上层运营商封禁的情况下,能够有效地阻止绝大多数的攻击流量且保证服务器的正常运行。同时,针对其它游戏攻击也可以对数据包匹配和速率规则稍加改造,即可实现针对该游戏的自定义防御策略。
发表回复