为Google DoH准备反向代理

前面有一篇文章提到了利用dns.google.com服务配合dingo客户端实现本机的纯净DNS解析,但Dingo的使用前提为正确访问dns.google.com,但在国内又不能顺利访问。本篇文章就是为了解决这个问题而写。

原理也很简单,架设一个nginx实现API层面的反向代理。所以你需要一台在海外正常访问Google的服务器。本文拿CentOS 7做例子。

获取API地址

首先我们得获取Google DNS的API地址,通过访问dns.google.com后查询任何域名,比如g.cn,可在页面最底下发现一个链接:https://dns.google.com/resolve?name=g.cn,这个就是API的网址,打开查看我们可以发现以json形式呈现的内容供客户端使用。所以我们仅需要代理/resolve这个路径即可。

申请Let’s Encrypt证书

到这一步你需要一个指向自己服务器的域名,假设我们的域名是dns.example.com,在自己部署的时候记得要换掉所有的example域名。以下操作均为root用户。

安装依赖:

yum install python-virtualenv -y

生成并激活虚拟环境

virtualenv /root/certbotenv
source /root/certbotenv/bin/activate #激活并进入虚拟环境
pip install certbot-nginx certbot

申请域名证书

certbot certonly --agree-tos -d dns.example.com --nginx #第一次申请可能要填写email地址用于通知证书过期。

证书有效期3个月,记得续,进入虚拟环境后,命令为

certbot renew

再重启nginx就行了。

架设Nginx

安装好Nginx后在/etc/nginx/conf.d下创建一个dns.conf的文件,输入以下内容:

server {
    listen 80;
    listen [::]:80;
    server_name dns.example.com;

    rewrite ^ https://$http_host$request_uri? permanent;

    access_log off;
    error_log off;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name dns.example.com;

    gzip_vary on;
    add_header X-Frame-Option "SAMEORIGIN";

    ssl_certificate /etc/letsencrypt/live/dns.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dns.example.com/privkey.pem;
    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=3153600;";
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location /resolve {
        proxy_pass https://dns.google.com;
    }

    location / {
        return 403;
    }

    access_log /var/log/nginx/dns.log;
    error_log /var/log/nginx/dns.err.log;
}

使用nginx -t测试语法,没问题的话可以启动服务了

systemctl start nginx

试试https://dns.example.com/resolve?name=g.cn,如果能看到json内容,即为成功。

作者:小老外

我还需要不断地学习。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据