Unbound + Dnscrypt 搭建无污染 DNS 服务

发布时间:2025-12-09 11:53:14 浏览次数:2

前言

  鉴于某些原因,我们日常生活中使用的公共 DNS 总是会存在一些奇奇怪怪的DNS解析,例如某些国内云平台大型网站无法正常解析 DNS ,因此搭建无污染 DNS 服务成为了一项值得尝试、有意义的事情。在搭建的技术栈上,我们选择了 unbound 和 dnscrypt。当然,这个世界上还有很多开源的、很好用的DNS服务器产品,比如 knot DNS、dnspord-sr、powerdns 等,它们也在很多大型的 ISP 提供商的 DNS 产品上得到了很多的实践,但是就我们个人而言,如果需要搭建一个小范围、公共的DNS服务,那么 unbound 是足够的,并且对于我们实现无污染有非常好的基础。废话少说,不如跟我一起来搭建一下。

实验环境

  • 操作系统:CentOS 6.9
  • Unbound 版本:目前最新 1.6.7 源码下载地址
  • Dnscrypt-proxy 版本:目前最新 1.9.5 源码下载地址
  • 依赖库 libsodium 版本:目前最新 1.0.15 源码下载地址
  • 依赖库 libevent 版本:目前最新 2.1.8 源码下载地址(在github上,需要浏览器下载)

实验过程

安装 libsodium

# 解压 tar zxf libsodium-1.0.15.tar.gz# 进入文件夹cd libsodium-1.0.15# 编译./configure./autogen.sh./configuremake -j12 # j 后面为 CPU 核数,加快编译sudo make installsudo ldconfig# 安装完成

安装 libevent

# 解压tar zxf libevent-2.1.8-stable.tar.gz# 进入文件夹cd libevent-2.1.8-stable# 编译源代码并安装./configure --prefix=/usr./autogen.sh./configuremake -j12sudo make installsudo -iecho /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.confsudo ldconfig# 安装完成

安装 dnscrypt-proxy

# 解压tar zxf dnscrypt-proxy-1.9.5.tar.gz# 进入文件夹cd dnscrypt-proxy-1.9.5# 编译源代码并安装./configuremake -j12sudo make install# 如果提示报错与 libevent 有关# 请再次运行 sudo ldconfig 并重新运行以上命令。

配置 dnscrypt-proxy

# 配置文件目录# /usr/local/etc/dnscrypt-proxy.confResolverName ciscoResolversList /usr/local/share/dnscrypt-proxy/dnscrypt-resolvers.csvDaemonize noPidFile /var/run/dnscrypt-proxy.pidUser dnscryptLocalAddress 127.0.0.1:5353# 可选QueryLogFile /tmp/dns-queries.log
# 添加用户 dnscryptsudo useadd -d /var/run/dnscrypt dnscrypt# 创建主目录并赋予权限:sudo mkdir /var/run/dnscrypt && sudo chown dnscrypt /var/run/dnscrypt# 运行:sudo /usr/local/sbin/dnscrypt-proxy /usr/local/etc/dnscrypt-proxy.conf# 如果是在 ubuntu 系统下或者能够使用 systemctl 的环境下,请在 /usr/lib/systemd/system/dnscrypt-proxy.socket 修改配置,参考资料 3 中所示。

安装 unbound

# 解压tar zxf unbound-1.6.7.tar.gz# 进入文件夹 cd unbound-1.6.7# 编译源代码并安装./configure --with-libeventmake -j12sudo make install# 安装完成

配置 unbound

# 下载 dnsmasq-china-listwget -c https://github.com/felixonmars/dnsmasq-china-list/archive/master.zip# 解压并进入文件夹:unzip master.zip && cd dnsmasq-china-list-master# 生成 accelerated-domains.china.unbound.confmake unbound# 移动加速配置到 unbound 配置目录:sudo mv accelerated-domains.china.unbound.conf /usr/local/etc/unbound# 下载 named.cache 到 /usr/local/etc/unbound 目录:wget -c ftp://FTP.INTERNIC.NET/domain/named.cache 
# 修改配置文件 /usr/local/etc//unbound/unbound.confserver:      num-threads: 2 # 线程数可以修改为物理核心数      interface: 0.0.0.0 # 侦听所有 IPv4 地址      interface: ::0 # 侦听所有 IPv6 地址      # 如果只需要本机使用,则一个 interface: 127.0.0.1 即可      so-rcvbuf: 4m      so-sndbuf: 4m # 本机使用的话,这俩 buf 可以取消注释      so-reuseport: yes # 如果开了多线程,就写 yes      msg-cache-size: 64m # 本机可以设置 4m 或者更小      rrset-cache-size: 128m # 本机可以设置 4m 或者更小      cache-max-ttl: 3600 # 建议设置一个不太大的值...专治各种运营商 DNS 缓存不服      outgoing-num-tcp: 256 # 限制每个线程向上级查询的 TCP 并发数      incoming-num-tcp: 1024 # 限制每个线程接受查询的 TCP 并发数      # 下面这四个不需要解释了吧,不想用那个就写 no      do-ip4: yes      do-ip6: yes      do-udp: yes      do-tcp: yes      tcp-upstream: no # 默认是 no,隧道状态比较稳的话也不需要写 yes。一些情况下强制使用 tcp 连上游的话写 yes      access-control: 0.0.0.0/0 allow # 本机用的话建议设置 127.0.0.0/8 allow,局域网用适当调整      chroot: "/usr/local/etc/unbound"      username: "unbound"      root-hints: "/usr/local/etc/unbound/named.cache" # 没有的话在 ftp://FTP.INTERNIC.NET/domain/named.cache 下载一份      hide-identity: yes # 不返回对 id.server 和 hostname.bind 的查询。      hide-version: yes # 不返回对 version.server 和 version.bind 的查询。      # 不过下面有 identity 和 version 的自定义选项,不隐藏这些的话,修改下选项还可以卖个萌(´・ω・`)      harden-glue: yes # 建议打开      module-config: "iterator" # 禁用 DNSSEC 检查,如果上游不支持 DNSSEC 就关掉。注意这个选项有可能在其他 include 的文件里      unwanted-reply-threshold: 10000000 # 针对各种网络不服,数值为建议值,具体可以自己修改看看效果      do-not-query-localhost: no # 一般是为了防止扯皮丢包开着,不过等下要用 DNSCrypt 所以关掉      directory: "/usr/local/etc/unbound"      pidfile: "/usr/local/etc/unbound/unbound.pid"      prefetch: yes # 蛮好用的,开着吧      minimal-responses: yes # 省带宽,开着吧。本机用可以关掉      # 关键部分来了,把默认查询全部丢给 DNSCrypt。使用 [地址]@[端口] 指定查询地址和端口,默认端口 53。      # 然后把国内的地址丢给国内的缓存服务器。这两个选项的顺序不能错哟。      # 如果使用隧道查询,把这个地址改为隧道对端的地址,或者一个国外的 DNS 服务器都可以,例如 8.8.8.8。      # 具体看是在对端开 DNS 还是直接用国外的服务器。后者的话,前面 outgoing-interface 可以直接设置隧道本地端的地址,不过要配合 dnsmasq-china-list 的话,还是写路由表比较合适,否则不够灵活。      include: "/etc/unbound/accelerated-domains.china.unbound.conf"forward-zone:    name: "."    forward-addr: 127.0.0.1@5353
# 运行并自动进入后台执行sudo /usr/local/sbin/unbound -c /usr/local/etc/unbound/unbound.conf 

实验验证

dig facebook.com  @114.114.114.114dig facebook.com  @127.0.0.1

  将两条命令查询出的 ip 放到 ipip.net 查询一下,看是否属于 facebook 机房的。可以看出,前者不是后者是,那么就无污染 DNS 就搭建完成了。虽然这样一来你就能够获得正确的 facebook.com 的 ip,但是这并不意味着你就能正常访问 facebook,因为 ip 是不通,这也正是为什么修改 hosts 而无法访问某搜索引擎的原因了。

参考资料

  • linux 下编译安装 dnscrypt-proxy(centos,ubuntu,debian)
  • unbound:安装与配置
  • 使用 Unbound 搭建更好用的 DNS 服务器

版权声明:如无特别声明,本文版权归 仲儿的自留地 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 Unbound + Dnscrypt 搭建无污染 DNS 服务 》

本文链接:https://lisz.me/tech/linux/unbound-dns.html

dnscrypt
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477