Files
pve_toss_notes/06.PVE制作DNS服务器.md
2026-08-26 00:00:40 +08:00

14 KiB
Raw Permalink Blame History

1.克隆虚拟机

在上一篇文章 05.PVE制作虚拟机模板 中,已经制作好了虚拟机模板。

接下来将基于该模板克隆新虚拟机,并通过安装 DNS 服务器软件,完成内网 DNS 服务器的搭建。

鼠标 右键单击 虚拟机模板,在弹出的菜单中选择 克隆

克隆虚拟机

在弹出的虚拟机克隆对话框中,根据实际情况及下方表格内容,修改虚拟机参数。

参数 说明
目标节点 node01 当前 PVE 服务器节点
VM ID 201 可自定义,不能与现存虚拟机 VM ID 相同
名称 DNS01 可自定义,Cloud-Init 将使用该名称作为虚拟机 hostname
模式 完整克隆 选择虚拟机的克隆模式
目标存储 local-lvm 克隆出的虚拟机文件存储位置

修改参数后,点击 克隆 ,即可使用该模板克隆出新的虚拟机。

克隆虚拟机参数

2.调整 Cloud-Init

克隆出来的虚拟机的 Cloud-Init 参数默认与模板完全一致。

根据 内部网络地址 规划,内网 DNS 服务器 IPv4 地址规划如下:

  • 172.16.1.2/24

  • 172.16.1.3/24

因此需要调整新虚拟机的 Cloud-Init 参数。

  • IP配置 中的 IPv4 地址参数为 172.16.1.2/24 ,网关保持 172.16.1.1 不变。

  • IP配置 中的 IPv6 地址参数为 auto ,网关保持为空。

需要注意的是,如果修改了 用户 参数,相当于新建了一个系统管理员,之前设置的 oh-my-zsh 需要在新管理员下重新设置。

调整新虚拟机Cloud-Init

当主路由配置了 IPv6 ULA 网段,内网 DNS 服务器 IPv6 ULA 地址规划如下:

  • fdac::2/64

  • fdac::3/64

此时需进一步调整新虚拟机的 Cloud-Init 参数,让该虚拟机使用指定的 IPv6 ULA 地址,参数如下。

调整新虚拟机Cloud-Init

3.调整配置参数

04.PVE创建模板虚拟机 中提到过,新虚拟机需要修改配置参数才能自动启动。

进入左侧虚拟机 选项 页面,将虚拟机 开机自启动 参数设置为

克隆虚拟机自动启动

鼠标 双击 启动/关机顺序 选项,可调整虚拟机的自动开机参数。

启动/关机顺序2 ,表示该虚拟机第 2 个启动,倒数第 2 个关机。

启动延时15 ,表示该虚拟机启动后,延迟 15 秒再启动下一个虚拟机。

克隆虚拟机自动启动顺序

4.调整系统端口

设置完成后,将该虚拟机开机,使用终端工具登录,并执行以下命令检查端口占用。

## 检查 53 端口占用
$ sudo lsof -n -i :53

#### 端口占用示例输出
COMMAND   PID            USER FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 357 systemd-resolve 18u  IPv4   3293      0t0  UDP 127.0.0.53:domain
systemd-r 357 systemd-resolve 19u  IPv4   3294      0t0  TCP 127.0.0.53:domain (LISTEN)
systemd-r 357 systemd-resolve 20u  IPv4   3295      0t0  UDP 127.0.0.54:domain
systemd-r 357 systemd-resolve 21u  IPv4   3296      0t0  TCP 127.0.0.54:domain (LISTEN)

当前系统 53 端口被 systemd-resolved.service 占用,会导致设置 DNS 服务时监听端口失败。

为了正常使用 53 端口,需要对 systemd-resolved.service 进行配置,执行以下命令。

## 创建 systemd-resolved 配置目录
$ sudo mkdir -p /etc/systemd/resolved.conf.d

## 创建 systemd-resolved 配置文件
$ sudo tee /etc/systemd/resolved.conf.d/10-server-dns.conf >/dev/null <<'EOF'
# This configuration file is customized by fox,
# Optimize system resolve parameters for local DNS server.

[Resolve]
DNS=127.0.0.1
DNS=::1
DNSStubListener=no
LLMNR=no
MulticastDNS=no
EOF

配置文件编辑完成后,还需调整系统 resolv.conf 配置文件,执行以下命令。

## 创建 resolv.conf 软链接
$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

配置完成后,需重启 systemd-resolved.service 服务,并再次检查系统 53 端口占用。

## 重启 systemd-resolved.service
$ sudo systemctl restart systemd-resolved.service

5. Adguard Home

Adguard Home 将采用 snap 形式安装,执行以下命令。

## 安装 Snap
$ sudo apt install snapd

## 安装 Adguard Home
$ sudo snap install adguard-home

5.1.自动更新

查看 Snap 当前的更新策略,执行以下命令。

## 显示当前 Snap 自动更新设置
$ sudo snap refresh --time

Snap 自动更新时间设置为每天 2:30-3:3014:30-15:30 两个时间段。

## 修改 Snap 自动更新时间
$ sudo snap set system refresh.timer=2:30-3:30,14:30-15:30

## 其他 Snap 自动更新时间设置语法参考
$ sudo snap set system refresh.timer=mon,2:30,,fri,2:30

5.2.配置 Adguard Home

关于 Adguard Home 配置相关内容,请参阅 Adguard Home 折腾手记

5.3.定时任务

本步骤为可选操作,主要用于设置 Adguard Home 定时重启。

## 创建 Adguard Home 定时重启任务
$ sudo tee /etc/cron.d/adguard-home-restart >/dev/null <<'EOF'
30 4 * * * root /usr/bin/snap restart adguard-home
EOF

## 设置定时任务文件权限
$ sudo chmod 0644 /etc/cron.d/adguard-home-restart

6. SmartDNS

若需使用 SmartDNS 代替 Adguard Home ,可使用 Debian 官方源进行安装,但其版本通常较为 “过时” 。

因此,更推荐使用其 Github 仓库中的最新稳定版进行安装,官方仓库请参阅 pymumu/smartdns

多数情况下,SmartDNS 足以提供良好的 DNS 解析服务,但为了进一步优化 DNS 解析流程,推荐与 Dnsmasq 嵌套使用。

## 安装 Dnsmasq
$ sudo apt install dnsmasq

检查 dnsmasq.service 服务状态,确保该服务开机自启。

## 检查 dnsmasq.service
$ sudo systemctl status dnsmasq.service

## 设置 dnsmasq.service 开机自启
$ sudo systemctl enable dnsmasq.service

## 停止 dnsmasq.service
$ sudo systemctl stop dnsmasq.service

下载 SmartDNS 当前最新版本时,请根据系统架构选择合适的版本,执行以下命令。

## 下载 SmartDNS 安装包
$ curl -LR https://github.com/pymumu/smartdns/releases/download/Release48.4/smartdns.1.2026.08.05-0921.x86_64-linux-all.tar.gz | tar -xz -C /tmp

## 安装 SmartDNS
$ sudo /tmp/smartdns/install -i

后续 SmartDNS 推出新版本需原位升级时:先下载最新版本,再将以下命令替代原安装命令执行,升级后现有配置不会丢失。

## 升级 SmartDNS
$ sudo /tmp/smartdns/install -U

修改 SmartDNS 配置之前,需检查 smartdns.service 服务状态,确保该服务开机自启。

## 检查 smartdns.service
$ sudo systemctl status smartdns.service

## 设置 smartdns.service 开机自启
$ sudo systemctl enable smartdns.service

6.1. SmartDNS 附加配置

本步骤为可选操作,通过安装 SmartDNS 附加配置文件,以达到屏蔽广告或加速中国境内域名解析速度的目的。

若需使用 SmartDNS 屏蔽广告,则需下载广告规则配置文件。

## 创建 SmartDNS 配置目录
$ sudo mkdir -p /etc/smartdns.d

## 下载广告规则配置文件
$ sudo curl -LR -o /etc/smartdns.d/anti-ad.smartdns.conf https://anti-ad.net/anti-ad-for-smartdns.conf

SmartDNS 的加速规则通过 bash 脚本安装,脚本生成的配置文件位于 /etc/smartdns.d 目录。

关于脚本的详细介绍,请参阅 SmartDNS China List 安装脚本

## 下载加速规则安装脚本
$ sudo curl -LR -o /usr/local/bin/smartdns-cnlist https://gitee.com/callmer/smartdns_china_list_installer/raw/main/smartdns-china-list-installer.sh

## 设置脚本可执行权限
$ sudo chmod +x /usr/local/bin/smartdns-cnlist

## 设置脚本文件防篡改
$ sudo chattr +i /usr/local/bin/smartdns-cnlist

## 执行脚本
$ sudo /usr/local/bin/smartdns-cnlist

6.2.定时任务

本步骤为可选操作,主要用于设置 SmartDNS 定时更新附加配置文件和定时重启。

若使用了 SmartDNS 加速规则的安装脚本,由于脚本自带服务重启功能,因此定时任务可设置如下。

## 创建 SmartDNS 规则更新任务
$ sudo tee /etc/cron.d/smartdns-rules-update >/dev/null <<'EOF'
20 9 * * * root /usr/bin/curl --retry-connrefused --retry 5 --retry-delay 5 --retry-max-time 60 -fsSLR -o /etc/smartdns.d/anti-ad.smartdns.conf https://anti-ad.net/anti-ad-for-smartdns.conf
30 9 * * * root /usr/local/bin/smartdns-cnlist
EOF

## 设置定时任务文件权限
$ sudo chmod 0644 /etc/cron.d/smartdns-rules-update

若仅需定时重启 SmartDNS 服务,可使用以下命令覆盖该定时任务文件。

## 创建 SmartDNS 规则更新任务
$ sudo tee /etc/cron.d/smartdns-rules-update >/dev/null <<'EOF'
20 9 * * * root /usr/bin/curl --retry-connrefused --retry 5 --retry-delay 5 --retry-max-time 60 -fsSLR -o /etc/smartdns.d/anti-ad.smartdns.conf https://anti-ad.net/anti-ad-for-smartdns.conf
30 9 * * * root /usr/bin/systemctl restart smartdns.service
EOF

## 设置定时任务文件权限
$ sudo chmod 0644 /etc/cron.d/smartdns-rules-update

6.3. SmartDNS 主配置

SmartDNS 配置较为复杂,可按需制定各类 DNS 请求规则,建议先查阅官方提供的 配置指导配置选项

修改 SmartDNS 主配置文件之前,建议关闭 SmartDNS 并清理 DNS 缓存文件。

## 关闭 smartdns.service
$ sudo systemctl stop smartdns.service

## 清理进程标识文件
$ sudo rm -rvf /var/run/smartdns.pid /run/smartdns.pid

SmartDNS 的主配置文件一般位于 /etc/smartdns 目录下,修改配置文件之前,执行以下命令将其备份。

## 备份 SmartDNS 主配置文件
$ sudo mv /etc/smartdns/smartdns.conf /etc/smartdns/smartdns.conf.bak

创建 SmartDNS 主配置文件,执行以下命令。

## 创建 SmartDNS 主配置文件
$ sudo editor /etc/smartdns/smartdns.conf

在编辑器对话框中输入以下内容,并保存。

额外说明:

  • SmartDNS 端口监听参数为 6053@lo WebUI 端口监听参数为 5380 ,请根据实际情况进行调整
  • WebUI 默认用户名密码为 admin/password ,若需公网访问建议将默认密码修改为强密码
# This configuration file is customized by fox,
# Optimize SmartDNS parameters for local DNS server.
#
# For use common DNS server as upstream DNS server,
# please modify 'server' parameter according to
# your network environment.
#
# eg:
#       server 223.5.5.5
#       server 180.184.1.1
#       server 119.29.29.29
#       server 114.114.114.114
#       server 2402:4e00::
#       server 2400:3200::1

conf-file /etc/smartdns.d/*.conf

log-level notice
log-console yes
log-size 16M
log-num 8

audit-enable yes
audit-SOA yes
audit-size 16M
audit-num 8

plugin smartdns_ui.so
smartdns-ui.ip https://[::]:5380
smartdns-ui.token-expire 1800
smartdns-ui.max-query-log-age 604800

bind [::]:6053@lo
bind-tcp [::]:6053@lo

cache-size 32768
max-query-limit 1024
max-reply-ip-num 16

prefetch-domain yes

serve-expired yes
serve-expired-ttl 129600
serve-expired-reply-ttl 30
serve-expired-prefetch-time 28800

rr-ttl-min 60
rr-ttl-max 28800
rr-ttl-reply-max 14400

server-tcp 180.184.1.1 -bootstrap-dns
server-tcp 101.226.4.6 -bootstrap-dns
server-tcp 2400:3200::1 -bootstrap-dns
server-tcp 2400:3200:baba::1 -bootstrap-dns

server-tls dot.pub
server-tls dns.alidns.com
server-https https://doh.pub/dns-query
server-https https://dns.alidns.com/dns-query

server-h3 h3://dns.alidns.com/dns-query -fallback
server-https https://doh.360.cn/dns-query -fallback

SmartDNS 主配置文件配置完成后,执行以下命令修正文件权限。

## 修正 SmartDNS 主配置文件权限
$ sudo chmod 0640 /etc/smartdns/smartdns.conf

6.4.配置 Dnsmasq

Dnsmasq 的主配置文件一般位于 /etc 目录下,修改配置文件之前,执行以下命令。

## 创建 Dnsmasq 配置目录
$ sudo mkdir -p /etc/dnsmasq.d

创建 Dnsmasq 主配置文件,执行以下命令。

## 创建 Dnsmasq 主配置文件
$ sudo editor /etc/dnsmasq.d/10-server-dnsmasq.conf

在编辑器对话框中输入以下内容,并保存。

额外说明:

  • 请根据系统内存使用情况,调整缓存参数 cache-size
  • 配置文件中监听的网卡名为 eth0 ,请根据实际情况进行调整
  • 配置文件中内网域名为 fox.internal ,请根据实际情况进行调整
  • Dnsmasq 有且仅有 SmartDNS 作为上游 DNS 服务器
# This configuration file is customized by fox,
# Optimize dnsmasq parameters for local DNS server.

# Main Config

log-facility=/var/log/dnsmasq.log
log-async=20

cache-size=2048
max-cache-ttl=7200
fast-dns-retry=1800

interface=eth0

bind-dynamic
bogus-priv
domain-needed
no-hosts
no-ident
no-resolv
no-round-robin
stop-dns-rebind
rebind-domain-ok=/fox.internal/

# DNS Filter

local=/alt/
local=/bind/
local=/example/
local=/home.arpa/
local=/internal/
local=/invalid/
local=/lan/
local=/local/
local=/localhost/
local=/onion/
local=/test/

# DNS Server

server=/fox.internal/172.16.1.1
server=127.0.0.1#6053

7.清理系统

内网 DNS 服务器已部署配置完毕,正式投产前,可按需对系统进行清理优化。

## 清理系统软件包
$ sudo bash -c 'apt clean && apt autoclean && apt autoremove --purge'

## 清理系统缓存
$ sudo bash -c 'find /var/cache/apt/ /var/lib/apt/lists/ /tmp/ -type f -print -delete'

## 清理 SmartDNS 缓存、持久化数据文件(WebUI 自定义密码存储于此文件)
$ sudo bash -c 'find /var/cache/smartdns/ /var/lib/smartdns/ -type f -print -delete'

## 清理系统日志
$ sudo bash -c 'find /var/log/ -type f -print -delete'

## 清理命令历史记录文件并关闭系统
$ rm -rvf ~/.bash_history ~/.zsh_history ~/.zcompdump* && history -c && sudo shutdown now