前言

最近我的 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 服务

比如阿里:

比如腾讯:

示例

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
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
DNS 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 -e echo "[1/6] 安装 cloudflared..."
if ! command -v cloudflared >/dev/null 2>&1; then
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -O /tmp/cloudflared.deb
sudo dpkg -i /tmp/cloudflared.deb || sudo apt-get install -f -y
rm -f /tmp/cloudflared.deb
else
echo "cloudflared 已安装,跳过。"
fi CLOUDFLARED_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
EOF echo "[3/6] 重新加载 systemd 并启用服务..."
sudo systemctl daemon-reexec
sudo systemctl enable --now cloudflared-dns echo "[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
EOF echo "[5/6] 重启 systemd-resolved..."
sudo systemctl restart systemd-resolved echo "[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. 自动重启相关服务并检查生效

在Linux系统上一键配置DoH,解决DNS解析被污染的更多相关文章

  1. Oracle 11g客户端在Linux系统上的配置步骤详解

    Oracle 11g客户端在Linux系统上的配置步骤详解 2011-07-26 10:47 newhappy2008 CSDN博客 字号:T | T 本文我们主要介绍了Oracle 11g客户端在L ...

  2. Linux系统上安装配置MAVEN

    1,下载maven 首先进入maven下载目录:http://maven.apache.org/download.cgi 2,上传maven到linux系统 以下操作路径都是本人习惯,目录可以随意更改 ...

  3. 在Linux系统上安装配置ant环境

    1.从官网http://ant.apache.org/bindownload.cgi下载tar.gz版ant到本地电脑上 2.通过WinSCP工具将本地电脑上的ant压缩包上传至Linux服务器的/u ...

  4. 大数据学习之路——环境配置(2)——mysql 在linux 系统上安装配置

    1.安装参考网址: https://blog.csdn.net/IronWring_Fly/article/details/103637801   设置新秘密: mysqladmin -u root ...

  5. VM下的linux系统上不了网?? 使用putty远程登录不上linux的解决方法?

    背景:昨晚想尝试一下用putty远程登录我的linux系统,悲剧的是,我竟然连接不上,显示 connection refused   ,连接被拒绝.于是我就想看看能不能在linux下看看能不能访问百度 ...

  6. Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务

    一.引言 今天本来没有打算写这篇文章,当初我感觉使用这个工具应该很简单,下载的过程也不复杂,也没有打算记录下来.但是在使用的过程中还是出现了一些问题,为了给第一次使用Redis Desktop Man ...

  7. Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务(转载6)

    Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务 一.引言 今天本来没有打算写这篇文章,但是,今天测试Redis的时候发现了两个问题 ...

  8. linux系统上安装java

    linux系统上安装java   如何在ubuntu server上安装java(jre或jdk),主要注意以下几点: 1.下载你想要的java版本压缩包. JRE下载:http://java.com ...

  9. (转)Linux系统基础网络配置老鸟精华篇

    Linux系统基础网络配置老鸟精华篇 原文:http://blog.51cto.com/oldboy/784625 对于linux高手看似简单的网络配置问题,也许要说出所以然来也并不轻松,因此仍然有太 ...

  10. linux系统上安装svn服务器 环境linux+nginx+svnserver

    系统:Ubuntu 12.04 64位 lnmp环境 集成软件:PHP5.4.27.Nginx1.6.0.MySQL5.5.37 阿里云server svnserver有2种执行方式:独立server ...

随机推荐

  1. 卷积神经网络(LeNet)

    博客地址:https://www.cnblogs.com/zylyehuo/ 一.导入所用库 import torch from torch import nn from d2l import tor ...

  2. 02-Ble Paring(配对)和Bonding(绑定)的概念及流程

    基本概念 二者都是在蓝牙链路(LL)层实现的一种射频通信安全机制,需要注意的是,不经过配对和绑定蓝牙双方也是可以进行数据传输的.也就是说配对和绑定只是在蓝牙连接明文传输的 基础上实现了加密传输, 且由 ...

  3. ERP系统是什么?ERP系统如何与数据库对接?

    ERP系统的定义 1.企业ERP系统标准的定义来自于其英文原意,即企业资源规划(Enterprise Resource Planning).企业资源计划系统是一种集成的软件系统,旨在帮助企业管理其资源 ...

  4. RestCloud ETL社区 九月精选问答

  5. POLIR-Laws-Business Insurance: 保险合同欺诈: 拼多多平台 与 中国人寿财险 的 "正品险"(套路)。

    本人 已经电话联系过"ACA/北美电器"官方客服0756-3390136与4007006698, 得到明确的"官方鉴定标准"之一: "没有镭射防伪贴的 ...

  6. Advanced Algebra高等代数 - 多元建模有多个方程(多元线性)组成 - 使用 NumPy 实现 矩阵的初等行变换:

    线性:指多元变量的每一元变量都是1次方(可以将高于1次方的元,以新一元变量代换,求解再做开方运算) 将应用问题转化为 多个多元线性方程,并成一组: 由多元线性方程组 抽出 增广矩阵,并以"消 ...

  7. 恢复被Windows自动禁用的WIFI适配器

    副标题:适配器Intel(R)WiFi6 AX201 160MHz 被Windows禁止使用 副标题:华硕飞行堡垒WIFI适配器恢复使用 相信不少朋友都遇到过突然间电脑上的WIFI无法使用,打开一查看 ...

  8. CAD插件『PDF转CAD格式』安装教程

    在工程设计领域,常规流程是将完成的CAD图纸直接转换为PDF格式或输出为纸质蓝图进行分发.由于PDF文件具有跨平台兼容性强.防篡改等特性,在工程交付环节被广泛采用.但当需要对既有图纸进行二次修改时,P ...

  9. MySQL事务原理:从ACID到隔离级别的全解析

    事务的四个特性ACID 原子性(Atomicity):语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的:实现主要基于undo log 持久性(Durability):保证 ...

  10. Sql Server和PostgreSQL的数据库常用内置函数、数据类型的区别

    Sql Server和PostgreSQL的数据库内置函数的区别 名称 Sql Server PostgreSQL 日期 DATEPART DATE_PART 是否为空 ISNULL COALESCE ...