DNS 搭建学习记录

94次阅读
没有评论

共计 3133 个字符,预计需要花费 8 分钟才能阅读完成。


概述

因为国内 DNS 污染严重,虽然人在国外为了避免 DNS 泄露决定自己搭建一套 DNS 服务器。但是我的主路由使用 Ros,旁路由使用 Linux,又因为之前使用的 OpenWrt 经常在保存配置文件时卡住,进而崩掉系统,导致我有点 PTSD 了。遂放弃 OpenWrt 方案。

DNS 架构

这套 DNS 服务器架构使用一个根 DNS, 一个 Adguardhome。
运行流程:

graph TB
A(用户)-->|访问|B(Adguardhome)
B-->|查询|C(Root DNS)
B-->|缓存|B
C==>|1查询结果|B
B==>|1发送|A
B-->|2查询结果|A

在这个系统中,有两种情况,

  • 1. AdGuardHome 中有缓存,直接返回。
  • 2. AdGuardHome 没有缓存,查询根 DNS 再执行递归查询操作,最后将获得的结果写入缓存以供下次使用。

如果在国内可能还要再加上国内外分流,这会在递归 DNS 查询时,增加分流步骤。人在国外,就不研究了。可以自行google

搭建

我自己也是一知半解,属于是摸石头过河。

Root DNS

本节中将使用 BIND 搭建Root DNS

准备

  • 一台可以联网的 Linux 系统的虚拟机/实体机
  • 一份 bind9 稳定版安装包 下载
  • 一份 bind9 官方帮助文档 查看
  • 一份 IANA官网 的根服务器DNS 记录文件

开始

按照bind9文档安装,我安装的位置是在/etc/bind

  ├── bind.keys
  ├── db.0
  ├── db.127
  ├── db.255
  ├── db.empty
  ├── db.local
  ├── named.conf
  ├── named.conf.default-zones
  ├── named.conf.local
  ├── named.conf.options
  ├── rndc.key
  ├── root.hints
  ├── root.zone
  └── zones.rfc1918

编辑文件named.conf.default-zone添加下面文字

zone "." {
        type hint;
        file "/etc/bind/root.hints";
};

注意

Ubuntu 系统在配置 DNS 时,需要先关闭systemd-resolved

sudo systemctl stop systemd-resolved && \
sudo systemctl disenable systemd-resolved

将/etc/resolv.conf文件删除并重新编写一次。在 rootDNS 配置完成前填入

nameserver 1.1.1.1
nameserver 8.8.8.8

配置完成后填入

nameserver 127.0.0.1

测试

安装 dnsutils 使用 dig 测试是否安装成功
DNS 搭建学习记录

Adguardhome

本节中将搭建 Adguardhome 服务

准备

  • 一台可以联网的 Linux 系统的虚拟机/实体机
  • 一份 Adguardhome 的规则 (这里不做推荐,自行 google)
  • 一份 Adguardhome 的文件压缩包 下载
  • 一份 Adguardhome 的帮助文档 查看

开始

安装方案一:使用官方脚本

curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
wget --no-verbose -O - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
fetch -o - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v

安装方案二:将 AdGuardHome 压缩包解压。再配置 systemctl 来管理自启动。

注意

  • AdGuardHome 会在文件中生成一个类似querylog.json的文件,这个文件会随着时间不断变大,然后boom。所以需要请示清除
    ../data/filters/ 中存储Adhome的过滤器配置 初始文件树大概是
      ├── AdGuardHome
      ├── AdGuardHome.yaml
      ├── CHANGELOG.md
      ├── LICENSE.txt
      └── README.md

使用后大概是

      ├── AdGuardHome
      ├── AdGuardHome.sig
      ├── AdGuardHome.yaml
      ├── CHANGELOG.md
      ├── LICENSE.txt
      ├── README.md
      └── data
          ├── filters
          │   ├── 1730121552.txt
          │   ├── 1730121553.txt
          │   ├── 1730121554.txt
          │   ├── 1730121555.txt
          │   ├── 1730121556.txt
          │   ├── 1730121557.txt
          │   ├── 1730121558.txt
          │   ├── 1730121559.txt
          │   ├── 1730121560.txt
          │   ├── 1730121561.txt
          │   ├── 1730194805.txt
          │   ├── 1730194806.txt
          │   ├── 1730194807.txt
          │   ├── 1730194808.txt
          │   ├── 1730194809.txt
          │   ├── 1730194810.txt
          │   ├── 1730194811.txt
          │   └── 1730194812.txt
          ├── querylog.json
          ├── sessions.db
          └── stats.db
  • 正常是使用 systemctl 管理AdGuardHome,如果无法使用,在/etc/systemd/system/路径下创建一个AdGuardHome.service文件并填入下面内容。 [Unit] Description=AdGuard Home: Network-level blocker ConditionFileIsExecutable=/opt/AdGuardHome/AdGuardHome After=syslog.target network-online.target [Service] StartLimitInterval=5 StartLimitBurst=10 ExecStart=/opt/AdGuardHome/AdGuardHome "-s" "run" WorkingDirectory=/opt/AdGuardHome StandardOutput=journal StandardError=journal Restart=always RestartSec=10 EnvironmentFile=-/etc/sysconfig/AdGuardHome [Install] WantedBy=multi-user.target

路由

将 DHCP 中 DNS 设置为 AdguardHome 的 ip 地址。很简单啦。

测试

Windows 系统使用 nslookup xxx.com,Linux 系统使用 dig xxx.com 测试电脑使用什么 DNS 以及耗时多少。
DNS 搭建学习记录

DNS 搭建学习记录

如果这里 Server 都是 AdguardHome 的 ip 地址就说明没问题了。

参考

正文完
 0
评论(没有评论)