雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

使用 DNSCrypt 安装和配置加密 DNS 服务器

2024-07-14 229

DNS域名解析的缩写。它用于将 IP 地址解析为域名,反之亦然。这有助于消除记住各种互联网站点的特定 IP 地址的复杂性,因此,人们可以使用域名访问页面,例如 google.com、computingforgeeks.com 等。设置 DNS 有多种解决方案服务器,最流行的有 BIND DNS、Knot DNS、NSD、MaraDNS、YADIFA、PowerDNS 等

DNSCrypt 是一种协议,用于通过加密 DNS 客户端和 DNS 解析器之间的通信来提高 DNS 安全性。它通过身份验证防止 DNS 欺骗,帮助用户私密地进行在线通信,而无需担心安全问题。 DNSCrypt 使用加密签名来验证响应是否来自所选的 DNS 解析器,并确保它们在传输时没有被篡改。 DNSCrypt 适用于多种平台,例如 macOS、Android、Linux 和 Windows 以及路由器。

与 DNSCrypt 相关的主要功能和优点是:

  • 它通过缓存响应并避免在纯 IPv4 网络上请求 IPv6 地址来减少延迟。
  • 它强制流量使用 TCP,通过仅 TCP 隧道或 Tor 进行路由。
  • 它可以在本地阻止广告、跟踪器、恶意软件、垃圾邮件以及域名或 IP 地址与您定义的一组规则匹配的任何网站。
  • 它允许用户实时查看源自网络的 DNS 流量,并检测受感染的主机和打电话回家的应用程序。
  • 它可以防止本地区域的查询被泄露。
  • 它支持 DNSCrypt v2、Anonymized DNSCrypt 和 DNS-over-HTTP (DoH) 转发协议,这些协议可以在同一端口(通常是端口 443)上提供服务。

今天我们将学习如何安装和配置加密 DNS 服务器 (DNSCrypt)

1.安装加密DNS服务器(DNSCrypt)

有多种方法可以安装加密 DNS 服务器 (DNSCrypt)。这些包括:

  • 使用预编译的二进制文件
  • 从源代码编译
  • 使用 Docker

在本指南中,我们将学习如何使用预编译的 x86_64 二进制文件安装加密 DNS 服务器 (DNSCrypt)。不幸的是,有适用于 Linux 和 Windows 系统的二进制文件

对于 Linux,您需要 64 位 Debian/Ubuntu 系统,然后按所示操作。

首先,为 DNSCrypt 创建一个目录。

sudo mkdir -p /opt/encrypted-dns

在该目录下,下载最新的预编译包。在编写本文档时,最新版本是 0.9.9。

使用以下命令下载二进制文件:

VER=$(curl -s https://api.github.com/repos/DNSCrypt/encrypted-dns-server/releases/latest|grep tag_name|cut -d '"' -f 4)
wget https://github.com/DNSCrypt/encrypted-dns-server/releases/download/$VER/encrypted-dns_${VER}_amd64.deb

下载后,安装包:

sudo apt install -f ./encrypted-dns_*_amd64.deb

示例输出:

Selecting previously unselected package encrypted-dns.
(Reading database ... 187584 files and directories currently installed.)
Preparing to unpack encrypted-dns_0.9.13_amd64.deb ...
Unpacking encrypted-dns (0.9.13) ...
Setting up encrypted-dns (0.9.13) ...

2.配置加密DNS服务器(DNSCrypt)

安装后,加密 DNS 服务器 (DNSCrypt) 会在 /usr/share/doc/encrypted-dns/ 中存储一个示例配置文件。我们将此配置文件复制到我们创建的目录中:

sudo cp /usr/share/doc/encrypted-dns/example-encrypted-dns.toml /opt/encrypted-dns/encrypted-dns.toml

我们现在可以相应地修改这个配置文件。

sudo vim /opt/encrypted-dns/encrypted-dns.toml

在这里,将listen_addrs参数修改为客户端可访问的IP地址(如果您在云上运行服务器,这可以是公共IP

listen_addrs = [
   { local = "0.0.0.0:443", external = "Your_ipv4_address:443" },
##   { local = "[::]:443", external = "[Your_ipv6_address]:443" }
]

您可能还需要修改 upstream_addr 以指向您的内部递归 DNS 服务器或保持原样。设置provider_name

## Upstream DNS server and port
upstream_addr = "1.1.1.1:53"

dnscrypt]
## Provider name (with or without the `2.dnscrypt-cert.` prefix)
provider_name = "example.com"

## Does the server support DNSSEC?
dnssec = true

## Does the server always returns correct answers (no filtering, including ad-blocking)?
no_filters = true

## Set to `true` if the server doesn't keep any information that can be used to identify users
no_logs = true

3. 将 DNSCrypt 作为系统服务运行

完成配置后,我们需要为 DNSCrypt 创建一个 systemd 服务文件。这可以使用以下命令来完成:

sudo bash -c 'cat << EOF > /etc/systemd/system/encrypted-dns.service
# /etc/systemd/system/dnscrypt-server.service
[Unit]
Description=DNSCrypt v2 server
ConditionFileIsExecutable=/usr/bin/encrypted-dns
After=syslog.target network-online.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/encrypted-dns -c /opt/encrypted-dns/encrypted-dns.toml
WorkingDirectory=/opt/encrypted-dns/
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF'

启动并启用服务:

sudo systemctl daemon-reload
sudo systemctl enable --now encrypted-dns

验证服务是否正在运行:

$ systemctl status encrypted-dns
● encrypted-dns.service - DNSCrypt v2 server
     Loaded: loaded (/etc/systemd/system/encrypted-dns.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-11-27 13:34:33 EAT; 5s ago
   Main PID: 376198 (encrypted-dns)
      Tasks: 6 (limit: 4575)
     Memory: 16.6M
     CGroup: /system.slice/encrypted-dns.service
             └─376198 /usr/bin/encrypted-dns -c /opt/encrypted-dns/encrypted-dns.toml

Sad 27 13:34:33 dnscrypt.computingforgeeks.com systemd[1]: Started DNSCrypt v2 server.
Sad 27 13:34:33 dnscrypt.computingforgeeks.com encrypted-dns[376198]: [WARN  encrypted_dns] No state file found... creating a new provider key
....
Sad 27 13:34:33 dnscrypt.computingforgeeks.com encrypted-dns[376198]: [INFO  encrypted_dns] DNS Stamp: sdns://AQcAAAAAAAAADzg4Ljk5LjkyLjgxOjQ0MyBvFka8viUkAT9gkYMioJ5XjB>

从上面的输出中,我们可以同意 DNSCrypt 服务器已设置。在服务状态的最后,我们可以看到 DNSCrypt 服务器的 DNS 标记。这会将连接到安全 DNS 服务器所需的所有参数编码为单个字符串。

现在允许所需的端口通过防火墙:

sudo ufw allow 443
sudo ufw allow 53

4. 在本地设备上启用安全 DNS

一旦 DNSCrypt 服务器运行,我们需要使用它来查询 DNS 请求。在这种情况下,我们需要安装 DNSCrypt 客户端。 DNSCrypt 客户端实现有一长串。在本指南中,我们将安装 DNSCrypt 代理,它可以位于本地或远程系统上。

下载客户端最新版本:

VER=$(curl -s https://api.github.com/repos/DNSCrypt/dnscrypt-proxy/releases/latest|grep tag_name|cut -d '"' -f 4)
wget https://github.com/DNSCrypt/dnscrypt-proxy/releases/download/$VER/dnscrypt-proxy-linux_x86_64-${VER}.tar.gz

完成后,提取存档:

tar xvf dnscrypt-proxy-linux_x86_64-${VER}.tar.gz
cd linux-x86_64

创建配置文件并打开它进行编辑:

cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
vim dnscrypt-proxy.toml

在文件中,进行以下调整并设置您的服务器名称。

server_names = ['myserver']

公共解析器列表上启用了多个提供程序。对于这种情况,我们将忽略它们并使用自定义的。

接下来,删除以下行开头的“#”并提供 DNSCrypt 服务器的 DNS 标记

[static]

   [static.'myserver']
   stamp = 'sdns://AQcAAAAAAAAAAAAQMi5kbnNjcnlwdC1jZXJ0Lg'

不必担心 DNS 标记,因为可以在 DNSCrypt 服务器上使用 sudo systemctl status crypto-dns 命令检索它。

您还可以设置要阻止的域列表:

[blocked_names]

## Path to the file of blocking rules (absolute, or relative to the same directory as the config file)

blocked_names_file = 'blocked-names.txt'
....

在该目录中,有一个示例文件,可以根据需要进行复制和编辑:

sudo cp example-blocked-names.txt blocked-names.txt

完成更改后,保存配置,然后启动 DNSCrypt 代理服务:

sudo ./dnscrypt-proxy --config dnscrypt-proxy.toml

示例输出:

[2023-10-31 14:16:36] [NOTICE] dnscrypt-proxy 2.1.5
[2023-10-31 14:16:36] [NOTICE] Network connectivity detected
[2023-10-31 14:16:36] [NOTICE] Now listening to 127.0.0.1:53 [UDP]
[2023-10-31 14:16:36] [NOTICE] Now listening to 127.0.0.1:53 [TCP]
[2023-10-31 14:16:36] [NOTICE] Service is not usable yet
[2023-10-31 14:16:36] [NOTICE] Resolving server host [raw.githubusercontent.com] using bootstrap resolvers over udp
[2023-10-31 14:16:36] [NOTICE] Source [public-resolvers] loaded
[2023-10-31 14:16:36] [NOTICE] Service is not usable yet
[2023-10-31 14:16:36] [NOTICE] Resolving server host [download.dnscrypt.info] using bootstrap resolvers over udp
[2023-10-31 14:16:36] [NOTICE] Source [relays] loaded
[2023-10-31 14:16:36] [NOTICE] Firefox workaround initialized
[2023-10-31 14:16:36] [NOTICE] [myserver] OK (DNSCrypt) - rtt: 0ms
[2023-10-31 14:16:36] [NOTICE] Server with the lowest initial latency: myserver (rtt: 0ms)
[2023-10-31 14:16:36] [NOTICE] dnscrypt-proxy is ready - live servers: 1

您现在已设置为从客户端向 DNSCrypt 服务器发送安全 DNS 查询。要测试所有 DNS 查询是否都经过 127.0.0.1:53,您需要打开一个单独终端并编辑 /etc/resolv.conf,如下所示:

$ sudo vim /etc/resolv.conf
nameserver 127.0.0.1
#options edns0 trust-ad
search .

运行以下命令以查看 DNSCrypt 是否按预期处理 DNS 查询

$ nslookup example.com
Server:		127.0.0.1
Address:	127.0.0.1#53

Non-authoritative answer:
Name:	example.com
Address: 93.184.216.34
Name:	example.com
Address: 2606:2800:220:1:248:1893:25c8:1946

这表明 DNSCrypt 服务器正在安全地处理流量。

将 dnscrypt-proxy 客户端作为 systemd 服务运行

我们还可以配置该服务作为系统服务运行:

sudo bash -c 'cat << EOF > /etc/systemd/system/dnscrypt-proxy.service
# /etc/systemd/system/dnscrypt-server.service
[Unit]
Description=DNSCrypt v2 server
ConditionFileIsExecutable=/usr/local/bin/dnscrypt-proxy
After=syslog.target network-online.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/local/bin/dnscrypt-proxy --config /opt/dnscrypt-proxy/dnscrypt-proxy.toml
WorkingDirectory=/opt/dnscrypt-proxy/
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF'

将文件复制到所需目录:

sudo mkdir /opt/dnscrypt-proxy
sudo cp ~/linux-x86_64/* /opt/dnscrypt-proxy/
sudo cp ~/linux-x86_64/dnscrypt-proxy /usr/local/bin

停止正在运行的服务:

sudo killall -9 dnscrypt-proxy

启动 dnscrypt-proxy 服务:

sudo systemctl enable --now dnscrypt-proxy

检查服务是否正在运行:

$ systemctl status dnscrypt-proxy
● dnscrypt-proxy.service - DNSCrypt v2 server
     Loaded: loaded (/etc/systemd/system/dnscrypt-proxy.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-10-31 16:30:16 EAT; 5s ago
   Main PID: 868360 (dnscrypt-proxy)
      Tasks: 6 (limit: 4617)
     Memory: 7.8M
        CPU: 22ms
     CGroup: /system.slice/dnscrypt-proxy.service
             └─868360 /usr/local/bin/dnscrypt-proxy --config /opt/dnscrypt-proxy/dnscrypt-proxy.toml

Okt 31 16:30:16 computingforgeeks dnscrypt-proxy[868360]: [2023-10-31 16:30:16] [NOTICE] Network connectivity detected
Okt 31 16:30:16 computingforgeeks dnscrypt-proxy[868360]: [2023-10-31 16:30:16] [NOTICE] Now listening to 127.0.0.1:53 [UDP]
Okt 31 16:30:16 computingforgeeks dnscrypt-proxy[868360]: [2023-10-31 16:30:16] [NOTICE] Now listening to 127.0.0.1:53 [TCP]
Okt 31 16:30:16 computingforgeeks dnscrypt-proxy[868360]: [2023-10-31 16:30:16] [NOTICE] Source [relays] loaded
....

验证它是否正在处理 DNS 查询:

$ nslookup example.com
Server:		127.0.0.1
Address:	127.0.0.1#53

Non-authoritative answer:
Name:	example.com
Address: 93.184.216.34
Name:	example.com
Address: 2606:2800:220:1:248:1893:25c8:1946

您还可以查看它是否能够阻止所设置域上的流量。例如,就我而言,我阻止了到 computingforgeeks.com 的流量

判决

这标志着关于如何安装和配置加密 DNS 服务器 (DNSCrypt) 的详细指南的结束。我希望这对你也有用。

在此页面上查看更多内容:

  • 如何使用 DNSSec 密钥保护 BIND DNS 服务器
  • 在 Windows Server 上安装和配置 DNS 服务器
  • 在 Rocky Linux 上配置 PowerDNS 和 PowerDNS Admin

更新于:4个月前
赞一波!2

文章评论

评论问答