更新了下我的dns服务

简介

我之前一直是使用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服务器

下面是我的服务器配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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天

启动脚本

1
2
kill -9 $(ps -ef |grep blocky|grep -v grep |awk '{print $2}')
nohup ./blocky &

配置外网服务器中的nginx

下面是nginx的配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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服务器

下面是配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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