如何解决 dnsmqsq 放到外网后,不停收到大量无效查询请求?

2016-10-24 16:37:16 +08:00
 EricInBj
dnsmasq[23209]: query[A] vomcpgbdkwz.fuxi003.com from 117.175.74.185
dnsmasq[23209]: query[A] wooeqcywcih.fuxi003.com from 83.230.151.89
dnsmasq[23209]: query[A] mmqnzhezkpz.fuxi002.com from 49.208.62.226
dnsmasq[23209]: query[A] itnnfblvolb.fuxi002.com from 66.150.209.166
dnsmasq[23209]: query[A] qjggtqzpbuh.fuxi003.com from 54.166.105.59


大量这样的,都是些无效的二级域名,看上去是被利用来攻击 fuxi002 的 ns 服务器了?

如何解决这个问题呢?
4998 次点击
所在节点    DNS
3 条回复
Siril
2016-10-24 17:52:46 +08:00
如果 dnsmasq 不是跑在路由上那种,(没有严格的资源限制)
可以考虑 换 bind 9.10 简单点直接 docker pull ventz/bind
然后可以用其自带的 rate-limit 之。
EricInBj
2016-10-25 09:27:02 +08:00
@Siril rate-limit 是针对固定来源 ip 的吧?像我碰到的这样的,随机产生的二级域名,随机的来源 IP ,好像不行?
EricInBj
2016-10-25 17:53:44 +08:00
刚才抽空搞了一下脚本,可以用下面的语句找出有问题的域名:

```shell
grep query /var/log/dnsmasq.log|awk '{if(substr($9,1,2)!="10"){print $7}}'|awk -F"." '{if(NF==3){print $2"."$3}}'|sort|uniq -c|sort -n
```

能得到这样的结果:
```shell
一堆正常的
6900 web-175.com
209091 scr888.com
```


把那哥们的脚本简化了一下:
```shell
#!/bin/bash
create_iptables(){
name=$1
string=$( echo $name|awk -F '.' '{for(i=1;i<=NF;i++){printf("|%02d|%s",length($i),$i)}}')
string="$string|00|"
echo -e "rule for \e[1;32m $name \e[mquery:"
eval 'echo "iptables -t raw -A PREROUTING -p udp --dport 53 -m string --hex-string \"$string\" --algo bm -j LOG --log-prefix \"drop an dns query \""'
eval 'echo "iptables -t raw -A PREROUTING -p udp --dport 53 -m string --hex-string \"$string\" --algo bm -j DROP"'
}

for domain in $@
do
echo "DROP $domain rule:"
create_iptables $domain
done
```

这样需要经常执行脚本得到恶意解析的域名,然后再用上面的脚本来加 iptables ,效果还是不错的,日志里看到不少 drop 掉的请求:
```shell
/var/log/messages:Oct 25 13:40:53 ip-172-133-15-130 kernel: drop an dns query IN=eth0 OUT= MAC=d0:0d:0d:0b:e5:9e:50:e5:49:33:70:e8:08:00 SRC=19.181.62.199 DST=172.133.15.130 LEN=69 TOS=0x00 PREC=0x00 TTL=237 ID=50750 DF PROTO=UDP SPT=25649 DPT=53 LEN=49
/var/log/messages:Oct 25 13:40:53 ip-172-133-15-130 kernel: drop an dns query IN=eth0 OUT= MAC=d0:0d:0d:0b:e5:9e:50:e5:49:33:70:e8:08:00 SRC=106.105.134.235 DST=172.133.15.130 LEN=69 TOS=0x00 PREC=0x00 TTL=234 ID=60038 DF PROTO=UDP SPT=22975 DPT=53 LEN=49
/var/log/messages:Oct 25 13:40:56 ip-172-133-15-130 kernel: drop an dns query IN=eth0 OUT= MAC=d0:0d:0d:0b:e5:9e:50:e5:49:33:70:e8:08:00 SRC=98.80.54.16 DST=172.133.15.130 LEN=69 TOS=0x00 PREC=0x00 TTL=230 ID=3894 DF PROTO=UDP SPT=63664 DPT=53 LEN=49
```


后续再有必要的话,就把脚本再完善一下,整合成一个脚本,扔 crontab 里 1 小时跑一次,把解析数量超级多的全都干掉,然后清 dnsmasq.log 。

PS ,我那个 !="10" 的判断是忽略内部 IP 的 query 记录。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/315063

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX