本文为原创文章,转载注明出处,欢迎关注网站https://hkvision.cn

缘起

DNS解析过程这篇文章的缘起

DoH 服务概念

DoH(DNS over HTTPS),指的是将DNS解析的内容使用HTTPS协议进行传输,而不是UDP协议传输,其优势在于隐私和防篡改,可以有效的防止DNS劫持,关于DNS的劫持,可以看其他文章。

DoT 服务器概念

DoT(DNS over TLS),指的是将DNS解析的内容使用TLS协议进行传输,优势和DoH一样

安全性保证

DoH服务和DoT服务对于防篡改和防偷窥的安全保证是通过现有的CA证书体系保证的,其中DoH相较于DoT在TCP协议和DNS协议中间增加了一层HTTPS协议,性能差一点,但是由于HTPP的库非常广泛,协议大家也非常熟悉,因此开发相应的客户端和服务器端会更加方便,更具推广性

函数计算

函数计算是阿里云针对无服务所开通的产品,选择函数计算的原因是阿里云函数计算有较多的免费额度(每个月100w次,40wcu-s),因此对于个人使用而言,除了需要付流量费之外,基本上免费,其流量费大约0.8元/GB,一个月大约会使用50M的流量(每天12小时正常使用电脑)

配置过程

已有项目放在GitHub上,这里详细介绍配置流程

项目架构:

  1. Web服务器:caddy
  2. DNS服务器:CoreDNS
  3. forward:谷歌DNS(8.8.8.8)

下载Caddy,我使用的version 1.x,创建Caddyfile,里面写入这样的内容

:9000 {
    gzip
    rewrite {
        r (.*?)resolver(.*)
        to {2}
    }
    proxy / http://localhost:8053 {
        transparent
    }
    log stdout
}

下载CoreDNS,创建Corefile,里面写入这样的内容

https://.:8053 {
    cache
    log
    errors
    forward . tls://8.8.8.8 tls://8.8.4.4 {
        tls_servername dns.google
        health_check 30s
    }
    whoami
}

创建bootstrap文件

1
2
3
4
5
#!/bin/bash

./coredns &
./caddy &
wait

阿里云上开通函数计算服务

创建template.yml,里面写入这样的内容

 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
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  Doh-Service:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: 'doh-server'
      InternetAccess: true
      # LogConfig: 
      #   Project: doh-server-log
      #   Logstore: doh-server-log-store
    resolver:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index.handler
        # Initializer: index.initializer
        CodeUri: ./code.zip
        Description: 'resolver function'
        Runtime: custom
      Events:
          httpTrigger:
            Type: HTTP
            Properties:
              AuthType: ANONYMOUS
              Methods: ['GET', 'POST', 'PUT', 'DELETE', 'HEAD']

安装fun工具

1
npm install -g @alicloud/fun

然后执行

1
2
fun config # 先配置一下fun工具 
fun deploy

OK,整个配置工程完成

为什么我们forward使用8.8.8.8

首先我一开始使用的是1.1.1.1,那我改到了8.8.8.8的原因是,我发现使用cloudflare的DNS解析和使用国内的DNS解析获得的IP不一样,其中使用cloudflare的IP使用不稳定,我估计是做了线路优化,然而我使用国外的DNS的话,如果网站做了线路优化,则明显会出问题,速度会非常慢,因此我使用了8.8.8.8

关于劫持的问题,首先我们使用了DoT,基本上劫持不会产生,并且我使用了tracert命令追踪了针对8.8.8.8的路线,应该是访问的美国谷歌的IP,虽然不知道为什么时延真的很低(40ms)

客户端

本人使用的客户端是DNSCrypt-proxy,具体怎么使用看文档即可,主要是改一下源就行