RouterOS使用DNS转发功能实现域名分流解析
最后更新于2023年05月29日, 已528天没有更新。未经许可,禁止转载。
20220718更新:更新域名匹配正则,添加每周更新脚本。由于缓存查询时间增加过多,此方法不推荐,详情参考文章后部。
之前写过两篇文章介绍实现域名分流解析的方案,一个是使用dnsmasq基于大陆域名白名单分流解析域名,另一个是使用overture替换dnsmasq做域名分流解析。
这次介绍的方案与dnsmasq类似,默认使用境外dns服务器解析,境内域名使用白名单转发到境内dns服务器。
routeros在v6.47中增加了静态条目规则type属性,其中包含FWD类型。FWD类型可以将指定域名转发到指定的DNS服务器。
以下以routeros v7.3.1的chr版本为环境,dns服务器是8.8.8.8和8.8.4.4
增加alicdn.com域名及子域名转发给114.114.114.114解析。正则匹配如下
^(.*\.)?alicdn\.com$
命令如下
/ip/dns/static/add regexp="^(.*\\.)?alicdn\\.com\$" forward-to=114.114.114.114 ttl=300s
详细命令请参考官方wiki。
这里使用dnsmasq-china-list做白名单转发给境内dns服务器解析,生成脚本如下
/ip/dns/static/remove [/ip/dns/static/find type=FWD]
/ip/dns/static/add regexp="^(.*\\.)?0-100\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?0-6\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?00\\.net\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?000\\.link\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?00000\\.host\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?00042\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?00058\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?0006266\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?0007\\.net\$" forward-to=114.114.114.114 ttl=300s
...
脚本有接近7万行,使用intel i5-7200u分配2逻辑核心的虚拟机首次执行需要约3.5分钟,阿里云1核心服务器首次执行需要2.5分钟,再次执行需要7.5分钟,再次执行时会先删除type=FWD的静态条目,脚本执行时cpu占用100%,所以cpu性能较差时需要耐心等待。
这里下载每周自动生成的脚本。
导入方法:使用
/import dns.rsc
导入,等待完成。
使用RouterOS自带dns转发功能做域名分流解析优点是可以抛弃openwrt或者linux服务器的小尾巴,实现routeros单一系统完成全部网络功能,特别适合不支持直通的cpu裸装routeros的情况。
缺点和使用dnsmasq分流解析一样,境内域名列表更新不及时,可能导致一些新的域名解析成境外地址。
另外,导入dns转发脚本后不要使用webfig打开dns静态列表,条目太多会卡死。
附:自动生成dns.rsc脚本
#!/bin/bash
echo "/ip/dns/static/remove [/ip/dns/static/find type=FWD]">/tmp/dns.rsc && curl -s https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf|sed '/#/d'|sed 's/\/114.114.114.114//g'|sed 's/\./\\\\./g'|sed 's/server=\//\/ip\/dns\/static\/add regexp=\"^(.*\\\\.)?/g'|sed 's/$/&\\$\" forward-to=114.114.114.114 ttl=300s/g'>>/tmp/dns.rsc
发现问题:
1,routeros的dns本地缓存查询时间显著增加,使用dig命令发现未导入时缓存查询时间小于1ms,导入后缓存查询时间约28ms,白名单域名反而查询时间更短。
2,在dns设置增加缓存到1gb后观察,发现导入后占用约180mb缓存。另可以通过观察缓存大小来大致确定导入进度。
这个操作的问题在于无论服务器是否可用,都会无脑的转发过去。不像一个真正的dns服务器可以轮询上游。另一方面static是顺序执行的,且regexp比name优先级高。
最后域名列表还有很多优化空间,比如做一条 \.cn$ 和一条 .*cdn.* ,可以节省下好多多。
[ken@MikroTik] > /ip/dns/static/add regexp=".*\\.alicdn\\.com\$" forward-to=114.114.114.114 ttl=300s
expected command name (line 1 column 4)
这里报错,不能用/分割,要用空格,请问怎么解决
版本6.49