<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dnsmasq on recca0120 技術筆記</title><link>https://recca0120.github.io/tags/dnsmasq/</link><description>Recent content in Dnsmasq on recca0120 技術筆記</description><generator>Hugo -- gohugo.io</generator><language>zh-hant-tw</language><lastBuildDate>Wed, 15 Apr 2026 12:00:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/tags/dnsmasq/index.xml" rel="self" type="application/rss+xml"/><item><title>打開 analytics.google.com 卻看到 Laravel Valet 憑證？根本原因與修復方法</title><link>https://recca0120.github.io/2026/04/15/valet-ca-cert-leak/</link><pubDate>Wed, 15 Apr 2026 12:00:00 +0800</pubDate><guid>https://recca0120.github.io/2026/04/15/valet-ca-cert-leak/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post 打開 analytics.google.com 卻看到 Laravel Valet 憑證？根本原因與修復方法" /&gt;&lt;p&gt;某天開著 Chrome 瀏覽 &lt;code&gt;analytics.google.com&lt;/code&gt;，點開憑證資訊卻看到：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;核發對象：filament-scu.test
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;發行者：Laravel Valet CA Self Signed CN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這不是 Google 的憑證，是你本機 Laravel Valet 的自簽 CA 跑出來了。&lt;/p&gt;
&lt;p&gt;這不是瀏覽器 bug，也不是 Google 出問題——是本機開發環境的設定導致外部流量被 Valet 的 nginx 攔截。&lt;/p&gt;
&lt;h2 id="問題是怎麼發生的"&gt;&lt;a href="#%e5%95%8f%e9%a1%8c%e6%98%af%e6%80%8e%e9%ba%bc%e7%99%bc%e7%94%9f%e7%9a%84" class="header-anchor"&gt;&lt;/a&gt;問題是怎麼發生的
&lt;/h2&gt;&lt;p&gt;Valet 用三個元件組成本機開發環境：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;dnsmasq&lt;/strong&gt;：把 &lt;code&gt;*.test&lt;/code&gt; domain 導向 &lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nginx&lt;/strong&gt;：在 &lt;code&gt;127.0.0.1&lt;/code&gt; 接流量，依 &lt;code&gt;server_name&lt;/code&gt; 找對應的本機站台&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valet CA&lt;/strong&gt;：為每個 &lt;code&gt;.test&lt;/code&gt; 站台簽發 HTTPS 憑證&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;正常情況下，&lt;code&gt;/etc/resolver/test&lt;/code&gt; 只把 &lt;code&gt;*.test&lt;/code&gt; 查詢導給 dnsmasq，外部 domain 走系統 DNS，兩邊互不干擾。&lt;/p&gt;
&lt;p&gt;但有幾種情況會讓這個邊界破掉。&lt;/p&gt;
&lt;h3 id="原因一dnsmasq-設定過於寬鬆"&gt;&lt;a href="#%e5%8e%9f%e5%9b%a0%e4%b8%80dnsmasq-%e8%a8%ad%e5%ae%9a%e9%81%8e%e6%96%bc%e5%af%ac%e9%ac%86" class="header-anchor"&gt;&lt;/a&gt;原因一：dnsmasq 設定過於寬鬆
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;~/.config/valet/dnsmasq.d/tld-test.conf&lt;/code&gt; 的正確內容是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;address=/.test/127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果這一行變成沒有限定 TLD 的格式，或 dnsmasq 全域設定有其他 &lt;code&gt;address&lt;/code&gt; 規則，就可能把不在白名單的 domain 也解析到 &lt;code&gt;127.0.0.1&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="原因二nginx-default-server-吃到外部-domain"&gt;&lt;a href="#%e5%8e%9f%e5%9b%a0%e4%ba%8cnginx-default-server-%e5%90%83%e5%88%b0%e5%a4%96%e9%83%a8-domain" class="header-anchor"&gt;&lt;/a&gt;原因二：nginx default server 吃到外部 domain
&lt;/h3&gt;&lt;p&gt;nginx 收到一個請求，如果 &lt;code&gt;Host&lt;/code&gt; header 找不到對應的 &lt;code&gt;server_name&lt;/code&gt;，就會落到 &lt;strong&gt;default server block&lt;/strong&gt;。Valet 的 default block 不是直接拒絕，而是用 Valet PHP server 兜底——這時就會拿最後載入的 &lt;code&gt;.test&lt;/code&gt; vhost 的憑證來回應。&lt;/p&gt;
&lt;h3 id="原因三瀏覽器快取了錯誤狀態"&gt;&lt;a href="#%e5%8e%9f%e5%9b%a0%e4%b8%89%e7%80%8f%e8%a6%bd%e5%99%a8%e5%bf%ab%e5%8f%96%e4%ba%86%e9%8c%af%e8%aa%a4%e7%8b%80%e6%85%8b" class="header-anchor"&gt;&lt;/a&gt;原因三：瀏覽器快取了錯誤狀態
&lt;/h3&gt;&lt;p&gt;Chrome 有 HSTS（強制 HTTPS）以及 TLS session 快取。如果曾經有一次外部 domain 被 Valet 的憑證回應，Chrome 可能把這個連線狀態快取下來，之後每次都重複出現，即使底層 DNS 問題修好了也一樣。&lt;/p&gt;
&lt;h3 id="為什麼-analyticsgooglecom-特別常中招"&gt;&lt;a href="#%e7%82%ba%e4%bb%80%e9%ba%bc-analyticsgooglecom-%e7%89%b9%e5%88%a5%e5%b8%b8%e4%b8%ad%e6%8b%9b" class="header-anchor"&gt;&lt;/a&gt;為什麼 analytics.google.com 特別常中招
&lt;/h3&gt;&lt;p&gt;Google Analytics 是&lt;strong&gt;第三方 script&lt;/strong&gt;，常被本機專案的 HTML 引入。本機站台跑在 Valet 環境，如果 dnsmasq 在那個瞬間有洩漏，瀏覽器解析 &lt;code&gt;analytics.google.com&lt;/code&gt; 就拿到 &lt;code&gt;127.0.0.1&lt;/code&gt;，連上 nginx，nginx 找不到對應 server block，吐出 Valet 憑證。&lt;/p&gt;
&lt;h2 id="逐步排查"&gt;&lt;a href="#%e9%80%90%e6%ad%a5%e6%8e%92%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;逐步排查
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;第一步：確認 dnsmasq 有沒有攔截外部 domain&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dig analytics.google.com @127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;正常結果：回傳 &lt;code&gt;SERVFAIL&lt;/code&gt; 或真實 Google IP。&lt;br&gt;
異常結果：回傳 &lt;code&gt;127.0.0.1&lt;/code&gt; → dnsmasq 設定有問題，繼續往下查。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步：確認 dnsmasq 規則只限定 &lt;code&gt;.test&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.config/valet/dnsmasq.d/tld-test.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;應該只有：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;address=/.test/127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;listen-address=127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第三步：確認 &lt;code&gt;/etc/resolver/&lt;/code&gt; 目錄沒有多餘的檔案&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /etc/resolver/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;應該只看到 &lt;code&gt;test&lt;/code&gt;（或你設定的 TLD），沒有空白檔名或通配符。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四步：確認 nginx default server 的行為&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx -T 2&amp;gt;/dev/null &lt;span class="p"&gt;|&lt;/span&gt; grep -A &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;default_server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;看 default server 有沒有 &lt;code&gt;return 444&lt;/code&gt; 或 &lt;code&gt;return 400&lt;/code&gt;。如果沒有，就是用第一個 vhost 兜底。&lt;/p&gt;
&lt;h2 id="修復方法"&gt;&lt;a href="#%e4%bf%ae%e5%be%a9%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;修復方法
&lt;/h2&gt;&lt;h3 id="修復一清除瀏覽器-hsts-與-socket-快取"&gt;&lt;a href="#%e4%bf%ae%e5%be%a9%e4%b8%80%e6%b8%85%e9%99%a4%e7%80%8f%e8%a6%bd%e5%99%a8-hsts-%e8%88%87-socket-%e5%bf%ab%e5%8f%96" class="header-anchor"&gt;&lt;/a&gt;修復一：清除瀏覽器 HSTS 與 socket 快取
&lt;/h3&gt;&lt;p&gt;這是最常見的情況，即使底層沒問題，快取就能讓問題持續。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chrome&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;網址列輸入 &lt;code&gt;chrome://net-internals/#hsts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在「Delete domain security policies」欄位輸入 &lt;code&gt;analytics.google.com&lt;/code&gt;，點 Delete&lt;/li&gt;
&lt;li&gt;再到 &lt;code&gt;chrome://net-internals/#sockets&lt;/code&gt; 點 &lt;strong&gt;Flush socket pools&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Safari&lt;/strong&gt;：
偏好設定 → 隱私權 → 管理網站資料 → 搜尋受影響的 domain → 移除&lt;/p&gt;
&lt;h3 id="修復二清除系統-dns-快取"&gt;&lt;a href="#%e4%bf%ae%e5%be%a9%e4%ba%8c%e6%b8%85%e9%99%a4%e7%b3%bb%e7%b5%b1-dns-%e5%bf%ab%e5%8f%96" class="header-anchor"&gt;&lt;/a&gt;修復二：清除系統 DNS 快取
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dscacheutil -flushcache &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo killall -HUP mDNSResponder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="修復三讓-nginx-拒絕未知-host"&gt;&lt;a href="#%e4%bf%ae%e5%be%a9%e4%b8%89%e8%ae%93-nginx-%e6%8b%92%e7%b5%95%e6%9c%aa%e7%9f%a5-host" class="header-anchor"&gt;&lt;/a&gt;修復三：讓 nginx 拒絕未知 Host
&lt;/h3&gt;&lt;p&gt;在 Valet 的 nginx 設定加一個明確的 default server block，讓陌生 domain 連線直接被切斷，不要兜底到 &lt;code&gt;.test&lt;/code&gt; vhost：&lt;/p&gt;
&lt;p&gt;找到 Valet nginx 設定目錄：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /opt/homebrew/etc/nginx/valet/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;新增或編輯一個 &lt;code&gt;_reject-default.conf&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/dev/null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/dev/null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;444&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;444&lt;/code&gt; 是 nginx 特有的狀態碼，代表直接關閉連線不回任何回應。&lt;/p&gt;
&lt;p&gt;套用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;valet restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="修復四重新安裝-valet-ca若信任鏈混亂"&gt;&lt;a href="#%e4%bf%ae%e5%be%a9%e5%9b%9b%e9%87%8d%e6%96%b0%e5%ae%89%e8%a3%9d-valet-ca%e8%8b%a5%e4%bf%a1%e4%bb%bb%e9%8f%88%e6%b7%b7%e4%ba%82" class="header-anchor"&gt;&lt;/a&gt;修復四：重新安裝 Valet CA（若信任鏈混亂）
&lt;/h3&gt;&lt;p&gt;如果 Keychain 裡的 Valet CA 憑證狀態怪異：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;valet trust &lt;span class="c1"&gt;# 重新把 Valet CA 加進系統信任&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或完整重建：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;valet unsecure --all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;valet secure &amp;lt;site-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="驗證修復結果"&gt;&lt;a href="#%e9%a9%97%e8%ad%89%e4%bf%ae%e5%be%a9%e7%b5%90%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;驗證修復結果
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認外部 domain 不再被 dnsmasq 攔截&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dig analytics.google.com @127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 期望：SERVFAIL 或真實 IP，不是 127.0.0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認 nginx 解析正確&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -I --resolve analytics.google.com:443:127.0.0.1 https://analytics.google.com 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 期望：連線被拒或 SSL 握手失敗（不是吐出 Valet 憑證）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;重新打開 Chrome，訪問 &lt;code&gt;analytics.google.com&lt;/code&gt;，點憑證圖示確認發行者是 Google，不是 Laravel Valet CA。&lt;/p&gt;
&lt;h2 id="預防"&gt;&lt;a href="#%e9%a0%90%e9%98%b2" class="header-anchor"&gt;&lt;/a&gt;預防
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不要隨意修改 dnsmasq 全域設定&lt;/strong&gt;，Valet 的 dnsmasq 規則只應針對你設定的 TLD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每次 &lt;code&gt;valet install&lt;/code&gt; 或 Valet 大版本升級後&lt;/strong&gt;，重新確認 dnsmasq 規則沒有被改寬&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;養成習慣&lt;/strong&gt;：本機 &lt;code&gt;.test&lt;/code&gt; 站台的 HTML 盡量不引入外部 analytics script，減少觸發機會&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加 nginx default reject block&lt;/strong&gt; 一勞永逸，讓意外洩漏的流量在 nginx 層就被切斷&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="參考資源"&gt;&lt;a href="#%e5%8f%83%e8%80%83%e8%b3%87%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;參考資源
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://laravel.com/docs/valet" target="_blank" rel="noopener"
 &gt;Laravel Valet 官方文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://thekelleys.org.uk/dnsmasq/doc.html" target="_blank" rel="noopener"
 &gt;dnsmasq man page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="chrome://net-internals/" &gt;Chrome net-internals 工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return" target="_blank" rel="noopener"
 &gt;nginx return 444 — drop connection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>