前面有一篇文章提到了利用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内容,即为成功。