基于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

参考:

Ubuntu部署nginX

通过APT安装nginx

sudo apt update
sudo apt upgrade
sudo apt install nginx

编辑nginx的配置文件

//nginx配置的主文件
sudo vim /etc/nginx/nginx.conf
//nginx.conf默认引用了/etc/nginx/conf.d/中的所有.conf文件,所以建议以在conf.d中添加文件的形式添加web服务配置
sudo vim /etc/nginx/conf.d/vm.conf

以基本的web服务为例,vm.conf的配置内容可以是:

server {

    # 使用的端口,及是否作为默认服务
    listen    16666 default_server;

    # 服务器名称,同一个IP的同一个端口可以设置为不同的域名,nginx可以根据用户访问的域名的不同      提供不同的网站服务。
    server_name yttj.f3322.net:16666;

    # 文件的位置
    location / {

        # 文件根目录
        root     /usr/share/nginx/html;

        # 主页文件名
        index    index.html;
    }
}

配置完成后,即可启动nginx

sudo systemctl start nginx
#启用开机自动启动
sudo systemctl enable nginx

Ubuntu的防火墙默认开启,还应设置防火墙开放服务的端口

sudo ufw allow 16666

WPSuperCache的Nginx配置

使用WPSuperCache必须令WordPress使用固定链接,而WordPress的固定链接在Nginx条件下必须修改nginx.conf(否则页面404),添加如下代码:

location / {
try_files $uri $uri/ /index.php?$args;
}

(而在Apache中则是一个名为rename的功能)。

systemctl配置脚本

vim /usr/lib/systemd/system/nginx.service
chmod +x /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start nginx.service