基于Web服务器搭建DoH服务器

本次配置DNS over HTTPS采用Ubuntu 20系统,需要安装dns-over-https和nginx

首先是dns-over-https的安装,在此使用在服务器编译安装的方法:

//安装golang
apt update
sudo apt install golang-1.22

//为go配置bash
sudo vim ~/.bashrc

//在文件末尾添加并:wq保存:
export PATH=$PATH:/usr/lib/go-1.22/bin

//应用新的bash配置文件
source ~/.bashrc

//更换go的代理(可选的)
go env -w GOPROXY=https://goproxy.cn

//清理go mod缓存(可选的)
go clean -modcache && go mod tidy

//安装git(可选的)
sudo apt install git

//克隆dns-over-https源代码并进入目录
git clone https://github.com/m13253/dns-over-https.git
cd dns-over-https

//编译并安装
make
sudo make install

//编辑dns-over-https配置文件并:wq保存
sudo vim /etc/dns-over-https/doh-server.conf
/*
在配置文件中,需要注意的是listen的端口,在此使用默认的8053端口;
此外还有http的路径,在此使用默认的"/dns-query";
需要修改的是upstream地址,即doh的上游服务器地址,在此使用"udp:127.0.0.53:53"(即Linux内建的DNS缓存,地址前端必须添加"udp:"前缀)。
特别的是,由于构建本DoH服务器的主要目的是规避DNS污染,而不是防追踪,所以Ubuntu系统的DNS上游直接采用了阿里云提供的内网DNS服务器,以最优化响应速率和稳定性。
*/

//启动doh-server并检查运行状态
sudo systemctl start doh-server
sudo systemctl status doh-server.service

//安装nginx
apt install nginx

//配置nginx.conf并:wq保存
sudo vim /etc/nginx/nginx.conf

关于nginx.conf的配置,在此详细描述。本次搭建的DoH服务与Web服务共生,虽然二者都采用443端口进行HTTPS通信,但可以通过路径做区分。

首先,在http块中添加转发上游:

upstream dns-backend {
    server 127.0.0.1:8053;
}

接着配置server做转发,在已经可以访问的server块(即已经配置好ssl和文件路径等的web server)中添加:

location /dns-query {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_redirect off;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_read_timeout 86400;
        proxy_pass http://dns-backend/dns-query ;
        }

关于nginx的ssl的配置及ssl证书的签发,在本文就不多讲解了,可自行了解。也可查看结尾的参考教程。

配置完成后,启动nginx即可:

sudo service nginx start

之后可以在设备上测试DoH解析,最终的地址为:https://yourdomain.com/dns-query

参考: