EasyMosdns EDNS开源方案

【前言】

EDNS就是在遵循已有DNS消息格式的基础上增加字段,来支持更多的DNS请求业务。ECS则是EDNS的客户端子网扩展,会将用户的子网信息传递给权威DNS,做更精确的DNS解析和流量调度。掩码越长地址信息越精确,掩码越短用户隐私效果越好。

EasyMosdns是基于Mosdns制作的EDNS方案,通过脚本降低使用门槛。

项目地址 https://github.com/pmkol/easymosdns


该方案完美替代了我之前写的endsplus方案,已将生产环境的DNS进行升级

DoH体验地址 [查看功能]
https://doh.apad.pro/dns-query

【性能】

分享一下我搭建的DoH服务器数据:

日访问人数 1000+  日处理请求 200w+
Intel Xeon Processor系列的单核2.5G主频CPU
mosdns + nginx +redis的CPU峰值基本不会超过5%

与 overture + dnsproxy 的早期方案相比
在日访问人数约200时 CPU的峰值就已经超过2%了

这是一个让我非常惊喜的结果。


【功能】

域名列表做一级判断 + IP列表做二级判断的主逻辑,解决DNS污染问题

udpme这种特殊转发模式,则可以直接规避掉对googledns的抢答,不用再去使用代理访问 8.8.8.8 / 8.8.4.4

缓存机制也很强大,可以在保留域名原有TTL的基础上,自动在后台发送请求更新数据,搭配redis的持久化机制,解决了缓存命中率与数据新鲜度的矛盾问题

至于屏蔽广告、屏蔽海外域名的ipv6等很多优化功能,都能通过插件组合实现

最后想说的就是ECS功能,用好了可以优化很多在中国大陆没有CDN的网站访问速度

举一个经典的案例,将github.com强制使用中国台湾的ECS时,将不再解析到新加坡节点,而是会解析到日本节点,在没有代理的情况下基本也是秒开的。

唯一遗憾的是,部分域名的NS服务器不看ECS只看请求来源IP,例如知名的akamai,这会导致如果DNS服务器距离访问者距离较远,会解析到较远的CDN节点,如果想解决这个问题,只有将DNS架设在内网,好在国内使用akamai的这类CDN网站并不多,并不会有太大影响。


【搭建】

使用CentOS7示例,如何使用EasyMosdns快速搭建EDNS服务器

下载后解压缩 mosdns与easymosdns

yum install -y unzip wget
VERSION=$(curl -s https://api.github.com/repos/IrineSistiana/mosdns/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest mosdns version is $VERSION"
wget https://github.com/IrineSistiana/mosdns/releases/download/$VERSION/mosdns-linux-amd64.zip
wget https://mirror.apad.pro/dns/easymosdns.tar.gz
unzip mosdns-linux-amd64.zip "mosdns" -d /usr/local/bin
chmod +x /usr/local/bin/mosdns
tar xzf easymosdns.tar.gz
mv easymosdns /etc/mosdns
chmod +x /etc/mosdns/tools/config-reset

安装 mosdns与easymosdns

/etc/mosdns/tools/config-reset
mosdns service install -d /etc/mosdns -c config.yaml
mosdns service start

如果DNS服务器搭建在内网 还需关闭ECS

/etc/mosdns/tools/ecs-off

最后,开启防火墙UDP/TCP的53端口即可(略)

此时一台EDNS服务器就搭建完成了!高级操作请参考Github项目地址上的说明。