简介
我之前一直是使用smartdns作为自己的dns服务的,一直以来smartdns很稳定也很优秀,这是我最推荐使用的dns服务器。但是这次我把自己的dns服务器换成了blocky
https://0xerr0r.github.io/blocky/configuration/
好处
- 支持prometheus
- 支持redis缓存
- 支持域名分流查询
- 日志支持记录到mysql csv postgresql
- 支持doh dot
- 支持block域名
dns架构
为了dns记录不被污染,首先要有一个不被污染的上游服务器,这个我直接在国外云服务器上搭建了一个,并且使用cloudflare作为cdn缓存,大家也可以使用我这个dns服务器作为上游dns服务器
https://dns.bboysoul.cn/dns-query
具体架构如下
不正常域名: pc -> 家中dns服务器 -> cloudflare -> 外网服务器中的nginx -> 外网dns服务器blocky
正常域名: pc -> 家中dns服务器 -> 国内垃圾dns
搭建外网dns服务器
下面是我的服务器配置
upstream:
default:
- 8.8.4.4
- 8.8.8.8
- 1.1.1.1
port: 55
httpPort: 4000
logLevel: info
logFormat: json
logTimestamp: true
caching:
minTime: 12h
maxTime: 24h
prefetching: true
maxItemsCount: 0
redis:
address: 127.0.0.1:6379
password: pass
database: 2
required: true
connectionAttempts: 10
connectionCooldown: 3s
prometheus:
enable: true
path: /metrics
filtering:
queryTypes:
- AAAA
queryLog:
type: csv
target: ./logs
logRetentionDays: 7
upstream 里面配置的就是上游的dns服务器,这里我选择的是谷歌和cloudflare的
port dns端口,这个我乱配置的,因为这个端口对于我没有什么用处
httpPort doh的端口,到时候nginx会反向代理到这里
caching 缓存我配置的是12小时到24小时,家里的可以长点
redis 配置了redis的话,缓存会放到redis中,这样的好处就是你可以在nginx后面挂多个blocky,本身blocky是无状态的
prometheus 开启prometheus的mertics
filtering 过滤ipv6的解析
queryLog 日志记录到csv中并且保留7天
启动脚本
kill -9 $(ps -ef |grep blocky|grep -v grep |awk '{print $2}')
nohup ./blocky &
配置外网服务器中的nginx
下面是nginx的配置
server {
listen 443 ssl http2;
server_name dns.bboysoul.cn;
ssl_certificate cert/cloudflare/cloudflare.pem;
ssl_certificate_key cert/cloudflare/cloudflare.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的类型。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
location /{
proxy_pass http://127.0.0.1:4000;
access_log logs/dns.log main;
client_max_body_size 1000m;
}
}
配置内网dns服务器
下面是配置
upstream:
default:
- 223.5.5.5
- 114.114.115.115
- 114.114.114.114
- 223.6.6.6
- https://dns.bboysoul.cn/dns-query
bootstrapDns: 223.5.5.5
upstreamTimeout: 2s
customDNS:
mapping:
redis.xxx.com: 10.10.100.240
conditional:
mapping:
feedly.com: https://dns.bboysoul.cn/dns-query
githubusercontent.com: https://dns.bboysoul.cn/dns-query
google.com.hk: https://dns.bboysoul.cn/dns-query
docker.com: https://dns.bboysoul.cn/dns-query
cloudfront.net: https://dns.bboysoul.cn/dns-query
wikipedia.org: https://dns.bboysoul.cn/dns-query
youtube.com: https://dns.bboysoul.cn/dns-query
twitter.com: https://dns.bboysoul.cn/dns-query
facebook.com: https://dns.bboysoul.cn/dns-query
instagram.com: https://dns.bboysoul.cn/dns-query
port: 53
httpPort: 4000
logLevel: info
logFormat: json
logTimestamp: true
caching:
minTime: 48h
maxTime: 96h
prefetching: true
maxItemsCount: 0
redis:
address: 127.0.0.1:6379
password: pass
database: 2
required: true
connectionAttempts: 10
connectionCooldown: 3s
prometheus:
enable: true
path: /metrics
filtering:
queryTypes:
- AAAA
queryLog:
type: csv
target: ./logs
logRetentionDays: 7
upstream 中除了外网的dns,还有就是国内的dns了
bootstrapDns 这个dns是用来解析doh服务器的域名的
customDNS 就是内网自定义的一些解析
conditional 定义比如feedly.com使用https://dns.bboysoul.cn/dns-query这个dns服务器来解析,这样就不会拿到被污染的解析了
caching 这里我时间拉长了这样会减少请求上游的dns服务器速度会更快
注意
blocky 0.19在请求doh服务器的时候是不带host header的,所以如果doh服务器是在nginx后面的,可能会有问题,详细的可以看
https://github.com/0xERR0R/blocky/pull/580
欢迎关注我的博客www.bboy.app
Have Fun