上一篇文章《防御Source Engine Query泛洪攻击(一)》提到使用限速模块对单IP进行请求限速,但若攻击者使用伪造的IP发送数据包,那么限速模块就不能很好地起到作用了。
在没有很好的方法防御的情况下,可以使用主动丢弃被DDoS攻击的端口的查询包(即类似于封禁端口)的方法来防止查询包到达游戏服务器,防止产生反射流量影响服务器的上行带宽,同时已在游戏内的玩家也不会受到影响。但这样也会导致被攻击时其它玩家无法搜索到服务器,需要配合其它方法加入白名单访问。
- 首先添加标记查询包的规则。
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
- 然后用ipset新建一个集合,用于存储封禁的端口。
timeout
超时时间代表集合内的元素在多少时间后会被清除,可根据个人需求修改。ipset create SourceEngineQuery_BanPort hash:ip,port timeout 5
如果没有安装ipset,可以先安装(以ubuntu下apt安装方式为例)。
apt-get install ipset
- 然后添加端口封禁规则,封禁在上述集合中的端口。
iptables -t raw -A PREROUTING -p udp -m mark --mark 1 -m set --match-set SourceEngineQuery_BanPort dst,dst -j DROP
- 添加速度检测规则,把超过设定速度的端口加入集合。
其中
hashlimit-above
和hashlimit-burst
可根据个人情况调整。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
- 这样一来封禁被攻击端口的查询的规则就完成了,可以使用以下命令查看ipset的情况。
ipset list SourceEngineQuery_BanPort
发表回复