@ -38,7 +38,7 @@ DNS 请求在通过 AdGuardHome 处理后,发往分流器 Diverter ,在这
ClearDNS 支持多种 DNS 协议,首先是常规 DNS ,即基于 UDP 或 TCP 的明文查询,该方式无法抵抗 DNS 污染,对部分运营商有效,仅建议用于国内无劫持的环境下使用;其次为 `DNS over HTTPS` 、`DNS over TLS` 、`DNS over QUIC` 与 `DNSCrypt` ,它们都是加密的 DNS 服务协议,可以抵抗污染与劫持行为,但可能被防火长城拦截;在出境请求中,`DNS over TLS` 特别是标准端口的服务已经被大规模封杀,`DNSCrypt` 也基本无法使用,目前建议使用 `DNS over QUIC` 与非标准路径的 `DNS over HTTPS` 服务。
对于多种 DNS 加密协议的简述,可以参考[浅谈DNS协议](https://blog.dnomd343.top/dns-server/#DNS%E5%90%84%E5%8D%8F%E8%AE%AE%E7%AE%80%E4%BB%8B),里面讲解了不同协议的区别与优缺点,以及服务器 分享格式。
对于多种 DNS 加密协议的简述,可以参考[浅谈DNS协议](https://blog.dnomd343.top/dns-server/#DNS%E5%90%84%E5%8D%8F%E8%AE%AE%E7%AE%80%E4%BB%8B),里面讲解了不同协议的区别与优缺点,以及 DNS 服务的 分享格式。
在分流器部分,ClearDNS 需要借助三个资源文件工作:
@ -50,9 +50,9 @@ ClearDNS 支持多种 DNS 协议,首先是常规 DNS ,即基于 UDP 或 TCP
> 防火长城的 DNS 污染有一个特点,被污染的结果必为境外 IP 地址
当分流器接到请求时,若在 `chinalist.txt` 中有所匹配,则只请求国内组,若在 `gfwlist.txt` 匹配,则仅请求国外组;两者均未未匹配的情况下,将同时请求国内组与国外组,若国内组返回结果在 `china-ip.txt` 中,则证明 DNS 未被污染,采纳国内组结果,若返回国外 IP 地址,则可能已经被污染,将返回 国外组结果。
当分流器接到请求时,若在 `chinalist.txt` 中有所匹配,则只请求国内组,若在 `gfwlist.txt` 匹配,则仅请求国外组;两者均未未匹配的情况下,将同时请求国内组与国外组,若国内组返回结果在 `china-ip.txt` 中,则证明 DNS 未被污染,采纳国内组结果,若返回国外 IP 地址,则可能已经被污染,将选取 国外组结果。
由于以上资源数据一直在变动,ClearDNS 内置了更新功能,可自动这些 资源文件;数据从多个上游项目收集,每天进行一次合并整理,整合数据的源码可见[此处](./assets/),您可以自由配置更新服务器,或者禁用更新。
由于以上资源数据一直在变动,ClearDNS 内置了更新功能,支持自动获取新的 资源文件;数据从多个上游项目收集,每天进行一次合并整理,整合数据的源码可见[此处](./assets/),您可以自由配置更新服务器,或者禁用更新。
## 配置格式
@ -156,7 +156,7 @@ diverter:
chinalist: []
```
+ `port` :DNS 分流器端口,若 AdGuardHome 未开启 ,本选项将失效,默认为 `5353`
+ `port` :DNS 分流器端口,若 AdGuardHome 关闭 ,本选项将失效,默认为 `5353`
> 以下选项用于添加自定义规则,将优先覆盖在资源文件上
@ -175,7 +175,7 @@ domestic:
port: 4053
verify: true
parallel: true
bootstrap: " ..."
bootstrap: ...
primary:
- ...
- ...
@ -190,11 +190,11 @@ domestic:
+ `parallel` :是否对多个上游进行并行查询,默认为 `true`
+ `bootstrap` :引导 DNS 服务器,用于 `primary` 与 `fallback` 中 DNS 服务器域名的查询,必须为常规 DNS 服务 ,此处允许为字符串或字符串数组
+ `bootstrap` :引导 DNS 服务器,用于 `primary` 与 `fallback` 中服务器域名的查询,仅允许常规 DNS 服务,默认为空
+ `primary` :主 DNS 列表,用于默认情况下的查询
+ `primary` :主 DNS 服务器 列表,用于默认情况下的查询
+ `fallback` :备用 DNS 服务器,当 `primary` 中 DNS 服务器无效时,回落到此 处再次查询
+ `fallback` :备用 DNS 服务器列表 ,当 `primary` 中 DNS 服务器宕机时,回落到本 处再次查询
### Foreign
@ -205,7 +205,7 @@ foreign:
port: 6053
verify: true
parallel: true
bootstrap: " ..."
bootstrap: ...
primary:
- ...
- ...
@ -216,20 +216,20 @@ foreign:
+ `port` :国外组 DNS 端口,默认为 `6053`
> Foreign 选项意义与 Domestic 相同,可参考上文描述
> Foreign 选项意义与 Domestic 中相同,可参考上文说明
### Reject
DNS 拒绝类型,指定屏蔽的 DNS 记录类型,不同 DNS 类型编号可参考 [Wiki ]( https://en.wikipedia.org/wiki/List_of_DNS_record_types ) ,默认为空。
DNS 拒绝类型列表 ,指定屏蔽的 DNS 记录类型,不同 DNS 类型编号可参考[DNS记录类型]( https://en.wikipedia.org/wiki/List_of_DNS_record_types),默认为空。
```yaml
reject:
- 255
- 255 # ANY
```
### Hosts
Hosts 记录,指定域名对应 IP 地址,支持正则匹配,默认为空。
Hosts 记录列表 ,指定域名对应 IP 地址,支持正则匹配,默认为空。
```yaml
hosts:
@ -239,7 +239,7 @@ hosts:
### TTL
配置特定域名的 ttl 时长 ,支持正则表达式匹配,默认为空。
域名过期时间列表,修改指定域名返回的 TTL 数值 ,支持正则表达式匹配,默认为空。
```yaml
ttl:
@ -249,18 +249,19 @@ ttl:
### Custom
自定义脚本,在启动前执行
自定义脚本,将 在 ClearDNS 初始化后,即将 启动前执行
> 本功能用于注入自定义功能,基于 Alpine 的 ash 执行,可能不支持部分 bash 语法
> 本功能用于注入自定义功能,基于 Alpine 的 ` ash` 执行,可能不支持部分 ` bash` 语法
```yaml
custom:
- "echo 'Hello World!'"
- "..."
```
### Assets
分流资源升级配置,用于自动更新资源文件
资源文件升级选项,用于自动更新分流资源
```yaml
assets:
@ -276,7 +277,7 @@ assets:
+ `cron` :指定触发升级的 Crontab 表达式
+ `url` :指定资源升级的 URL 链接
+ `url` :指定资源升级的下载 URL 链接
## 部署教程
@ -286,7 +287,7 @@ assets:
ClearDNS 基于 Docker 网络有以下三种部署模式:
| | host 模式 | bridge 模式 | m acvlan 模式 |
| | Host 模式 | Bridge 模式 | M acvlan 模式 |
| :-: | :-: | :-: | :-: |
| 网络原理 | 宿主机网络 | 桥接网络 | 虚拟独立 mac 网卡 |
| 服务 IP | 宿主机 IP | 宿主机 IP | 容器独立 IP |
@ -298,17 +299,18 @@ ClearDNS 基于 Docker 网络有以下三种部署模式:
| 网络性能 | 相对较高 | 相对较低 | 相对适中 |
| 部署难度 | 简单 | 简单 | 复杂 |
> 不熟悉 Linux 网络配置请勿使用 macvlan 模式,新手建议首选 h ost 模式。
> 不熟悉 Linux 网络配置请勿使用 Macvlan 模式,新手建议选择 Bridge 或 H ost 模式。
以下操作均于 root 用户下执行
```bash
# 检查Docker环境
shell> docker --version
Docker version ···, build ···
··· Docker 版本信息 ···
# 无Docker环境请先执行安装
shell> wget -qO- https://get.docker.com/ | bash
··· Docker 安装日志 ···
```
ClearDNS 同时发布在多个镜像源上:
@ -319,25 +321,29 @@ ClearDNS 同时发布在多个镜像源上:
+ `阿里云镜像` :`registry.cn-shenzhen.aliyuncs.com/dnomd343/cleardns`
> 下述命令中,容器路径可替换为上述其他源,国内网络建议首选阿里云仓库
> 下述命令中,容器路径可替换为上述其他源,国内网络可优先选择阿里云仓库
> 由于容器中默认为 UTC0 时区,将导致日志时间不匹配,映射 `/etc/timezone` 与 `/etc/localtime` 文件用于同步时区信息
< details >
< summary > < b > b ridge 模式< / b > < / summary >
< summary > < b > B ridge 模式< / b > < / summary >
< br / >
检查相关端口状态:
```bash
# 检查端口占用
shell> netstat -tlnpu | grep -E ":53|:80"
# 如果TCP/53或UDP/53已被占用,请先关闭对应进程
# 如果TCP/80端口被占用,可以关闭对应进程,也可使用其他端口
```
> 映射系统时间文件以同步容器时区,容器内默认为 UTC0 时区
+ 若 `TCP/53` 或 `UDP/53` 被占用,请先关闭对应进程
+ 若 `TCP/80` 端口被占用,可以关闭对应进程,也可换用其他端口
启动 ClearDNS 容器:
```bash
# 运行ClearDNS容器
shell> docker run -dt \
--restart always \
--name cleardns --hostname cleardns \
@ -352,20 +358,25 @@ dnomd343/cleardns
< details >
< summary > < b > h ost 模式< / b > < / summary >
< summary > < b > H ost 模式< / b > < / summary >
< br / >
检查相关端口状态:
```bash
# 检查端口占用
shell> netstat -tlnpu | grep -E ":53|:80|:4053|:5353|:6053"
# 如果UDP/53、UDP/4053、UDP/5353、UDP/6053、TCP/53、TCP/80、TCP/4053、TCP/5353、TCP/6053已被占用,请先关闭对应进程
```
> 映射系统时间文件以同步容器时区,容器内默认为 UTC0 时区
+ 若 `TCP/53` 或 `UDP/53` 被占用,请先关闭对应进程
+ 若 `TCP/80` 端口被占用,可以关闭对应进程,也可换用其他端口
+ 若 `TCP/4053` 、`UDP/4053` 、`TCP/6053` 、`UDP/6053` 、`TCP/5353` 、`UDP/5353` 被占用,请先关闭对应进程或换用其他空闲端口
启动 ClearDNS 容器:
```bash
# 运行ClearDNS容器
docker run -dt --network host \
--restart always \
--name cleardns --hostname cleardns \
@ -379,31 +390,47 @@ docker run -dt --network host \
< details >
< summary > < b > m acvlan 模式< / b > < / summary >
< summary > < b > M acvlan 模式< / b > < / summary >
< br / >
启动容器前需要创建 macvlan 网络
启动容器前需要创建 ` macvlan` 网络,以下选项需按实际网络配置:
```bash
# 开启网卡混杂模式
# 开启eth0 网卡混杂模式
shell> ip link set eth0 promisc on
# 创建macvlan网络,按实际情况指定网络信息
shell> docker network create -d macvlan \
--subnet=192.168.2.0/24 \
--gateway=192.168.2.1 \
-o parent=eth0 macvlan
--subnet={IPv4网段} --gateway={IPv4网关} \
--subnet={IPv6网段} --gateway={IPv6网关} \ # IPv6可选
--ipv6 -o parent=eth0 macvlan # 在eth0网卡上运行
```
启动 ClearDNS 容器:
```bash
shell> docker run -dt --network macvlan \
--restart always --privileged \
--name cleardns --host cleardns \
--volume /etc/cleardns/:/cleardns/ \
--volume /etc/timezone:/etc/timezone:ro \
--volume /etc/localtime:/etc/localtime:ro \
--ip {IPv4地址} --ip6 {IPv6地址} \
dnomd343/cleardns
```
宿主机网络更改配置
> 以下配置旨在让宿主机能够使用 ClearDNS ,若无此需求可以跳过
宿主机网络更改配置,以下示例基于 Debian 系发行版:
```bash
# Debian系示例
shell> vim /etc/network/interfaces
```
添加以下内容,按实际情况指定网络信息
添加以下内容,创建网桥连接宿主机,按实际情况指定网络信息:
> 以下配置文件仅用于示例,未执行 IPv6 配置
```ini
auto eth0
@ -411,88 +438,100 @@ iface eth0 inet manual
auto macvlan
iface macvlan inet static
address 192.168.2.34
netmask 255.255.255.0
gateway 192.168.2.2
dns-nameservers 192.168.2.3
pre-up ip link add macvlan link eth0 type macvlan mode bridge
post-down ip link del macvlan link eth0 type macvlan mode bridge
```
```bash
# 重启宿主机
shell> reboot
```
> 映射系统时间文件以同步容器时区,容器内默认为 UTC0 时区
```bash
# 运行ClearDNS容器
shell> docker run -dt --network macvlan \
--restart always --privileged \
--name cleardns --host cleardns \
--volume /etc/cleardns/:/cleardns/ \
--volume /etc/timezone:/etc/timezone:ro \
--volume /etc/localtime:/etc/localtime:ro \
dnomd343/cleardns
address 192.168.2.34 # 宿主机静态IP地址
netmask 255.255.255.0 # 子网掩码
gateway 192.168.2.1 # 虚拟网关IP地址
dns-nameservers 192.168.2.3 # DNS服务器
pre-up ip link add macvlan link eth0 type macvlan mode bridge # 宿主机网卡上创建网桥
post-down ip link del macvlan link eth0 type macvlan mode bridge # 退出时删除网桥
```
编辑 macvlan 网络的 IP 地址,修改 ClearDNS 配置文件,指定容器的IP与网关,应按实际网络情况配置
```yaml
custom:
- "ip addr flush dev eth0"
- "ip addr add 192.168.2.3/24 dev eth0"
- "ip route add default via 192.168.2.2"
```
重启宿主机网络生效(或直接重启系统):
```bash
# 重启容器生效
shell> docker restart cleardns
shell> /etc/init.d/networking restart
[ ok ] Restarting networking (via systemctl): networking.service.
```
< / details >
< hr / >
ClearDNS 会将数据持久化,以在重启 Docker 或宿主机后保留配置及日志
ClearDNS 会将数据持久化存储,以在重启 Docker 或宿主机后保留配置及日志,上述命令将文件存储在工作目录 `/etc/cleardns` 下,您可以根据需要更改此目录。
```bash
# 使用以下命令清除之前的ClearDNS配置及数据
shell> rm -rf /etc/cleardns
```
如果需要恢复 ClearDNS 初始化配置,删除该目录并重启容器即可。
### 2. 修改配置文件
在 `cleardns.yml` 中指定上游 DNS 服务器,国内组可指定阿里 DNS 、DNSPod、114DNS 等国内公共 DNS 服务,国外组需要 指定可用的加密 DNS 服务,建议自行搭建服务器,或使用共享的跨境服务器(例如 DH-DNS 与 LoopDNS 等)。
在 `cleardns.yml` 中指定上游 DNS 服务器,国内组可指定阿里 DNS 、DNSPod 、114DNS 等国内公共 DNS 服务,国外组需指定可用的加密 DNS 服务,建议自行搭建服务器,或使用共享的跨境服务器(例如 DH-DNS 与 LoopDNS 等)。
> DNSCrypt使用DNS Stamp封装,可以在[这里](https://dnscrypt.info/stamps)在线解析或生成链接内容。
> DNSCrypt 使用 ` DNS Stamp` 封装,可以在[这里](https://dnscrypt.info/stamps)在线解析或生成链接内容。
各协议格式示例如下:
**Plain DNS**
+ `1.1.1.1`
+ `8.8.8.8`
**DNS-over-TLS**
+ `tls://223.5.5.5`
+ `tls://dns.alidns.com`
**DNS-over-HTTPS**
+ `https://dns.pub/dns-query`
+ `https://223.5.5.5/dns-query`
**DNS-over-QUIC**
+ `quic://94.140.14.14`
+ `quic://dns.adguard.com`
**DNSCrypt**
+ `sdns://AQIAAAAAAAAAFDE3Ni4xMDMuMTMwLjEzMDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20`
上游服务器不建议配置过多,否则网络压力偏大的同时没有多少提升,建议两组的 `primary` 与 `fallback` 均配置 2 ~ 3 台上游即可。
国外组服务器切勿使用常规 DNS 服务,例如 `8.8.8.8` ,由于请求信息为明文,GFW 会抢答回复数据,导致内容仍然受到污染;但鉴于目前绝大多数国外公共 DNS 加密服务已经被防火长城屏蔽,因此我们只能考虑自建或者使用私有服务器
自建服务器可以考虑延迟
国内上游是否有必要使用运营商 DNS ?该问题地域性较强,若当地运营商不存在明显的劫持行为,使用运营商 DNS 可能降低延迟,您可以通过实际测试来判别
如果运营商不存在 DNS 劫持行为,使用常规 DNS 与加密 DNS 并没有明显区别,理论上前者延迟会低一些,但数ms的差距在实际使用中基本可以忽略
```
# Plain DNS
1.1.1.1
8.8.8.8
shell> time dnslookup baidu.com tls://dns.pub
dnslookup v. v1.8.0
dnslookup result:
;; opcode: QUERY, status: NOERROR, id: 43283
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
# DNS-over-TLS
tls://223.5.5.5
tls://dns.alidns.com
;; QUESTION SECTION:
;baidu.com. IN A
# DNS-over-HTTPS
https://dns.pub/dns-query
https://223.5.5.5/dns-query
;; ANSWER SECTION:
baidu.com. 596 IN A 39.156.66.10
baidu.com. 596 IN A 110.242.68.66
# DNS-over-QUIC
quic://dns.adguard.com
# DNSCrypt
sdns://AQIAAAAAAAAAFDE3Ni4xMDMuMTMwLjEzMDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20
real 0m0.030s
user 0m0.011s
sys 0m0.005s
```
修改配置文件后,重启 Docker 容器生效
```
```bash
shell> docker restart cleardns
```
@ -520,6 +559,12 @@ DNS封锁清单中,可配置以下规则:
> 对于内网中一些固定IP信息的设备,需要手动更改其DNS为上述IP地址。
## 配置说明
### 关于 DNS 上游的选择
### 关于缓存的配置
## 手动编译
**本地构建**
@ -533,10 +578,17 @@ shell> docker build -t cleardns .
**交叉构建**
```
# 构建并推送至Docker Hub
shell> docker buildx build -t dnomd343/cleardns --platform="linux/amd64,linux/arm64,linux/386,linux/arm/v7" https://github.com/dnomd343/ClearDNS.git --push
```
## 许可证
TODO: add LICENSE
+ DnsProxy
+ AdGuardHome
+ Overture
MIT ©2022 [@dnomd343 ](https://github.com/dnomd343 )