如何在 Linux 上安装带有广告拦截器的 dnscrypt 代理
DNSCrypt 是一种协议,用于验证和加密您的设备与递归名称服务器(例如 Google、Cloudflare、ISP/第三方服务器或您自己的基于 Nginx+Bind9 的 DoH 服务器)之间的 DNS 流量。dnscrypt-proxy 是一款免费的开源应用程序,支持 DNSCrypt v2 和 DNS-over-HTTPS (DoH) 等协议。它还可以防止 DNS 欺骗。它使用加密签名来验证响应是否来自所选的 DNS 解析器并且未被篡改。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 是的 |
要求 | Linux 终端 |
类别 | 包管理器 |
先决条件 | Linux dnscrypt-proxy |
操作系统兼容性 | Alma • Alpine • Arch • Debian • Fedora • Mint • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu |
预计阅读时间 | 7 分钟 |
世界各地都有免费和支持 DNSCrypt 的解析器,包括支持 DoH 的解析器。换句话说,我们使用 dnscrypt-proxy 来保护客户端和 DNS 解析器之间的通信。
如何安装 dnscrypt-proxy
本页介绍如何在带有 OpenVPN/WireGuard VPN 服务器的 Linux 上安装带有广告拦截器的 dnscrypt-proxy,以保护公共 WiFi 或不受信任网络上的通信。
在 Linux 上安装 dnscrypt 代理
以 root 用户身份按照您的 Linux 发行版运行命令:
## Debian/Ubuntu user try apt command/apt-get command ##
$ sudo apt install dnscrypt-proxy
## Alpine Linux user try apk command ##
$ sudo apk add dnscrypt-proxy
## CentOS / RHEL user:
## Enable EPEL repo on CentOS 8 or RHEL 8
## try yum command ##
$ sudo yum install dnscrypt-proxy
## Arch Linux user try pacman command ##
$ sudo pacman -S dnscrypt-proxy
## OpenSUSE/SUSE Linux user try zypper command ##
$ sudo zypper in dnscrypt-proxy
## Fedora user try dnf command ##
$ sudo dnf install dnscrypt-proxy
配置 dnscrypt 代理
编辑 /etc/dnscrypt-proxy/ 目录中的 dnscrypt-proxy.toml。例如:
首先,我们需要设置要使用的服务器列表。让我们同时使用 google 和 cloudflare:
$ ls -l /etc/dnscrypt-proxy/
$ sudo vim /etc/dnscrypt-proxy/dnscrypt-proxy.toml
server_names = [ 'google' 'cloudflare']
我也可以使用 cloudflare:
server_names = [ 'cloudflare']
警告:不要监听 WAN 公共 IP 地址和端口。我们不会充当世界的公共解析器。因此,我只会使用环回和我的 VPN 接口 IP 地址。
设置要监听的本地地址和端口列表(除 WAN IP 外,根据您的 IP 配置进行设置):
listen_addresses = ['127.0.0.1:53', '[::1]:53']
对于我的 VPN 172.16.0.0/24 sub/net (CIDR):
listen_addresses = ['127.0.0.1:53', '172.16.0.1:53' ]
如果您具有 IPv6 连接,请使用可通过 IPv6 访问的服务器(默认为 IPv4):
ipv6_servers = true
确保我们使用实现 DNSCrypt 和 DoH 协议的服务器
dnscrypt_servers = true doh_servers = true
确保我们启用 DNS 缓存以减少延迟和传出流量:
cache = true
服务器必须支持 DNS 安全扩展 (DNSSEC):
require_dnssec = true
广告拦截列表每行由一个模式组成。有效模式的示例如下:
## ## example.com ## =example.com ## ads.* ## ads*.example.* ## ads*.example[0-9]*.com
找到' [blocked_names] '部分并添加阻止规则文件的路径,如下所示:
blocked_names_file = '/etc/dnscrypt-proxy/blocked_names.txt'
它看起来应该是这样的:
[blocked_names] blocked_names_file = '/etc/dnscrypt-proxy/blocked_names.txt'
为 dnscrypt 代理安装广告拦截器列表
这是一个用于下载和更新列表的小型 bash 脚本。
#!/bin/bash # Name: update-adblocker.sh # Purpose: Download and update adblocker list for dnscrypt proxy # Usage: Call it from the CLI or cron job https://www.example.com/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/ DEST="/etc/dnscrypt-proxy/blocked_names.txt" # # Blocks both adware + malware # See for other lists https://github.com/StevenBlack/hosts SRC="https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" TMP_B_FILE="$(mktemp)" TMP_B_FILE_SORTED="$(mktemp)" wget --timeout=10 --tries=5 -qO- "${SRC}" | grep -Ev "(localhost)" | grep -Ev "#" | sed -E "s/(0.0.0.0 |127.0.0.1 |255.255.255.255 )//" >> "${TMP_B_FILE}" awk '/^[^#]/ { print $1 }' "${TMP_B_FILE}" | sort -u > "${TMP_B_FILE_SORTED}" cp -f "${TMP_B_FILE_SORTED}" "$DEST" rm -f "${TMP_B_FILE}" "${TMP_B_FILE_SORTED}"
运行它:
# ./update-adblocker.sh
验证它:
# more /etc/dnscrypt-proxy/blocked_names.txt
确保每天运行 update-adblocker.sh 脚本以获取更新的 hosts 文件列表。添加一个新的 cron 作业,如下所示:
@daily /path/to/update-adblocker.sh
除了广告和恶意软件,您还可以阻止虚假新闻、赌博、色情和社交媒体。请参阅此存储库页面。
启用 dnscrypt 代理服务
使用 systemctl 命令在 Linux 上启用 dnscrypt-proxy 服务:
$ sudo systemctl enable dnscrypt-proxy
启动服务:
$ sudo systemctl start dnscrypt-proxy
验证服务:
$ sudo systemctl status dnscrypt-proxy
DNSCrypt 状态:
● dnscrypt-proxy.service - DNSCrypt-proxy client Loaded: loaded (/usr/lib/systemd/system/dnscrypt-proxy.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-10-10 05:44:29 EDT; 4s ago Docs: https://github.com/jedisct1/dnscrypt-proxy/wiki Main PID: 5108 (dnscrypt-proxy) Tasks: 8 (limit: 11328) Memory: 13.8M CGroup: /system.slice/dnscrypt-proxy.service └─5108 /usr/bin/dnscrypt-proxy --config /etc/dnscrypt-proxy/dnscrypt-proxy.toml Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: Wiring systemd TCP socket #1, dnscrypt-proxy.socket, [::1]:53 Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: Wiring systemd UDP socket #2, dnscrypt-proxy.socket, 127.0.0.1:53 Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: Wiring systemd UDP socket #3, dnscrypt-proxy.socket, [::1]:53 Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: Source [public-resolvers] loaded Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: /etc/dnscrypt-proxy/relays.md: open sf-ux5n6prgb5kk4yzf.tmp: read-only file system Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: Source [relays] loaded Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: Firefox workaround initialized Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: [cloudflare] OK (DoH) - rtt: 18ms Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: Server with the lowest initial latency: cloudflare (rtt: 18ms) Oct 10 05:44:29 centos-8-cloud.sweet.home dnscrypt-proxy[5108]: dnscrypt-proxy is ready - live servers: 1
您在 Fedora Linux 上使用 dnscrypt-proxy 吗?请参阅下面的评论。
Alpine Linux 用户需要使用 rc-update 命令和 rc-service 命令:
$ sudo rc-update add dnscrypt-proxy
$ sudo rc-service dnscrypt-proxy
测试一下
使用主机命令/drill 命令/ dig 命令
使用域服务器:$ host www.example.com 127.0.0.1
## connect to your VPN server and run #
$ host bash.example.com {vpn-server-ip}
$ host bash.example.com 172.168.0.1
Name: 172.168.0.1 Address: 172.168.0.1#53 Aliases: bash.example.com has address 104.22.10.214 bash.example.com has address 104.22.11.214 bash.example.com has address 172.67.7.239 bash.example.com has IPv6 address 2606:4700:10::6816:ad6 bash.example.com has IPv6 address 2606:4700:10::6816:bd6 bash.example.com has IPv6 address 2606:4700:10::ac43:7ef
广告拦截器正在工作吗?尝试一下:
$ host pagead2.google.com 172.168.0.1
你一定会看到 NXDOMAIN 输出:
Using domain server: Name: 172.168.0.1 Address: 172.168.0.1#53 Aliases: Host pagead2.google.com not found: 3(NXDOMAIN)
如果您将 Cloudflare DoH 与 DNSCrypt-proxy 结合使用,请尝试以下 URL 来验证连接性:
https://1.1.1.1/help/
我们可以使用 tcpdump 工具验证 DNS 加密,这留给读者练习。
dnscrypt-proxy 故障排除
您可以检查配置文件中的错误并退出。例如:
# dnscrypt-proxy -check
以下是如何设置配置文件 /etc/dnscrypt-proxy/dnscrypt-proxy.toml 的路径
# dnscrypt-proxy -check -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml
以下输出表示过时或弃用的配置选项,例如 [blacklist] 或 [ip_blacklist]:
[2023-06-13 20:03:25] [NOTICE] dnscrypt-proxy 2.1.4 [2023-06-13 20:03:25] [NOTICE] config option `refused_code_in_responses` is deprecated, use `blocked_query_response` [2023-06-13 20:03:25] [NOTICE] Use of [blacklist] is deprecated - Update your config file [2023-06-13 20:03:25] [NOTICE] Use of [ip_blacklist] is deprecated - Update your config file [2023-06-13 20:03:25] [NOTICE] Source [public-resolvers] loaded [2023-06-13 20:03:25] [NOTICE] Configuration successfully checked [2023-06-13 20:03:25] [NOTICE] config option `refused_code_in_responses` is deprecated, use `blocked_query_response` [2023-06-13 20:03:25] [NOTICE] Use of [blacklist] is deprecated - Update your config file [2023-06-13 20:03:25] [NOTICE] Use of [ip_blacklist] is deprecated - Update your config file
一旦这些问题得到解决,我现在会收到警告:
[2023-06-13 20:06:26] [NOTICE] dnscrypt-proxy 2.1.4 [2023-06-13 20:06:27] [NOTICE] Source [public-resolvers] loaded [2023-06-13 20:06:30] [NOTICE] Source [relays] loaded [2023-06-13 20:06:30] [NOTICE] Configuration successfully checked
参见
结论
就这样,DNSCrypt 代理在 Linux 上安装了广告拦截器列表,以增强 DNS 隐私和保护。Pi -hole 也很棒,但它需要更多资源。以下是两个广告拦截器之间的内存使用情况:
- DNSCrypt-Proxy 与 DoH + WireGuard + Alpine Linux : 68.7M
- DNSCrypt-Proxy 与 DoH + WireGuard + Ubuntu 最小:155.8M
- 带 WebUI 的 Pi-hole + 带 DoH 的 Cloudflard + WireGuard + Ubuntu 最小:198M
我更喜欢 DNSCrypt,因为它轻量且移动部件较少,但它也缺少漂亮的报告和 WebUI。请使用 man 命令检查以下资源或传递 -help 选项,如下所示:
$ man bash
$ man dnscrypt-proxy
$ dnscrypt-proxy -help
Usage of dnscrypt-proxy: -check check the configuration file and exit -child Invokes program as a child process -config string Path to the configuration file (default "dnscrypt-proxy.toml") -json output list as JSON -list print the list of available resolvers for the enabled filters -list-all print the complete list of available resolvers, ignoring filters -logfile string Write application logs to file -logfile-truncate Truncate the application log file; keep only data from the most recent application launch -loglevel value Application log level (0-6) (default 2) -netprobe-timeout int Override the netprobe timeout (default 60) -pidfile string Store the PID into a file -resolve string resolve a DNS name (string can be <name> or <name>,<resolver address>) -service string Control the system service: ["start" "stop" "restart" "install" "uninstall"] -show-certs print DoH certificate chain hashes -syslog Send application logs to the local system logger (Eventlog on Windows, syslog on Unix) -version print current proxy version