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

14 KiB
Raw 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:30 和 14: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