当前位置: 首页 > news >正文

在Linux系统上一键配置DoH,解决DNS解析被污染

前言

最近我的 swag 服务突然证书 renew 失败

诊断了一下发现原来是无法解析 acme-v02.api.letsencrypt.org 域名

换了几个 DNS 都不行,应该是 DNS 被污染或者劫持了

这时我才意识到不上 DoH/DoT 怕是没办法了🤣

本文记录一下用一种简单的方法在服务器上实现 DoH/DoT

DoH/DoT

简单科普一下,DNS 是用来把网站解析到IP地址的协议

正常的 DNS 是明文传输,很容易被污染或者劫持

DoH 是 DNS over HTTPS,走加密的 HTTPS 流量(443 端口),看起来就像访问网页一样,不容易被污染或者劫持

除此之外还有 DoT(DNS over TLS)、ODoH(Oblivious DoH,隐私更强),都是更加安全的域名解析方式

cloudflared

https://github.com/cloudflare/cloudflared

这是 Cloudflare 官方开源的一个 Cloudflare Tunnel 客户端,用 go 语言开发的,非常容易安装部署。

简介

这个客户端不仅可以接入 Tunnel 实现内网穿透,还可以实现 DoH 代理

本文使用这个工具来实现 DoH 配置

安装

Ubuntu Server 的官方软件源没有这个工具

需要添加 Cloudflare 官方 APT 源

# 1. 添加 GPG key
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg > /dev/null# 2. 添加软件源
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared jammy main" | sudo tee /etc/apt/sources.list.d/cloudflared.list# 3. 更新并安装
sudo apt update
sudo apt install cloudflared

也可以直接下载 DEB 包安装

# 1. 下载 cloudflared 最新 deb 包
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb# 2. 安装
sudo dpkg -i cloudflared-linux-amd64.deb# 3. 验证
cloudflared --version

测试

安装好以后,运行:

sudo cloudflared proxy-dns --address 127.0.0.1 --port 5053

测试一下:

dig @127.0.0.1 -p 5053 acme-v02.api.letsencrypt.org

如果能返回解析结果,就说明成功了

这里默认使用的是 Cloudflare 官方的 DoH

如果不行的话,可以换成国内的 DoH 服务

比如阿里:

  • https://223.5.5.5/dns-query
  • https://223.6.6.6/dns-query

比如腾讯:

  • https://doh.pub/dns-query
  • https://dns.pub/dns-query

示例

sudo cloudflared proxy-dns --address 127.0.0.1 --port 5053 \--upstream https://223.5.5.5/dns-query \--upstream https://223.6.6.6/dns-query

用 dig 或者 nslookup 之类的工具测试没问题的话,可以进入下一步。

添加服务

创建 systemd service,让 cloudflared 常驻运行

sudo nano /etc/systemd/system/cloudflared-dns.service

内容:

[Unit]
Description=Cloudflared DNS over HTTPS proxy
After=network.target[Service]
ExecStart=/usr/local/bin/cloudflared proxy-dns --address 127.0.0.1 --port 5053 \--upstream https://223.5.5.5/dns-query \--upstream https://223.6.6.6/dns-query \--upstream https://doh.pub/dns-query \--upstream https://dns.pub/dns-query
Restart=always
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE[Install]
WantedBy=multi-user.target

应用 & 启动

sudo systemctl daemon-reexec
sudo systemctl enable --now cloudflared-dns

配置DNS

使用 drop-in 配置的方式来设置 DNS

不要直接改 /etc/systemd/resolved.conf

sudo mkdir -p /etc/systemd/resolved.conf.d
sudo nano /etc/systemd/resolved.conf.d/dns.conf

内容:

[Resolve]
DNS=127.0.0.1:5053
FallbackDNS=223.5.5.5 223.6.6.6
DNSSEC=no

重启服务

sudo systemctl restart systemd-resolved

检查生效情况

resolvectl status

可以看到以下输出

$ resolvectl status
GlobalProtocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupportedresolv.conf mode: stubDNS Servers: 127.0.0.1:5053
Fallback DNS Servers: 223.5.5.5 223.6.6.6

这时候就搞定了,docker容器也会默认使用系统的这个 DNS

此时再去 swag renew 证书,就成功了✌️

一键脚本

老规矩,我让大模型爷爷帮忙写了一个一键配置DoH的脚本

默认使用从官方 GitHub 仓库下载 deb 包安装的方式

可以直接执行

bash -c "$(curl -fsSL https://gist.github.com/Deali-Axy/8b2ad8e5a601f2c43f6e7debdfb0aa29/raw/3c57dbce7dc0e224ad4ad35606f15cbc34d4810e/install-doh.sh)"

脚本源码

#!/usr/bin/env bash
set -eecho "[1/6] 安装 cloudflared..."
if ! command -v cloudflared >/dev/null 2>&1; thenwget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -O /tmp/cloudflared.debsudo dpkg -i /tmp/cloudflared.deb || sudo apt-get install -f -yrm -f /tmp/cloudflared.deb
elseecho "cloudflared 已安装,跳过。"
fiCLOUDFLARED_BIN=$(command -v cloudflared)
echo "cloudflared 路径: $CLOUDFLARED_BIN"echo "[2/6] 创建 systemd service..."
sudo tee /etc/systemd/system/cloudflared-dns.service >/dev/null <<EOF
[Unit]
Description=Cloudflared DNS over HTTPS proxy
After=network.target[Service]
ExecStart=${CLOUDFLARED_BIN} proxy-dns --address 127.0.0.1 --port 5053 \--upstream https://223.5.5.5/dns-query \--upstream https://223.6.6.6/dns-query \--upstream https://doh.pub/dns-query \--upstream https://dns.pub/dns-query
Restart=always
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE[Install]
WantedBy=multi-user.target
EOFecho "[3/6] 重新加载 systemd 并启用服务..."
sudo systemctl daemon-reexec
sudo systemctl enable --now cloudflared-dnsecho "[4/6] 配置 systemd-resolved..."
sudo mkdir -p /etc/systemd/resolved.conf.d
sudo tee /etc/systemd/resolved.conf.d/dns.conf >/dev/null <<EOF
[Resolve]
DNS=127.0.0.1:5053
FallbackDNS=223.5.5.5 223.6.6.6
DNSSEC=no
EOFecho "[5/6] 重启 systemd-resolved..."
sudo systemctl restart systemd-resolvedecho "[6/6] 检查 DNS 配置..."
resolvectl status | grep "DNS Servers"echo "✅ 安装完成!现在系统 DNS 已经走 DoH。"

将以上代码保存为 install-doh.sh

运行

chmod +x install-doh.sh
./install-doh.sh

脚本会自动:

  1. 下载并安装 cloudflared
  2. 写入 systemd 服务文件并启动
  3. 配置 systemd-resolved
  4. 自动重启相关服务并检查生效
http://www.jsqmd.com/news/7181/

相关文章:

  • 完整教程:C 语言各种指针详解
  • 51单片机-实现DAC(PWM)数模转换PWM控制呼吸灯、直流电机实验教程 - 教程
  • Elasticsearch集群监控信息(亲测) - 教程
  • 基于Java springboot农村政务服务管理便捷的系统(源码+文档+运行视频+讲解视频)
  • Matplotlib子图布局与响应式设计实战:GridSpec与CSS框架深度结合 - 教程
  • SQL:concat函数(连接字符串)
  • 2025 北京地下室防潮品牌最新推荐排行榜:TOP3 实力品牌出炉,精准解决地下空间潮湿难题
  • python脚本统计fastq数据的GC含量
  • 第一次软件工程作业
  • 2025 年仿石漆品牌最新推荐排行榜:聚焦真石漆仿石漆,水包砂仿石漆,冠晶石仿石漆,外墙仿石漆,多彩仿石漆供采购参考
  • 基于Hadoop的美妆产品网络评价的数据采集与分析-django+spider - 指南
  • 关于数颜色
  • 诚信液压阀块定制厂家推荐榜:实力制造与精准工艺口碑之选
  • 浅谈 Bakas Trick / 不带删尺取 / 对顶栈
  • ESP32与SPI网口芯片DM9051ANX模块硬件引脚接法与ESP-IDF设定参数
  • 聚变堆:中国BEST装置全面开建
  • 如何用pivotby函数实现数据透视(2)
  • 2025 年彩钢板厂家 TOP 企业品牌推荐排行榜,复合彩钢板,保温彩钢板,耐腐蚀彩钢板,净化彩钢板推荐这十家公司!
  • AT_agc020_d [AGC020D] Min Max Repetition
  • 深入解析:ECMAScript 2025 有哪些新特性?
  • tnkstat3e-merge-0
  • 完整教程:Nginx反向代理核心原理揭秘
  • 详细介绍:五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的对象名称和转义字符
  • @RequestParam 什么时候可以省略?
  • 段页式管理方式
  • 完整教程:深度解析ZStack Cloud v5.4.0 LTS 基础架构三大核心突破
  • 深入解析:精读C++20设计模式:结构型设计模式:装饰器模式
  • *和 内存和地址 实例代码
  • list 容器 listr容器与vector容器 list 示例代码
  • advance 函数