<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>弦下札记</title><description>大提琴停了以后,继续写</description><link>https://virtuosa.lpddr4x.top/</link><language>zh_CN</language><item><title>给 AdGuardHome 接上自己的 DoH</title><link>https://virtuosa.lpddr4x.top/posts/doh-adguardhome/</link><guid isPermaLink="true">https://virtuosa.lpddr4x.top/posts/doh-adguardhome/</guid><description>用 Cloudflare 的免费额度搭一个只属于自己的加密 DNS,再按域名清单分流。顺便记下一路踩过的坑。</description><pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;家里的 DNS 一直是 AdGuardHome 在管。国内的明文 DNS 查某些域名时,会拿到一个看着正常、其实不对的 IP,网站就打不开。这篇记录我怎么换成自己的加密 DNS,以及中途踩的几个坑。&lt;/p&gt;
&lt;h2&gt;为什么要自己搭&lt;/h2&gt;
&lt;p&gt;换成加密 DNS 是第一步,答案在路上不会被改。但我试过的几个公共 DoH 在我的网络里都不稳:有的连接直接被重置,有的干脆连不上。与其一个个试,不如自己搭一个,域名是自己的,不在任何公共名单里。&lt;/p&gt;
&lt;h2&gt;搭一个 DoH&lt;/h2&gt;
&lt;p&gt;我用的是开源项目 CF-Workers-DoH,跑在 Cloudflare 的 Workers 或 Pages 上。部署后加三个变量:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DOH&lt;/code&gt;:它转发的上游,填 &lt;code&gt;dns.google&lt;/code&gt; 或 &lt;code&gt;cloudflare-dns.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TOKEN&lt;/code&gt;:自己编一串随机字符,当作访问路径&lt;/li&gt;
&lt;li&gt;&lt;code&gt;URL&lt;/code&gt;:填 &lt;code&gt;nginx&lt;/code&gt;,首页会伪装成一个 nginx 默认页&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再给它绑一个自己域名下的子域名。最终的 DoH 地址长这样(下面都是占位符):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://doh.example.com/你的TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证的时候要注意一件事:只看到 &lt;code&gt;200&lt;/code&gt; 不算成功。路径写错了,它会返回伪装的网页,状态码一样是 &lt;code&gt;200&lt;/code&gt;。要看返回的类型:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -s -H &quot;accept: application/dns-message&quot; -o /dev/null \
  -w &quot;%{http_code} %{content_type}\n&quot; \
  &quot;https://doh.example.com/你的TOKEN?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出里出现 &lt;code&gt;application/dns-message&lt;/code&gt;,才说明 DoH 真的通了。&lt;/p&gt;
&lt;h2&gt;按域名分流&lt;/h2&gt;
&lt;p&gt;不是所有域名都需要绕一圈。国内网站走国内 DNS 又快又稳,只有会被污染的域名才交给自己的 DoH。AdGuardHome 支持用 &lt;code&gt;upstream_dns_file&lt;/code&gt; 指向一个文件,每行是一个上游,也可以写成带域名前缀的规则:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;223.5.5.5
2400:3200::1
[/example.org/example.net/]https://doh.example.com/你的TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有前缀的是默认上游,带 &lt;code&gt;[/域名/]&lt;/code&gt; 的只管这几个域名。域名清单我用的是别人维护的 gfwlist 派生列表,写了个脚本每天凌晨下载、转换格式、重启 AdGuardHome。&lt;/p&gt;
&lt;h2&gt;踩过的坑&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;文件里要自带默认上游。&lt;/strong&gt; 我第一版文件里只有一条带域名的规则。启用之后,没命中规则的域名在日志里就去用了别的上游,表现很怪。把默认上游也写进文件之后正常了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;拼接域名时多了斜杠。&lt;/strong&gt; 用脚本把一行一个域名拼成一行时,我写出了 &lt;code&gt;/a.com//b.com/&lt;/code&gt; 这样的双斜杠。AdGuardHome 没报错就启动了,但规则没有按预期生效。要拼成 &lt;code&gt;/a.com/b.com/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;别留明文的 fallback。&lt;/strong&gt; Worker 一旦失败,fallback DNS 会悄悄接手,拿到的可能就是被污染的答案,而你以为一切正常。我把它清空了,这样出问题会直接解析失败,马上能发现。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;测试前先清缓存。&lt;/strong&gt; AdGuardHome 会缓存答案,被污染的结果也会被缓存好几分钟。每次改配置之后重启容器,再测。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我的 IPv6 比 IPv4 好。&lt;/strong&gt; 打开 &lt;code&gt;bootstrap_prefer_ipv6&lt;/code&gt; 之后,原来一直失败的分流域名恢复了。我没有单独验证到底是不是这一项起的作用,但改完确实通了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置文件的路径。&lt;/strong&gt; 容器里的 &lt;code&gt;/opt/adguardhome/conf&lt;/code&gt; 对应宿主机上挂载的目录,改配置要改宿主机那一份。我一开始在错误的路径上忙活了好一阵。&lt;/p&gt;
&lt;h2&gt;怎么确认它真的在工作&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dig @127.0.0.1 twitter.com +short
whois 返回的IP | grep -i -E &quot;netname|orgname&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;拿到 IP 之后,用 &lt;code&gt;whois&lt;/code&gt; 看看它属于谁,别凭印象判断。归属对得上目标网站或它的 CDN,才算真的解析对了。AdGuardHome 网页里的 Query Log,点开一条记录能看到它用了哪个上游,这也是分流有没有命中最直接的证据。&lt;/p&gt;
</content:encoded></item><item><title>Simple Guides for Fuwari</title><link>https://virtuosa.lpddr4x.top/posts/guide/</link><guid isPermaLink="true">https://virtuosa.lpddr4x.top/posts/guide/</guid><description>How to use this blog template.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Cover image source: &lt;a href=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=2048/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This blog template is built with &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;. For the things that are not mentioned in this guide, you may find the answers in the &lt;a href=&quot;https://docs.astro.build/&quot;&gt;Astro Docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Front-matter of Posts&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
title: My First Blog Post
published: 2023-09-09
description: This is the first post of my new Astro blog.
image: ./cover.jpg
tags: [Foo, Bar]
category: Front-end
draft: false
---
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The title of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The date the post was published.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A short description of the post. Displayed on index page.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The cover image path of the post.&amp;lt;br/&amp;gt;1. Start with &lt;code&gt;http://&lt;/code&gt; or &lt;code&gt;https://&lt;/code&gt;: Use web image&amp;lt;br/&amp;gt;2. Start with &lt;code&gt;/&lt;/code&gt;: For image in &lt;code&gt;public&lt;/code&gt; dir&amp;lt;br/&amp;gt;3. With none of the prefixes: Relative to the markdown file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The tags of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The category of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;If this post is still a draft, which won&apos;t be displayed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Where to Place the Post Files&lt;/h2&gt;
&lt;p&gt;Your post files should be placed in &lt;code&gt;src/content/posts/&lt;/code&gt; directory. You can also create sub-directories to better organize your posts and assets.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── post-1.md
└── post-2/
    ├── cover.png
    └── index.md
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item></channel></rss>