2020年2月5日

\| [技术](/categories/%E6%8A%80%E6%9C%AF) [阿里云](/categories/%E9%98%BF%E9%87%8C%E4%BA%91)

|228 阅读

文章目录

本文为原创文章,转载注明出处,欢迎关注网站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小时正常使用电脑)

配置过程

项目架构:

  1. Web服务器:caddy

  2. DNS服务器:CoreDNS

  3. forward:谷歌DNS(8.8.8.8)

下载[Caddy](https://caddyserver.com/),我使用的`version 1.x`,创建Caddyfile,里面写入这样的内容

:9000 {
    gzip
    rewrite {
        r (.*?)resolver(.*)
        to {2}
    }
    proxy / http://localhost:8053 {
        transparent
    }
    log stdout
}
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
``` |

去[阿里云](https://aliyun.com)上开通函数计算服务

创建`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
``` | ```yml
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
``` | ```shell
npm install -g @alicloud/fun
``` |

然后执行

|              |                                                   |
| ------------ | ------------------------------------------------- |
| ```
1 2
``` | ```shell
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`](https://github.com/DNSCrypt/dnscrypt-proxy),具体怎么使用看文档即可,主要是改一下源就行