首页
关于本站
私人 DNS 加密设置教程
全部文章
推荐
加密 DNS 服务
DNS 实时战报
过滤规则订阅
搜索
网络与 DNS
加密 DNS 实操
路由器与家庭网络
自建服务
AdGuard Home
服务器运维
开发与工具
安全与隐私
登录
搜索
23-4.CN
累计撰写
59
篇文章
累计收到
3
条评论
首页
分类
网络与 DNS
加密 DNS 实操
路由器与家庭网络
自建服务
AdGuard Home
服务器运维
开发与工具
安全与隐私
页面
关于本站
私人 DNS 加密设置教程
全部文章
推荐
加密 DNS 服务
DNS 实时战报
过滤规则订阅
注册丨登录
搜索到
15
篇
分类为
自建服务
的文章
2026-10-05
服务器磁盘满了怎么查:df / du / inode / 日志轮转的可执行排查顺序
这篇是服务器运维笔记,和 DNS 无关。站内的加密 DNS 服务在dns.23-4.cn。小服务器的根分区通常很小。我手上这台香港的小机器就是 1.2 GB 的根分区,日常只剩 300 多 MB。这种机器上「磁盘满」不是小概率事件,而是迟早的事——而且它挂起来的样子往往不像磁盘问题:nginx 报 500、PHP 写不了 session、数据库锁不上,你却在查代码。这篇是一份按顺序执行的排查清单,从「确认是磁盘」到「找到元凶」再到「防止复发」。一、先确认是不是磁盘,别急着查别的df -h看三件事:哪个挂载点是满的(Use% 接近或达到 100%);是不是根分区满(/),而不是数据分区——根分区满会连带影响 /tmp、日志、session,表现最杂;Available 是不是真的接近 0。# 记录一个基线,后面所有操作都拿它对比 df -h /还有一个容易被忽略的:inode 用满。df -iinode 满了的表现和磁盘满了几乎一样(写不进去文件),但 df -h 会显示还有空间。大量小文件(session 文件、缓存碎文件、邮件队列)是典型原因。二、找到是谁占的不要一上来 du -sh /*,那会遍历整个文件系统、很慢,还可能把挂载的外部存储也扫进去。用 -x 限制在同一个文件系统:# 第一层:看哪个顶层目录大 du -x -h --max-depth=1 / 2>/dev/null | sort -h # 锁定嫌疑目录后,再往里钻一层 du -x -h --max-depth=1 /var 2>/dev/null | sort -h du -x -h --max-depth=1 /var/log 2>/dev/null | sort -hsort -h 让结果按人类可读单位排序,一眼就能看到最大的。小服务器上最常见的四个元凶:目录原因处理/var/log日志没有轮转,或轮转配置没生效配 logrotate,或直接限制大小/var/lib/nginx/tmp 或类似nginx 把大的上游响应缓冲到磁盘见下面第四节/var/cache/apk(Alpine)包管理器的下载缓存apk cache clean/var/lib/docker镜像和容器层堆积docker system prune(确认后再执行)三、最阴的一种:文件被删了,空间没释放这是排查里最容易卡住的情况:du 加起来明明只有 200 MB,df 却说用掉了 1 GB。原因是有进程还持有已删除文件的句柄。文件在目录里已经看不见了,但 inode 没释放,空间就一直占着。# 找出所有被删除但仍被占用的文件 lsof +L1 2>/dev/null | head -30 # 没有 lsof 时的替代做法 ls -l /proc/*/fd 2>/dev/null | grep deleted | head -30输出里会看到类似 nginx 1234 ... 5u REG ... 500000000 /var/log/nginx/access.log (deleted)——一个 500 MB 的已删除日志。处理方式只有两种:重启那个进程(释放句柄,空间立刻回来);或者不要重启,用 truncate 清空当前文件(如果进程还在往里写新文件的话)。注意:rm 一个正在被写的日志文件不会释放空间,只是把它变成「不可见的占用」。正确做法是 truncate -s 0 file.log 或让 logrotate 用 copytruncate。四、nginx 把响应缓冲到了磁盘nginx 的 error.log 里会出现这种警告:[warn] an upstream response is buffered to a temporary file /var/lib/nginx/tmp/fastcgi/1/98/0000002981 while reading upstream这不是错误,但它说明上游(PHP-FPM)返回的响应超过了内存缓冲区,nginx 把它落盘了。如果上游返回很大的响应(比如一个几百 KB 的 HTML、或者一个大的 JSON 接口),这些临时文件会持续产生。两个方向:# 1. 让缓冲区能装下正常的响应(按你的实际响应大小调) fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; # 2. 给临时目录设上限,避免无限增长 fastcgi_max_temp_file_size 64m; fastcgi_temp_path /var/lib/nginx/tmp/fastcgi 1 2;另外要确认临时目录会被清理。nginx 正常情况下会自己删,但如果进程被强杀过,残留文件会留在那里:du -sh /var/lib/nginx/tmp/* 2>/dev/null find /var/lib/nginx/tmp -type f -mtime +1 2>/dev/null | head五、日志轮转:一次配好,长期省心# /etc/logrotate.d/myapp /var/log/myapp/*.log { daily rotate 7 maxsize 50M # 单个文件超过 50M 就轮转,不等第二天 missingok notifempty compress delaycompress copytruncate # 关键:不重启进程也能释放空间 }maxsize 和 copytruncate 这两行是关键:maxsize 让「一天涨 2 GB」这种突发情况当天就被截住;copytruncate 避免「轮转后进程还拿着旧句柄」的问题——也就是第三节那个坑。Alpine 上 logrotate 不在默认安装里,要单独装:apk add logrotate # 确认 cron 里有这一行,否则 logrotate 根本不会跑 grep logrotate /etc/crontabs/root /etc/periodic/daily/* 2>/dev/null最容易犯的错是配好了 logrotate 但没验证它真的执行过。 用 logrotate -d(dry-run)先看一遍:logrotate -d /etc/logrotate.d/myapp六、给根分区留出安全垫在小分区上,与其等它满了再救,不如主动留垫:把日志目录单独挂载(或软链到数据盘),别让日志吃掉根分区;给关键服务设置自己的上限:journald 的 SystemMaxUse、docker 的 log-opts max-size、nginx 的 temp 上限;加一条最简单的告警,超过 85% 就提醒:#!/bin/sh # /etc/periodic/daily/check-disk THRESHOLD=85 USED=$(df / | awk 'NR==2 {gsub("%","",$5); print $5}') if [ "$USED" -ge "$THRESHOLD" ]; then echo "root filesystem ${USED}% full on $(hostname)" | \ mail -s "disk warning" you@example.com fi在改动前后都记一次 df -h /。这样你能明确知道「这次操作多占了多少」——尤其是往服务器上传东西的时候。七、完整流程回顾df -h # 1. 确认哪个分区满 df -i # 2. 顺便看 inode du -x -h --max-depth=1 / # 3. 找出大目录 lsof +L1 # 4. 查「已删除但被占用」的文件 # 5. 处理:清缓存 / 轮转日志 / 重启持有句柄的进程 # 6. 配 maxsize + copytruncate,防止复发 # 7. 加一个 85% 的告警顺序很重要:先量,再改。跳过第 3、4 步直接去删东西,很容易删掉不该删的,而真正的元凶还在那儿。相关阅读Alpine 轻量服务器初始化清单:时钟、Nginx、PHP 一篇配齐阿里云 2 元/月服务器防天价账单:流量监控脚本实操在 Alpine Linux 上从零搭一个 Typecho:nginx + php-fpm + SQLite 的完整清单
2026年10月05日
86 阅读
0 评论
0 点赞
2026-10-04
在 Alpine Linux 上从零搭一个 Typecho:nginx + php-fpm + SQLite 的完整清单
这篇是服务器搭建笔记,和 DNS 无关。站内的加密 DNS 服务在dns.23-4.cn。Alpine 做 Web 服务器有几个很实际的好处:镜像小、内存占用低、包管理干净。但它的目录结构、服务管理和多数人熟悉的 Debian 系不一样,第一次搭容易在几个固定位置上卡住。这篇是把一个 Typecho 博客在 Alpine 上跑起来的完整清单,按顺序执行即可,重点标出容易踩的坑。一、装包apk update apk add nginx \ php84 php84-fpm php84-session php84-json \ php84-pdo_sqlite php84-mbstring php84-openssl \ php84-curl php84-dom php84-fileinfo php84-iconv \ sqlite注意几点:Alpine 的 PHP 包按大版本命名(php84),不是 php。装之前先 apk search php84 确认版本号,Alpine 升级后包名会变;php84-pdo_sqlite 必须显式安装。Typecho 用 SQLite 时依赖它,缺了会在安装页报「无法连接数据库」,而错误信息不会告诉你缺的是哪个扩展;php84-session 也是必需的,Typecho 的登录和 CSRF 依赖它。二、服务管理是 OpenRC,不是 systemd这是 Debian 用户最容易懵的地方:rc-update add nginx default # 开机自启 rc-update add php-fpm84 default rc-service nginx start rc-service php-fpm84 start rc-service nginx status没有 systemctl,对应的是 rc-service / rc-update;日志不在 journalctl 里,而是各自的日志文件(nginx 在 /var/log/nginx/,PHP 在 /var/log/php84/error.log);服务的 init 脚本在 /etc/init.d/。三、PHP-FPM 监听确认 /etc/php84/php-fpm.d/www.conf 里的监听方式:listen = 127.0.0.1:9000 ; 或者用 unix socket,性能略好 ; listen = /run/php-fpm84/php-fpm.sock用 TCP 更省事,不用处理 socket 的属主和权限。用 socket 的话记得让 nginx 用户能读写。四、nginx 站点配置server { listen 80; server_name example.com; root /var/www/typecho; index index.php index.html; client_max_body_size 20m; location / { try_files $uri $uri/ /index.php$uri?$query_string; } location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ { expires 7d; add_header Cache-Control "public"; try_files $uri =404; } location ~ .*\.php(\/.*)*$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_read_timeout 60s; } }这里有三个必须理解的点1. try_files ... /index.php$uri?$query_string —— 这是伪静态的关键。Typecho 的「重写」打开后,链接是 /archives/1/、/category/xxx/ 这种没有 .php 的形式。这些路径在磁盘上不存在,必须交给 index.php 处理。写成 /index.php?$query_string 会丢掉路径信息,结果是所有伪静态链接都变成首页或 404。2. fastcgi_split_path_info + PATH_INFO —— 少了它,Typecho 认不出路由。请求 /index.php/archives/1/ 时,PHP 需要知道 .php 后面那一段是「路径信息」。没有这两行,Typecho 拿不到 /archives/1/,就会走 404 分支。这个坑的症状是:首页正常,但所有文章页、分类页、标签页全部 404。3. location ~* \.(js|css|...)$ 这个正则块要放在 location / 后面、php 块前面。nginx 的匹配规则是「正则优先于前缀,正则之间按书写顺序」。顺序写错会让静态资源的 try_files 覆盖掉别的规则,或者反过来让 .php 请求走了静态分支——后者会把 PHP 源码当文本吐出来,非常危险。配完一定要测:# 如果这条命令返回了 PHP 源码,说明 php 块没匹配上 curl -s http://example.com/index.php | head -3五、装 Typecho 与 config.inc.php下载解压到 /var/www/typecho,然后走网页安装。SQLite 的配置在 config.inc.php 里长这样:$db = new \Typecho\Db('Pdo_SQLite', 'typecho_'); $db->addServer(array( 'file' => '/var/lib/typecho/typecho.db', ), \Typecho\Db::READ | \Typecho\Db::WRITE); \Typecho\Db::set($db);把数据库文件放在 Web 根目录之外(上面放在 /var/lib/typecho/)。放在根目录里的后果是:如果哪天 nginx 配置被人改错、或者多了一个不严谨的 location,.db 文件可能被直接下载——里面是所有用户的密码哈希。六、权限# Web 根目录给 web 用户,不要给 root chown -R nobody:nobody /var/www/typecho # 数据库目录只给 web 用户 chown -R nobody:nobody /var/lib/typecho chmod 750 /var/lib/typecho chmod 640 /var/lib/typecho/typecho.dbAlpine 上 nginx 的 worker 默认跑在 nginx 用户、PHP-FPM 的 pool 默认是 nobody。要让写文件的进程(PHP-FPM)对目录有写权限,否则上传附件、写 session、更新配置都会失败。查当前是谁在跑:ps aux | grep -E "nginx|php-fpm" | grep -v grep七、上 HTTPSapk add certbot certbot certonly --webroot -w /var/www/acme -d example.com -d www.example.com在 nginx 里加一个 location /.well-known/acme-challenge/ { root /var/www/acme; },然后 80 端口 301 到 443。续期一定要验证能跑通,别等三个月后证书过期才发现:certbot renew --dry-run八、上线前检查清单# 1. 伪静态是否生效(文章页应该 200,不是 404) curl -s -o /dev/null -w "%{http_code}\n" https://example.com/archives/1/ # 2. 分类 / 标签页 curl -s -o /dev/null -w "%{http_code}\n" https://example.com/category/default/ # 3. feed curl -s -o /dev/null -w "%{http_code}\n" https://example.com/feed/ # 4. PHP 没有被当源码吐出 curl -s https://example.com/index.php | head -1 # 5. 数据库文件不可下载(应该是 403 或 404) curl -s -o /dev/null -w "%{http_code}\n" https://example.com/typecho.db # 6. 根分区还剩多少 df -h /第 5 条尤其要做。小服务器上数据库就几十到几百 KB,很容易被随手放在根目录里。九、最容易踩的五个坑症状原因首页正常,其他页面全 404缺 PATH_INFO / fastcgi_split_path_info所有伪静态链接跳到首页try_files 写成了 /index.php?$query_string,丢了 $uri装 Typecho 时报连不上数据库没装 php84-pdo_sqlite上传附件 / 登录失败PHP-FPM 的运行用户对目录没有写权限浏览器直接下载到了 .db 文件数据库放在 Web 根目录里,且没有 deny 规则相关阅读Alpine 轻量服务器初始化清单:时钟、Nginx、PHP 一篇配齐服务器磁盘满了怎么查:df / du / inode / 日志轮转的可执行排查顺序AdGuard Home 迁移实录:从香港服务器搬到国内阿里云
2026年10月04日
17 阅读
0 评论
0 点赞
2026-10-02
网站被误拦了怎么办:怎么确认是 DNS 拦的,以及反馈后多久能修好
过滤规则订阅:https://www.23-4.cn/rules/ | 实时战报与反馈入口:https://www.23-4.cn/dns-status/ | 配置教程用了带过滤的 DNS 之后,迟早会遇到一次「这个网站明明是正常的,怎么打不开了」。这篇讲三件事:怎么确认是 DNS 拦的、怎么反馈才有用、大概多久能修好。一、先确认:真的是 DNS 拦的吗「打不开」的原因有很多,先做一个 30 秒的判定:判定方法:临时换一个解析器,再打开一次同一个网址。换成别的 DNS(或直接关掉私人 DNS)后能打开 → 基本可以确定是 DNS 层拦截或解析结果异常;换了还是打不开 → 不是 DNS 的问题,去看是不是网络、证书、站点本身故障;换了解析器后能打开但很慢/跳转 → 可能是解析到了错误节点,也属于解析问题。命令行版更精确,能直接看出返回了什么:# 看返回的 IP 是什么 nslookup www.example.com # 更详细:看是不是被返回了 0.0.0.0 / NXDOMAIN dig www.example.com +short # 对比另一个解析器的结果 dig @1.1.1.1 www.example.com +short三种典型的拦截特征:返回结果含义0.0.0.0 或 127.0.0.1典型的「被规则拦掉了」——用一个不可能连通的地址把域名黑洞掉NXDOMAIN(域名不存在)要么域名真不存在,要么被规则整条否决返回了一个正常 IP,但页面还是不对不是拦截,可能是缓存或站点问题二、误拦为什么会发生规则集来自公开的广告 / 恶意域名列表,做的是多源合并。合并过程本身会带来误伤,常见三类:父子域压缩过度:规则里写了 ads.example.com,合并时被压缩成 example.com,结果整个主域都被拦了;国产 App 的统计域名被误判:有些 SDK 的域名同时承担「统计」和「必要功能」两个角色,拦掉之后 App 的某个功能就挂了;共享域名:很多小站点挂在同一个二级域下(比如各种免费托管),拦了其中一个,整片遭殃。这三种都是可以修的,而且修法很明确:加白名单。三、怎么反馈才有用无效反馈:「你们把我网站拦了」「打不开了,快修」。这类信息量太低,需要来回问好几轮。有效反馈包含四件事:1. 完整域名(含子域名,不要只写主域) 例:cdn.static.example.com ← 而不是 example.com 2. 现象 例:nslookup 返回 0.0.0.0;关掉私人 DNS 后可以正常访问 3. 时间 例:2026-10-05 14:20 左右开始 4. 你验证过的对照结果 例:用 1.1.1.1 查是正常 IP 203.0.113.10,用你们的解析返回 0.0.0.0第 1 条最重要。 很多误拦其实是子域名级别的问题,如果只报主域,维护者要么修得过大(把整个主域放行,误拦是没了但广告也回来了),要么根本复现不了。反馈入口在 实时战报页:页面右下角有一个橙色按钮,点开可以直接提交问题或建议,也能看到已经提交的反馈列表。不需要注册,也不需要留邮箱。四、大概多久能修好说实话,不承诺 SLA——这是个人自建服务,不是商业产品。但可以给出真实的时间构成:阶段耗时说明看到反馈几分钟到几小时取决于维护者是否在线定位是哪条规则5~30 分钟需要反查合并后的规则文件加白名单 / 调整压缩逻辑几分钟改一条规则规则重新加载生效秒级到几分钟取决于部署方式你的设备看到变化几秒到 10 分钟受本地 DNS 缓存影响所以正常情况下几十分钟到几小时。如果只是单条规则误伤,通常更快;如果是「父子域压缩逻辑」这类系统性问题,可能要改生成脚本、重新出一版规则,那就得按小时算。如果你等不及,有两个自救办法:临时切回别的解析器,先把事办了;在自己的设备上加一条本地覆盖规则(如果你用的是 AdGuard Home 或支持自定义规则的路由器),把那个域名指向正确的 IP,或者放行到上游。五、自己维护规则的人:怎么加白名单如果你自建 AdGuard Home,修误拦只需要一条自定义规则,加在「自定义过滤规则」里即可:# 放行某个域名的所有子域(! 开头是注释,@@ 是白名单) @@||example.com^$important # 只放行特定子域 @@||cdn.static.example.com^$important 的作用是让白名单优先于所有黑名单规则,避免被后面的规则又拦回去。改完点「应用」,客户端缓存过期后就生效了。规则本身是公开的,可以在这里订阅:DNS 过滤规则开放订阅。六、小结先做「换解析器再试一次」的判定,别一上来就报障;反馈必须带完整子域名,这是最关键的一条;正常几十分钟到几小时能修好,但不要按商业 SLA 来预期;等不及就临时换解析器,或在自己设备上加 @@||域名^$important 白名单;反馈入口在战报页右下角的橙色按钮。相关阅读DNS 过滤规则开放订阅:免费去广告规则 + 自建加密 DNS 全指南AdGuard Home规则订阅怎么配置?去广告规则源推荐与拦截验证私人 DNS 是什么、适合谁:一份不带玄学的判断清单自建AdGuard Home教程:搭建属于自己的私人DNS服务器
2026年10月02日
10 阅读
0 评论
0 点赞
2026-10-01
免费公共DNS还是自建DNS服务器?私人DNS选型与成本对比
本文结论里那条"自建"的路其实已经有现成的了:不用自己搭服务器,直接用我们搭好的 dns.23-4.cn,等于自建的过滤能力加上公共服务的零运维。私人DNS 主机名:dns.23-4.cn | DoH 地址:https://dns.23-4.cn/dns-query | 配置教程 | 过滤战报TL;DR:一句话结论90%的普通用户,直接用免费公共DNS(阿里223.5.5.5、腾讯119.29.29.29)就够了——零成本、零运维、速度快。只有当你同时满足"有域名+懂基础Linux+在意隐私或需要自定义广告过滤规则"这三个条件时,自建DNS服务器(比如AdGuard Home)才值得投入。搜"私人DNS"的人很多都会纠结一个问题:我是直接填个公共DNS地址就完事,还是花心思自己搭一个?这篇文章把两条路的成本、隐私、可控性、运维门槛彻底掰开揉碎,帮你判断自己属于哪一类。免费公共DNS vs 自建DNS:核心维度对比对比维度免费公共DNS(阿里/腾讯/Cloudflare等)自建DNS服务器(AdGuard Home/Unbound等)直接成本完全免费VPS每月约30-80元(最低配);家用旧设备则电费忽略隐私程度信任第三方服务商的日志政策数据完全自持,查询记录只存在你自己的机器上广告拦截基础版基本没有;Cloudflare Families拦恶意网站完全自定义,可挂任意过滤规则列表,拦广告拦跟踪速度与稳定性大厂节点多,国内延迟10-30ms,SLA有保障取决于你买的VPS线路;家用宽带上行小,稳定性一般运维门槛填个地址就能用,零维护需要安装软件、配证书、更新系统、监控可用性故障影响面服务商挂了不是你的锅,换一个就行你自己的DNS挂了,全家断网,得自己修适合人群绝大多数普通用户、手机用户、不想折腾的人技术爱好者、有服务器闲置、对隐私/过滤有强需求的人具体的免费加密DNS地址清单,可以看本站免费加密DNS服务:DoH/DoT 地址与一键配置,这里不重复列。成本对比:自建到底要花多少钱免费公共DNS:0元你只需要在手机或路由器设置里填两个IP地址或一个DoT主机名,就完事了。没有任何费用,没有任何续费,服务商靠自己的商业模式养活这个服务。自建DNS服务器:从0元到每月上百元自建有两条路线,成本差别很大:路线一:家用旧设备/树莓派(接近0元)如果你家里有闲置的旧电脑、树莓派、甚至刷了OpenWrt的路由器,直接在上面装AdGuard Home或Unbound,硬件成本为零,电费每月几块钱。但缺点是家用宽带上行带宽小、公网IP不稳定,只能服务家里局域网内的设备,出门在外用不了。路线二:VPS云服务器(每月30-80元)买一台最低配的云服务器(1核1G带宽1M起步就够跑DNS),国内大厂价格大概每月30-60元,按需计费可能更便宜。好处是有公网IP、99.9%在线率,手机在外也能连。坏处是DNS查询要绕到你的VPS再出去,速度取决于VPS线路——如果你买的是国际VPS,国内访问反而可能比直接用公共DNS还慢。关键算账:一个月30元,一年就是360元。这笔钱够你买好几年的付费VPN或付费去广告服务了。自建DNS的价值不在于"省钱",而在于"完全可控"。隐私对比:你到底信谁这是自建派最常提的理由:"公共DNS会记录我的查询记录。"事实是:Cloudflare 1.1.1.1 有明确的零日志承诺,且经过独立第三方审计,非身份查询数据仅存25小时。隐私透明度在公共DNS里算顶级。Google Public DNS 临时日志24-48小时,城市级位置数据保留更久,不算零日志。国内三家(阿里、腾讯、114) 受国内网络安全法规约束,日志留存策略与海外服务商不同,公开透明度较低。自建的好处是:所有查询记录只存在你自己的硬盘上,没有第三方能看到你访问了哪些域名。如果你对"被监控"这件事极其敏感,自建确实是物理意义上最干净的方案。但要注意一个现实问题:自建DNS并不等于匿名。你的DNS查询仍然要通过你的宽带运营商出口发出去,运营商仍然能看到你和哪个IP通信。自建解决的是"DNS服务商那边记录"的问题,解决不了"运营商这边记录"的问题。真要匿名,得叠加DoH/DoT加密 + VPN。可控性对比:为什么那么多人自建是为了拦广告这才是自建DNS的真正杀手锏。免费公共DNS里,只有Cloudflare Families提供了基础的恶意网站拦截,Google和国内三家的免费版都不做内容过滤。你没法自定义"我要拦掉某个广告域名"或"我要加一个中文广告过滤列表"。而自建AdGuard Home的话,你可以:挂载任意过滤规则列表(EasyList中文版、乘风规则、AdGuard官方规则等)自定义黑白名单,想拦谁拦谁看到家里所有设备的DNS查询统计给不同设备分配不同的过滤策略这种掌控感,是公共DNS给不了的。本站后续会有专门的自建AdGuard Home教程和AdGuard Home规则订阅文章,这里先不展开。运维门槛:自建不是装完就完事很多人以为自建DNS就是docker install adguardhome一行命令,其实那只是开始。长期运维你要处理这些事:软件更新:AdGuard Home、Unbound都会持续发安全补丁,得定期更新证书维护:如果你要开DoH/DoT,需要SSL证书,Let's Encrypt证书三个月要续一次故障排查:哪天突然打不开网页了,是DNS挂了?还是上游挂了?还是证书过期了?得自己查性能调优:缓存大小怎么设?用哪个上游公共DNS做forwarder?都要试如果你连"SSH登录服务器"和"改配置文件"都没干过,自建DNS的学习曲线会让你很痛苦。决策清单:你适合自建吗?满足以下任意三条以上 → 可以考虑自建有自己的域名(用来配DoT/DoH证书)会基础Linux操作(SSH、改配置、systemctl重启服务)家里有闲置设备或已经买了VPS(不为DNS专门花钱)强烈需要自定义广告过滤/隐私保护规则喜欢折腾,享受自己搭东西的过程有多设备家庭,想统一管理全家上网满足以下任意一条 → 别自建,用公共DNS就好只是想让手机上网快一点、防劫持不会用命令行,也不想学预算有限,每月多花几十块有压力家里只有自己一个人用追求稳定性,不想自己当运维常见问题Q1:自建DNS是不是一定比公共DNS快?不一定。自建DNS的速度取决于你的VPS线路质量和你离VPS的距离。如果你买了个国内VPS做forwarder,延迟可能和公共DNS差不多;如果你买了个海外VPS,国内访问反而更慢。自建的优势主要在"可控"和"过滤",不在"更快"。Q2:我用了自建DNS,是不是就不需要开VPN了?不是一回事。DNS负责域名解析,VPN负责流量加密和路由。自建DNS拦广告、保护查询记录,但不加密你的网页流量。两者解决的问题不同,可以叠加使用。Q3:AdGuard Home和Unbound有什么区别?选哪个?AdGuard Home主打"带过滤的DNS",自带广告拦截、统计看板、Web管理界面,适合家庭用户。Unbound是纯递归解析器,没有过滤功能,性能强但配置全靠改文本文件,适合技术用户。新手建议直接上AdGuard Home。Q4:自建DNS会不会被运营商劫持?如果你只用53端口明文,理论上运营商仍然可能在中间做手脚。正确做法是自建DNS本身用DoH/DoT连接上游公共DNS,同时给你自己的客户端也提供DoT/DoH服务。这样从客户端到你的服务器,再从你的服务器到上游,全程加密。第三条路:不用自己搭,用别人搭好的本文的两难其实是"要么忍受公共 DNS 不能自定义过滤,要么自己扛一台服务器的运维"。还有第三条路——用现成的自建服务:本站的 dns.23-4.cn 就是一台已经跑起来的 AdGuard Home:加密:DoT(853)+ DoH(443)双协议,主机名 dns.23-4.cn,DoH 地址 https://dns.23-4.cn/dns-query;过滤:服务端加载自维护的多源合并去广告规则,实时拦截比例公开在战报页;成本:对你来说是 0 元、0 运维;对你唯一的代价是"规则由别人维护",遇到误拦截需要反馈;上手:见私人 DNS 加密设置教程,配完到战报页看自己的拦截数据。参考来源Cloudflare 1.1.1.1 隐私承诺 — 支撑文中Cloudflare零日志政策、25小时数据留存等事实,用于对比公共DNS隐私维度。Google Public DNS 隐私页面 — 支撑文中Google临时日志政策,用于对比公共DNS隐私维度。阿里云公共DNS官网 — 支撑文中国内公共DNS免费、支持DoT/DoH、企业版有过滤能力等事实。AdGuard Home 官方产品介绍 — 支撑文中AdGuard Home功能描述(网络级广告拦截、全设备覆盖、无需客户端软件),用于说明自建DNS的可控性优势。相关阅读公共DNS服务商对比:Cloudflare/Google/阿里/腾讯/114 哪个更适合你?自建AdGuard Home教程:搭建属于自己的私人DNS服务器AdGuard Home规则订阅怎么配置?去广告规则源推荐与拦截验证免费加密DNS服务:DoH/DoT 地址与一键配置指南私人DNS速度怎么样?DNS延迟测速方法与工具推荐选服务比选协议更影响体验:本站自建的 dns.23-4.cn 支持 DoT / DoH 双协议,解析的同时拦掉广告与跟踪器——配置教程。
2026年10月01日
12 阅读
0 评论
0 点赞
2026-10-01
自建AdGuard Home教程:搭建属于自己的私人DNS服务器
自己搭之前先想清楚要不要:如果你只是想用上加密 DNS 加去广告,直接用 dns.23-4.cn 就行,省一台服务器和一年的证书续期。私人DNS 主机名:dns.23-4.cn | DoH 地址:https://dns.23-4.cn/dns-query | 配置教程 | 过滤战报TL;DR:想拥有完全可控的私人DNS?你需要一台VPS、一个域名和一张TLS证书。用AdGuard Home官方脚本一键安装,在Web面板里配好上游DNS和加密协议(DoT端口853 / DoH端口443),就能让手机、电脑通过自己的域名连接私人DNS,全程广告拦截、防跟踪、零日志都由你说了算。搭建私人DNS之前需要准备什么?自建AdGuard Home不是装个软件就完事,你需要先备齐三样东西:一台有公网IP的VPS:国内可选阿里云、腾讯云轻量服务器,海外可选Vultr、DigitalOcean等。最便宜的入门款就够跑AdGuard Home。如果你担心服务器账单失控,可以参考本站这篇阿里云2元/月服务器防天价账单。一个域名:你需要一个域名来申请TLS证书,也是客户端连接私人DNS的地址。域名可以在Namesilo、阿里云、Cloudflare等平台注册,一年几十块钱。TLS证书:DoT和DoH都基于TLS加密,必须要有证书。推荐用Let's Encrypt免费申请,配合certbot自动续期。如果你刚买了一台轻量服务器不知道怎么初始化,本站有一篇Alpine轻量服务器初始化清单可以参考,里面涵盖了系统更新、防火墙、SSH加固等基础步骤。方法一:用官方脚本一键安装AdGuard HomeAdGuard Team官方提供了一键安装脚本,支持绝大多数Linux发行版。以root身份执行以下命令:wget --no-verbose -O - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v如果你用的是FreeBSD或其他带fetch工具的系统,可以换成:fetch -o - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v脚本会自动下载最新版AdGuard Home二进制文件、创建系统服务并启动安装向导。安装完成后,AdGuard Home会作为系统服务自动运行。方法二:用Docker部署(适合已有Docker环境的用户)官方也提供了Docker镜像 adguard/adguardhome。如果你更习惯容器化部署,可以用这条命令启动:docker run -d \ --name adguardhome \ --restart unless-stopped \ -v /your/host/workdir:/opt/adguardhome/work \ -v /your/host/confdir:/opt/adguardhome/conf \ -p 53:53/tcp -p 53:53/udp \ -p 80:80/tcp \ -p 443:443/tcp -p 443:443/udp \ -p 853:853/tcp -p 853:853/udp \ -p 3000:3000/tcp \ adguard/adguardhome:latest注意:Docker安装的AdGuard Home不会自动更新,需要你手动拉取新镜像并重启容器。这一点和脚本安装版不同,脚本版支持自动检测更新。安装后第一次配置:打开Web管理面板安装完成后,打开浏览器访问 http://你的服务器IP:3000,进入初始化设置向导。第一步:创建管理员账号设置用户名和密码,这是登录Web管理面板的凭据,务必用强密码。第二步:设置监听端口AdGuard Home默认监听以下端口,你需要确保防火墙放通:端口协议用途53UDP/TCP明文DNS服务(本站出于安全考虑没有对公网开放 53,只开了 853 / 443)3000TCPWeb管理面板(初始化阶段)80TCPWeb面板(可选,改完后建议关闭)853TCP/UDPDNS-over-TLS / DNS-over-QUIC443TCP/UDPDNS-over-HTTPS第三步:配置上游DNS在「设置 → DNS设置」里,填上上游DNS服务器地址。推荐用加密的公共DNS作为上游,比如:https://dns.23-4.cn/dns-query(本站 234 DNS 的 DoH 地址)https://dns.cloudflare.com/dns-query(Cloudflare 1.1.1.1 DoH)https://dns.google/dns-query(Google Public DNS DoH)tls://dns.23-4.cn(本站 234 DNS 的 DoT 地址)tls://dns.adguard-dns.com(AdGuard DNS DoT)这样你的AdGuard Home → 上游DNS这一段也是加密的,整条链路更安全。启用DoT和DoH:让客户端用加密方式连你的私人DNS这一步是自建私人DNS的核心——只有开了加密协议,手机才能在系统「私人DNS」设置里填你的域名。1. 先准备好TLS证书用certbot从Let's Encrypt申请一张免费证书。假设你的域名是 dns.example.com,证书文件通常在:证书文件:/etc/letsencrypt/live/dns.example.com/fullchain.pem私钥文件:/etc/letsencrypt/live/dns.example.com/privkey.pem2. 在AdGuard Home面板里开启加密进入「设置 → 加密设置」:勾选「启用加密协议」服务器名称填你的域名,比如 dns.example.com证书路径填 fullchain.pem 的完整路径私钥路径填 privkey.pem 的完整路径确认端口:DoT默认853,DoH默认443点击「保存」保存后,AdGuard Home就会同时在853端口提供DoT服务、在443端口提供DoH服务。你可以用 openssl s_client -connect dns.example.com:853 测试连通性。客户端怎么接入?安卓私人DNS填什么?配好DoT之后,安卓手机就可以用系统自带的「私人DNS」功能连接你的自建服务器了:打开安卓「设置 → 网络和互联网 → 私人DNS」选择「指定私人DNS提供商」输入你的域名,比如 dns.example.com保存连上之后,你手机的所有DNS查询都会通过TLS加密发到你自己的AdGuard Home,再由它去查询上游。不同品牌手机的设置入口略有差异,本站整理了全系列的私人DNS设置教程合集,小米、华为、OPPO、vivo、三星、iPhone各机型都有对应的图文步骤。自建之后你需要承担的维护责任自建私人DNS不是一劳永逸的,你需要对自己的服务器负责:软件更新:AdGuard Home会持续更新功能和修复漏洞,记得定期更新。脚本安装版可以在Web面板首页看到更新提示。证书续期:Let's Encrypt证书有效期90天,务必配置certbot自动续期(certbot renew --dry-run 测试一下)。证书过期后DoT/DoH会直接断连。安全加固:Web管理面板不要暴露在公网随便让人访问,建议改默认端口、加IP白名单,或者只通过SSH隧道访问。上游DNS稳定性:如果上游DNS挂了,你的私人DNS也会跟着挂。建议配置多个上游做故障转移。常见问题Q:自建私人DNS和直接用公共加密DNS有什么区别?A:最大的区别是「控制权」。自建的话,过滤规则你自己选、查询日志你自己管、用不用零日志由你定。公共加密DNS方便但依赖服务商的信誉。Q:我的VPS只有几十M带宽,跑AdGuard Home够吗?A:DNS查询的数据量非常小,即使是入门款VPS也能轻松带得动几个人日常使用。真正吃带宽的是网页浏览和视频,不是DNS。Q:为什么我开了私人DNS还是能看到广告?A:DNS层面的广告过滤只能拦截「域名级」的广告请求。网页内嵌的JS广告、视频贴片广告是和正文同域名下发的,DNS层拦不住。想深入了解可以看这篇用私人DNS拦截广告的原理与局限。参考来源AdGuard Home 官方GitHub仓库 - 安装说明 — 支撑官方安装脚本命令与Docker镜像信息AdGuard DNS知识库 - DNS加密配置 — 支撑DoT/DoH证书配置与端口说明AdGuard DNS知识库 - Docker部署 — 支撑Docker端口映射与部署参数AdGuard DNS知识库 - 入门指南 — 支撑安装端口要求与初始化流程相关阅读AdGuard Home规则订阅怎么配置?去广告规则源推荐与拦截验证用私人DNS拦截广告:DNS广告过滤原理与开启方法DNS 过滤规则开放订阅:免费去广告规则 + 自建加密 DNS 全指南Alpine 轻量服务器初始化清单:时钟、Nginx、PHP 一篇配齐AdGuard Home 迁移实录:从香港服务器搬到国内阿里云不想自己维护服务器的话,可以直接用我们跑好的那一台:主机名 dns.23-4.cn,DoH https://dns.23-4.cn/dns-query,步骤见私人 DNS 加密设置教程。
2026年10月01日
59 阅读
0 评论
0 点赞
1
2
3