[2019.06.28]在Ubuntu Server上安装Unbound并配置DNS over TLS功能

封面配图 PID 74975502

本来想偷个懒,找一些 dalao 写过的教程照葫芦画瓢画一个出来。无奈全网有关搭建的教程少之又少,咱只好从官方文档开始摸起,顺便在这里记录一下踩坑的过程,,

  • 前言

1.DNS over TLS 是什么?

它是通过传输层安全协议(TLS)来加密并打包域名系统(DNS)的安全协议。此协议旨在防止中间人攻击与控制 DNS 数据以保护用户隐私。(摘自 中文维基↗)
如果你使用境外的安全 DoT( DNS over TLS 的缩写,下同 ),这可以有效防止某墙的 DNS 污染。
安卓 Pie 已原生支持 DoT,部分国产 ROM 及部分应用内置 DNS 查询除外。打开 设置 → 网络和 Internet → 高级 → 私有 DNS 就是 DoT 的设置界面了。

Capture.PNG

2.Unbound 是什么?

Unbound 是优秀的 DNS 解析器,适合咱们萌新使用。

3. 为什么要自己搭建 DoT 呢?一些公共的 DNS 服务不都提供 DoT 了吗?

因为境外的一些 DoT 服务器,如 CloudflareGoogle 的,因为被太多人使用而被墙干扰了,丢包严重(反正我所在的地区是这样的)。所以我们可以试着利用 VPS 搭建一个属于自己的 DoT 服务器。

4.Ubuntu Server 是什么?

左转 Google 右转度娘


  • 我们开始

首先,你需要一个域名并准备一张有效证书。你可以自签或者撸一张 Let’s Encrypt 的证。自签证书因为过程比较复杂而且需要在服务器和客户端上同时安装,故此处不细讲。(懒)
Let’s Encrypt 的证书可以参考 这篇文章

然后国际惯例,备份数据 然后更新系统

apt update
apt upgrade
  • 安装本篇主角 Unbound

Ubuntu 软件仓库已经有了,所以直接apt install就好,记得小写。

apt install unbound

进度条跑完后, 这里有一个坑,你需要把 TLS 所用的证书、密钥文件复制到Unbound的配置文件所在目录。如果你在配置文件中指定了其他位置的证书文件,Unbound很可能会因权限问题报错!即使你使用了chmod 4777对证书文件进行了权限修改,它仍会报错~!

然后打开配置文件并进行修改。配置文件默认这里 → /etc/unbound/unbound.conf
完整的官方说明在这里 → https://nlnetlabs.nl/documentation/unbound/unbound.conf/
我们在此选择部分需要的功能进行配置就好。清空unbound.conf,复制下面的内容并修改

server:
        directory: "/etc/unbound"
        username: unbound
        chroot: "/etc/unbound"
        # logfile: "/etc/unbound/unbound.log"  #不建议启用日志,因为这样会对服务器造成一定负担
        pidfile: "/etc/unbound/unbound.pid"
        interface: 0.0.0.0@853
        # interface: ::0@853 #如果你想在IPv6上部署
        access-control: 0.0.0.0/0 allow 
        # access-control: ::1 allow #同上,如果你想在IPv6上部署

        ssl-service-key: "privkey.key" #你的证书密钥文件名
        ssl-service-pem: "fullchain.pem" #你的证书文件名
        ssl-port: 853 #DoT所用的端口,默认是853
        incoming-num-tcp: 1000
        udp-upstream-without-downstream: yes 
        qname-minimisation: yes #节省带宽
    
forward-zone:
    name: .
    forward-ssl-upstream: yes
    forward-addr: 8.8.8.8@853 #上游DNS服务器

保存修改后的配置,重启服务器(或者单单重启Unbound → 运行命令 service unbound restart
到这里不出意外的话,Unbound服务器应该就部署好了
如果 VPS 带有防火墙,请在防火墙中放行 853 端口的 TCP 连接

  • 最后测试

这里使用 kdig 命令进行模拟查询,你可能需要先安装相应的工具包。
Ubuntu下可使用apt install knot-dnsutils进行安装,同样别忘了先更新系统
Windows下我不知道,请自行谷歌。如果您希望对Windows那可怜的网络工具资源做出一点点贡献,请git一份源码进行编译并上传至网络社区,谢谢您~!

装好后运行命令:( 将X.X.X.X替换为待测试服务器 )

kdig +tls @X.X.X.X www.google.com -d

正确的返回结果如下:(部分数据在这里用代替)

;; DEBUG: Querying for owner(www.google.com.), class(1), type(1), server(✦✦✦.✦✦✦.✦✦✦.✦✦✦), port(853), protocol(TCP)
;; DEBUG: TLS, received certificate hierarchy:
;; DEBUG:  #1, CN=✦✦✦✦✦.✦✦✦✦✦.✦✦✦  #你的证书CN名
;; DEBUG:      SHA-256 PIN: ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦
;; DEBUG:  #2, C=US,O=✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦
;; DEBUG:      SHA-256 PIN: ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦=
;; DEBUG: TLS, skipping certificate PIN check
;; DEBUG: TLS, skipping certificate verification
;; TLS session (TLS1.2)-(✦✦✦✦✦✦-✦✦✦-✦✦✦✦✦✦✦✦✦)-(✦✦✦✦✦✦✦✦✦-✦✦✦✦✦✦✦✦✦)
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 65121
;; Flags: qr rd ra; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 0

;; QUESTION SECTION:
;; www.google.com.             IN    A

;; ANSWER SECTION:
www.google.com.         299    IN    A    172.✦✦✦.✦✦✦.✦✦✦

;; Received ✦✦ B
;; Time 20✦✦-✦✦-✦✦ ✦✦:✦✦:✦✦ ✦✦✦
;; From ✦✦✦.✦✦✦.✦✦✦.✦✦✦@853(TCP) in ✦✦✦.✦ ms

恭喜你成功了~ 你现在有了一台属于自己的 DoT 服务器,快去试试它吧~

Capture.PNG

    fish
    fish  2020-01-03, 01:12

    hi.

    [root@host ~]# unbound -c /usr/local/etc/unbound/unbound-by-me.conf
    [1577984771] unbound[12563:0] warning: too many file descriptors requested. The builtinmini-event cannot handle more than 1024. Config for less fds or compile with libevent
    [1577984771] unbound[12563:0] fatal error: too much tcp. not enough fds.
    [root@host ~]#

    遇错如上。如何解决?unbound-by-me.conf是copy了你的配置文件内容。

      柊 ゆり子
      柊 ゆり子  2020-01-04, 00:04

      看起来是 unbound 的版本问题
      旧版本的 libevent 不兼容
      请尝试一下升级 unbound ,然后重试
      PS: 我现在使用的是 Ubuntu 18.04 + unbound 1.6.7-1
      升级 unbound 的方法:apt update 后执行 apt upgrade unbound

        fish
        fish  2020-01-05, 17:12

        hi.
        我另外搞了台ubuntu vps.

        root@rd:~# unbound -c /etc/unbound/unbound-by-me.conf
        /etc/unbound/unbound-by-me.conf:22: error: unknown keyword 'tls-service-key'
        /etc/unbound/unbound-by-me.conf:22: error: stray ':'
        /etc/unbound/unbound-by-me.conf:22: error: stray '"'
        /etc/unbound/unbound-by-me.conf:22: error: unknown keyword 'privkey.pem'
        /etc/unbound/unbound-by-me.conf:22: error: stray '"'
        /etc/unbound/unbound-by-me.conf:24: error: unknown keyword 'tls-service-pem'
        /etc/unbound/unbound-by-me.conf:24: error: stray ':'
        /etc/unbound/unbound-by-me.conf:24: error: stray '"'
        /etc/unbound/unbound-by-me.conf:24: error: unknown keyword 'fullchain.pem'
        /etc/unbound/unbound-by-me.conf:24: error: stray '"'
        /etc/unbound/unbound-by-me.conf:26: error: unknown keyword 'tls-port'
        /etc/unbound/unbound-by-me.conf:26: error: stray ':'
        /etc/unbound/unbound-by-me.conf:26: error: unknown keyword '853'
        read /etc/unbound/unbound-by-me.conf failed: 13 errors in configuration file
        [1578215251] unbound[21539:0] fatal error: Could not read config file: /etc/unbound/unbound-by-me.conf
        root@rd:~# cat /etc/unbound/unbound-by-me.conf
        server:
        directory: "/etc/unbound"
        username: unbound
        chroot: "/etc/unbound"
        # logfile: "/etc/unbound/unbound.log" #uncomment to use logfile.
        pidfile: "/etc/unbound/unbound.pid"
        # verbosity: 1 # uncomment and increase to get more logging.
        # listen on all interfaces on port 853, answer queries from the local subnet.
        interface: 0.0.0.0@853
        interface: ::0@853

        tls-service-key: "privkey.pem"
        tls-service-pem: "fullchain.pem"
        tls-port: 853

        incoming-num-tcp: 1000 # Number of simultaneous incoming TCP connections per thread to allow
        # Listen on UDP but still issues queries upstream over UDP.

        # Only available in 1.6.7 and later
        udp-upstream-without-downstream: yes

        qname-minimisation: yes # Enable QNAME minimisation to increase client privacy
        root@rd:/etc/unbound#

        活见鬼,怎么会出现这些错误?

          柊 ゆり子
          柊 ゆり子  2020-01-05, 17:52

          请检查配置,看上去您给出的 unbound-by-me.conf 中第 2-14 行前未添加制表符,第十行中的 ' tls-service-key: "privkey.pem" ' 需要另起一行
          unbound 对于配置文件格式要求比较严格..

             柊 ゆり子
            柊 ゆり子  2020-01-12, 18:14

            翻了一下文档,在 Unbound 新版本中确实已将 ssl-* 改为 tls-*
            感谢您的反馈,文章现已更新 qwq

            fish
            fish  2020-01-07, 23:59

            终于搞定。不是什么制表符的问题。需要把
            tls-service-key: "privkey.pem"
            tls-service-pem: "fullchain.pem"
            tls-port: 853
            forward-tls-upstream: yes
            分别改为:
            ssl-service-key: "privkey.pem"
            ssl-service-pem: "fullchain.pem"
            ssl-port: 853
            forward-ssl-upstream: yes

            fish
            fish  2020-01-06, 22:05

            告诉我你的email地址,我发vps的登陆细节给你,你登陆进去,帮我搞一下。

            fish
            fish  2020-01-06, 13:02

            按下Tab 键,输入directory: "/etc/unbound" ,
            然后又按下Tab 键,输入username: unbound吗?
            没有用啊。问题依旧

             柊 ゆり子
            柊 ゆり子  2020-01-05, 23:31

            可以按下Tab 键输入制表符,制表符就是将 "directory" "username" 等表示为 "server" 的子项
            如果没有制表符, "directory" "username" 等就会与 "server" 表示为一个项了
            而实际上 "server" 是一个大的项, "directory" "username" 等作为 "server" 下的子项。
            详细可以看看我在博客正文中所给出的 unbound.conf 内容

            fish
            fish  2020-01-05, 18:16

            什么是制表符?

          fish
          fish  2020-01-05, 17:17

          root@rd:/etc/unbound# unbound -v
          [1578215677] unbound[21553:0] notice: Start of unbound 1.6.7.
          root@rd:/etc/unbound#
          root@rd:/etc/unbound# cat /etc/os-release
          NAME="Ubuntu"
          VERSION="18.04 LTS (Bionic Beaver)"
          ID=ubuntu
          ID_LIKE=debian
          PRETTY_NAME="Ubuntu 18.04 LTS"
          VERSION_ID="18.04"
          HOME_URL="https://www.ubuntu.com/"
          SUPPORT_URL="https://help.ubuntu.com/"
          BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
          PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
          VERSION_CODENAME=bionic
          UBUNTU_CODENAME=bionic
          root@rd:/etc/unbound#

    liji
    liji  2019-08-03, 09:20

    配置报错呢 可以私聊你吗

      柊 ゆり子
      柊 ゆり子  2019-08-14, 16:01

      嗯呐,可以留下联系方式吗?