<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on 亂筆</title>
        <link>https://blog.l3zc.com/zh-hant-hk/post/</link>
        <description>Recent content in Posts on 亂筆</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-hant-hk</language>
        <lastBuildDate>Tue, 14 Apr 2026 10:07:12 +0000</lastBuildDate><atom:link href="https://blog.l3zc.com/zh-hant-hk/post/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Terraform IaC 初體驗</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2026/04/iac-with-terraform/</link>
            <pubDate>Thu, 09 Apr 2026 07:13:35 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2026/04/iac-with-terraform/</guid>
            <description>&lt;img src=&#34;https://blog.l3zc.com/2026/04/iac-with-terraform/cover_hu_a8e83f97ed61569c.webp&#34; alt=&#34;Featured image of post Terraform IaC 初體驗&#34; /&gt;&lt;p&gt;Terraform 是一款 IaC 工具，所謂 IaC 就是「基礎設施即代碼」，將我們的基礎設施以宣告式的代碼寫出來，隨後使用&lt;code&gt;terraform apply&lt;/code&gt;即可完成基礎設施的部署，同一份配置，部署出來的一定是一模一樣的基礎設施（Nix OS 用戶狂喜）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;為什麼要用-terraform&#34;&gt;為什麼要用 Terraform&#xA;&lt;/h2&gt;&lt;p&gt;傳統的基礎設施管理絕大部分基於人力和各種雲服務商的 Dashboard，這就帶來了下面這些痛點：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;痛點&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;説明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;難以重現&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;透過 Dashboard 點點點進行配置，容易改錯或者改漏，而且難以復現&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;環境漂移&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;手動操作導致生產和測試環境配置逐漸偏離，導致極端情況下測試沒問題生產直接崩&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;難以擴充套件&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;新增一套環境需要重複大量手工操作，耗時且容易出錯&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;難以審計&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;沒有變更記錄，&lt;del&gt;出了事不好甩鍋&lt;/del&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;難以協作&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;基礎設施由少數「懂的人」掌控，誰想要改都得去找這些人，效率低&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;為了解決這些問題，「基礎設施即代碼」&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;的概念被提了出來，Terraform 就是其中一個著名的解決方案。&lt;/p&gt;&#xA;&lt;p&gt;假設一個現實的使用場景，例如你每年都會購買新的 GCP 的 $300 試用金賬號，雖然便宜，但是每年都要重新跑到 GCP 的面板裏開機器。而有了 Terraform，想要部署同樣配置的機器，只要在每次更換賬號之後，將 API Token 替換成新的，隨後&lt;code&gt;terraform apply&lt;/code&gt;，只需要幾分鐘就能開出和你上個賬號一模一樣的機器、VPC、S3、防火牆配置等等。&lt;/p&gt;&#xA;&lt;p&gt;再比如 Cloudflare DNS 和 Tunnel 的管理和遷移，也只需要將原 Tunnel 的 Ingress Rule 複製到新 Tunnel 的 Ingress Rule。即使將來要遷移到 AliDNS、Route 53 等其他服務商，我們也可以原封不動的將資料複製過去&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&#xA;&lt;p&gt;尤其是到了多人協作的時候，配合 Git，每次更改都有跡可循，更不需要擔心合併衝突，PR 可以自動生成更改預覽，出現問題可以立刻回滾到上一個版本，這些都是傳統依賴人力去直接操作服務提供商 Dashboard 的做法完全無法做到的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;terraform-的安裝&#34;&gt;Terraform 的安裝&#xA;&lt;/h2&gt;&lt;p&gt;Terraform 是用 Go 寫的，編譯出來的產物自然也是單個可執行檔案，所以安裝起來也非常容易，Windows 下可以直接使用 Winget 安裝：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-pwsh&#34;&gt;winget install Hashicorp.Terraform&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果不想使用 Winget，也可以使用 Scoop 等其他包管理器，或者將預編譯的二進位制檔案放入&lt;code&gt;$PATH&lt;/code&gt;，即可完成安裝。&lt;/p&gt;&#xA;&lt;p&gt;如果你在 Linux 環境下，則使用對應的包管理器安裝即可，如果使用將二進位制檔案放入&lt;code&gt;$PATH&lt;/code&gt;的安裝方法，則要記得&lt;code&gt;sudo chmod +x terraform&lt;/code&gt;賦予檔案的執行許可權。&lt;/p&gt;&#xA;&lt;h2 id=&#34;terraform-的兩個基本概念&#34;&gt;Terraform 的兩個基本概念&#xA;&lt;/h2&gt;&lt;h3 id=&#34;providers&#34;&gt;Provider(s)&#xA;&lt;/h3&gt;&lt;p&gt;我們前面已經提到，Terraform 是一個款礎設施即代碼工具，作為一個工具本身，他並不繫結某個平台，而是透過 Provider(s) 與各個平台對接，要檢視有哪些 Provider(s)，可以瀏覽 &lt;a class=&#34;link&#34; href=&#34;https://registry.terraform.io/browse/providers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Terraform 的 Registry&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2026/04/iac-with-terraform/image_hu_463ebc576c22c691.webp&#34; alt=&#34;Terraform 擁有豐富的 Provider(s) 生態&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;狀態管理&#34;&gt;狀態管理&#xA;&lt;/h3&gt;&lt;p&gt;Terraform 將每次執行基礎設施變更操作時的狀態資訊儲存在一個狀態檔案中，預設情況下會儲存在當前工作目錄下的&lt;code&gt;terraform.tfstate&lt;/code&gt;檔案裏&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;，我們也可以修改配置檔案自行指定其他的儲存後端，例如 S3、Postgres。每次我們執行&lt;code&gt;terraform apply&lt;/code&gt;時，Terraform 都會將目前配置檔案宣告的狀態同現有的狀態檔案進行比對，從而計算變動的部分，自動確定調整順序之後操作 Provider 落實狀態變動。&lt;/p&gt;&#xA;&lt;h2 id=&#34;terraform-的資源匯入難題&#34;&gt;Terraform 的資源匯入難題&#xA;&lt;/h2&gt;&lt;p&gt;現有資源的匯入一直是 Terraform 為人詬病的難題，Hashi Corp. 似乎一直在堅持着一個固執且愚蠢的觀點：你所有的基礎設施從一開始就應當是用我們的 Terraform 建立的，所以也不存在什麼資源匯入的問題。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;時間&lt;/th&gt;&#xA;          &lt;th&gt;版本&lt;/th&gt;&#xA;          &lt;th&gt;進展&lt;/th&gt;&#xA;          &lt;th&gt;問題&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;2014–2022&lt;/td&gt;&#xA;          &lt;td&gt;v0.x–v1.4&lt;/td&gt;&#xA;          &lt;td&gt;只有 &lt;code&gt;terraform import&lt;/code&gt;，一次一條，而且完全不生成配置&lt;/td&gt;&#xA;          &lt;td&gt;匯入完還得自己手寫 HCL&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;2023.06&lt;/td&gt;&#xA;          &lt;td&gt;v1.5&lt;/td&gt;&#xA;          &lt;td&gt;引入 &lt;code&gt;import&lt;/code&gt; 塊和 &lt;code&gt;-generate-config-out&lt;/code&gt;引數，可以生成配置了&lt;/td&gt;&#xA;          &lt;td&gt;然而還是得一條一條寫，而且還得自己提供現有資源的 ID&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;2024.01&lt;/td&gt;&#xA;          &lt;td&gt;v1.7&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;import&lt;/code&gt; 塊支援 &lt;code&gt;for_each&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;批次了，但 ID 還得自己搞&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;2024 下半年&lt;/td&gt;&#xA;          &lt;td&gt;v1.12&lt;/td&gt;&#xA;          &lt;td&gt;引入了 &lt;code&gt;terraform query&lt;/code&gt; 和 &lt;code&gt;list&lt;/code&gt; 塊，終於實現了自動發現資源的功能&lt;/td&gt;&#xA;          &lt;td&gt;然而這個功能要 Provider 要自己實現，大量 Provider 根本沒跟上&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;這麼多年的時間，社羣一直在罵，然而，「我有一堆現有資源，怎麼匯入 Terraform」這個問題一直沒有被認真對待。Terraform 作為「基礎設施即代碼」工具，設計哲學就是宣告式和冪等性&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;，Hashi Corp. 他們篤信「一切以代碼宣告的狀態為準，就應該用 Terraform 從零開始建立資源」。但現實是絕大多數公司都有大量歷史存量資源，先有資源、後有代碼才是常態。這個矛盾 Hashi Corp. 承認得很晚，&lt;code&gt;v1.12&lt;/code&gt; 的 &lt;code&gt;terraform query&lt;/code&gt; 才算是官方第一次認真面對這個問題——但 Provider 生態的跟進嘛……真的是一言難盡。&lt;/p&gt;&#xA;&lt;h2 id=&#34;terraform-的檔案結構&#34;&gt;Terraform 的檔案結構&#xA;&lt;/h2&gt;&lt;p&gt;Terraform 的檔案結構很簡單，其主程式執行時會無腦讀取工作目錄下所有的&lt;code&gt;.tf&lt;/code&gt;檔案，只要資訊齊全，想給檔案取什麼名字都可以，比如我的檔案結構就長這樣：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;❯ tree -a -I .git&#xA;.&#xA;├── .editorconfig&#xA;├── .github&#xA;│   ├── dependabot.yml&#xA;│   └── workflows&#xA;│       ├── terraform-apply.yml&#xA;│       ├── terraform-plan.yml&#xA;│       └── your-fork.yml&#xA;├── .gitignore&#xA;├── .terraform.lock.hcl&#xA;├── cf_dns_zones.tf&#xA;├── cf_tunnel.tf&#xA;├── dns_example_com.tf&#xA;├── dns_example_net.tf&#xA;├── dns_example_top.tf&#xA;├── dns_example_cn.tf&#xA;├── main.tf                 # 基礎配置（terraform 塊）&#xA;├── moved.tf                # 移動過的資源&#xA;├── provider.tf             # 每個 Provider 的配置&#xA;├── README.md&#xA;├── rename_resources.ps1&#xA;└── variables.tf            # 自定義的變數&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;main.tf&lt;/code&gt;用於存放基礎配置:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-hcl&#34;&gt;terraform {&#xA;  required_providers {&#xA;    cloudflare = {&#xA;      source  = &#34;cloudflare/cloudflare&#34;&#xA;      version = &#34;~&gt; 5&#34;&#xA;    }&#xA;&#xA;    tencentcloud = {&#xA;      source  = &#34;tencentcloudstack/tencentcloud&#34;&#xA;      version = &#34;&gt;= 1.81.43&#34;&#xA;    }&#xA;  }&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;provider.tf&lt;/code&gt;用於存放每個 Provider 的配置：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-hcl&#34;&gt;provider &#34;cloudflare&#34; {}&#xA;provider &#34;tencentcloud&#34; {}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這裏留空是因為我們可以透過環境變數來傳遞 Credentials，而不是直接將 Credentials 寫在配置檔案中，例如 Cloudflare 的 Provider 就接受&lt;code&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt;作為&lt;code&gt;api_token&lt;/code&gt;這個變數的替代。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;variables.tf&lt;/code&gt;用於宣告自定義的變數：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-hcl&#34;&gt;variable &#34;cloudflare_zone_example_com&#34; {&#xA;  description = &#34;Cloudflare zone ID for example.com&#34;&#xA;  type        = string&#xA;}&#xA;&#xA;variable &#34;cloudflare_zone_example_top&#34; {&#xA;  description = &#34;Cloudflare zone ID for example.top&#34;&#xA;  type        = string&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這些變數可以透過字首為&lt;code&gt;TF_VAR_&lt;/code&gt;的環境變數傳入，Terraform 也會自動讀取&lt;code&gt;terraform.tfvars&lt;/code&gt;檔案中的變數，變數的主要用途是在別的配置檔案中呼叫，例如：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-hcl&#34;&gt;resource &#34;cloudflare_dns_record&#34; &#34;example_cname&#34; {&#xA;  content = &#34;${cloudflare_zero_trust_tunnel_cloudflared.Production_Tunnel.id}.cfargotunnel.com&#34;&#xA;  name    = &#34;example.example.com&#34;&#xA;  proxied = true&#xA;  tags    = []&#xA;  ttl     = 1&#xA;  type    = &#34;CNAME&#34;&#xA;  zone_id = var.cloudflare_zone_id_example_com  #這裏呼叫了cloudflare_zone_example_com這個變數&#xA;  settings = {&#xA;    flatten_cname = false&#xA;  }&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;有了這些基礎配置，我們就可以執行&lt;code&gt;terraform init&lt;/code&gt;初始化 Terraform 環境並鎖定依賴版本，剩下的就都是我們資源的宣告瞭。&lt;/p&gt;&#xA;&lt;h2 id=&#34;將現有資源匯入-terraform&#34;&gt;將現有資源匯入 Terraform&#xA;&lt;/h2&gt;&lt;p&gt;前文提到過 Terraform 的狀態管理這個概念，狀態管理雖好，但在我們初始化時也帶來了一個問題——在預設狀態下，Terraform 的狀態檔案顯然是空的。&lt;/p&gt;&#xA;&lt;p&gt;此時我們需要做的是將雲服務提供商上現有資源的狀態匯入 Terraform，這樣 Terraform 才能無縫接手並管理我們的基礎設施。相信大家也都看到了前文對 Terraform 資源匯入問題的吐槽。以匯入 Cloudflare 上託管的 DNS 記錄為例，前文提到過，如果 Provider 支援，可以使用 Terraform 在 1.12 版本之後引入的&lt;code&gt;terraform query&lt;/code&gt;，然而大多數情況下，Providers 都是沒有跟進這個新功能的，Cloudflare 就屬於不支援的那一類。&lt;/p&gt;&#xA;&lt;p&gt;好在雖然 Hashi Corp. 不認真解決問題，各路高強度使用 Terraform 管理基礎設施的公司就各顯神通。Cloudflare 就維護了名為 &lt;a class=&#34;link&#34; href=&#34;https://github.com/cloudflare/cf-terraforming&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;cf-terraforming&lt;/a&gt; 的匯入工具，免去了很多手動匯入的麻煩。首先安裝&lt;code&gt;cf-terraforming&lt;/code&gt;，這個工具是用 Go 語言編寫的，需要在有 Go 語言環境的情況下安裝，或者將官方編譯好的二進位制檔案其放入&lt;code&gt;$PATH&lt;/code&gt;並賦予其執行許可權。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;go install github.com/cloudflare/cf-terraforming/cmd/cf-terraforming@latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這個工具的用法還是比較簡單的，首先你需要以下環境變數：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;# 如果你使用 API Token&#xA;export CLOUDFLARE_API_TOKEN=&#39;Hzsq3Vub-7Y-hSTlAaLH3Jq_YfTUOCcgf22_Fs-j&#39;&#xA;&#xA;# 如果你使用 API Key&#xA;export CLOUDFLARE_EMAIL=&#39;user@example.com&#39;&#xA;export CLOUDFLARE_API_KEY=&#39;1150bed3f45247b99f7db9696fffa17cbx9&#39;&#xA;&#xA;# 指定需要匯入的域名的區域 ID，如果匯入的是賬户資源（例如 Cloudflare Tunnel）則不需要&#xA;export CLOUDFLARE_ZONE_ID=&#39;81b06ss3228f488fh84e5e993c2dc17&#39;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class=&#34;alert alert-tip&#34;&gt;&#xA;        &lt;div class=&#34;alert-header&#34;&gt;&#xA;            &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;&#xA;            &lt;span class=&#34;alert-title&#34;&gt;提示&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div class=&#34;alert-body&#34;&gt;&#xA;            &lt;p&gt;此處的命令假設你正在使用 Bash，如果使用的是與 Bash 語法不相容的 Shell，則需要做出調整，例如對於 Windows 上的 PowerShell，匯入環境變數的語法如下：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-pwsh&#34;&gt;$env:CLOUDFLARE_API_TOKEN=&#39;Hzsq3Vub-7Y-hSTlAaLH3Jq_YfTUOCcgf22_Fs-j&#39;&lt;/code&gt;&lt;/pre&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;通常我們只需要設定&lt;code&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt;和&lt;code&gt;CLOUDFLARE_ZONE_ID&lt;/code&gt;就可以了，在控制枱建立 API Token 時，記得賦予這個 Token 必要的許可權，本次我們只是匯入 DNS 記錄，所以只賦予編輯區域 DNS 的許可權即可。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2026/04/iac-with-terraform/image-1_hu_15298d4bd366a377.webp&#34; alt=&#34;賦予操作資源所需要的許可權&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;好了，準備工作全部完成，現在可以開始生成配置檔案：&lt;/p&gt;&#xA;&lt;p&gt;首先匯入賬户中域名的配置，也就是&lt;code&gt;cloudflare_zone&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;cf-terraforming generate \&#xA;  --key $CLOUDFLARE_API_KEY \&#xA;  --resource-type &#34;cloudflare_zone&#34; &gt; zone.tf&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這一步會在當前目錄下生成一個名為&lt;code&gt;zone.tf&lt;/code&gt;的檔案，裏面會有如下格式的內容：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-hcl&#34;&gt;resource &#34;cloudflare_zone&#34; &#34;REDACTED&#34; {&#xA;  name                = &#34;REDACTED&#34;&#xA;  paused              = false&#xA;  type                = &#34;full&#34;&#xA;  vanity_name_servers = []&#xA;  account = {&#xA;    id   = &#34;REDACTED&#34;&#xA;    name = &#34;REDACTED&#34;&#xA;  }&#xA;}&#xA;&#xA;resource &#34;cloudflare_zone&#34; &#34;REDACTED&#34; {&#xA;  name                = &#34;REDACTED&#34;&#xA;  paused              = false&#xA;  type                = &#34;full&#34;&#xA;  vanity_name_servers = []&#xA;  account = {&#xA;    id   = &#34;REDACTED&#34;&#xA;    name = &#34;REDACTED&#34;&#xA;  }&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;現在域名資源已經匯入了，但是裏面的配置並沒有。接下來，匯入域名下的 DNS 記錄：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;cf-terraforming generate \&#xA;  --zone $CLOUDFLARE_ZONE_ID \&#xA;  --key $CLOUDFLARE_API_KEY \&#xA;  --resource-type &#34;cloudflare_dns_record&#34; &gt;&gt; dns.tf&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這一步會在當前目錄下生成一個名為&lt;code&gt;dns.tf&lt;/code&gt;的配置檔案，裏面會有如下格式的內容：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-hcl&#34;&gt;resource &#34;cloudflare_dns_record&#34; &#34;terraform_managed_resource_5deb14xxxxxb629bf123xxxxxxxc8f_0&#34; {&#xA;  content  = &#34;67.24.33.108&#34;&#xA;  name     = &#34;example.example.com&#34;&#xA;  proxied  = true&#xA;  tags     = []&#xA;  ttl      = 1&#xA;  type     = &#34;A&#34;&#xA;  zone_id  = &#34;81c7f2de8dfxxxxxx52629xxxxxxfc&#34;&#xA;  settings = {}&#xA;}&#xA;&#xA;resource &#34;cloudflare_dns_record&#34; &#34;terraform_managed_resource_89xxxxx0bf9cxxxxxx9a_1&#34; {&#xA;  content  = &#34;35.27.108.33&#34;&#xA;  name     = &#34;terraform.example.com&#34;&#xA;  proxied  = true&#xA;  tags     = []&#xA;  ttl      = 1&#xA;  type     = &#34;A&#34;&#xA;  zone_id  = &#34;8xxxxxx7644e428526xxxxxx&#34;&#xA;  settings = {}&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果有多個域名需要匯入，則多次分別設定環境變數&lt;code&gt;CLOUDFLARE_ZONE_ID&lt;/code&gt;再重複執行命令即可。&lt;/p&gt;&#xA;&lt;p&gt;這裏生成的配置檔案可以直接使用，也就是我們之後需要的 Terraform 配置檔案。然而，此時我們僅僅只是生成了配置檔案，但是目前 Terraform 的狀態依然是空的，這時要是直接&lt;code&gt;terraform apply&lt;/code&gt;，Terraform 會不管三七二十一將我們剛剛匯入的宣告一律視為新增資源，然後甩出一大堆「Alredy Exists」報錯。所以接下來，我們需要將生成的配置檔案匯入 Terraform 的&lt;code&gt;terraform.tfstate&lt;/code&gt;狀態。&lt;/p&gt;&#xA;&lt;p&gt;Terraform 在 1.5 版本引入了&lt;code&gt;import&lt;/code&gt;塊，相比以往一行一行輸入命令的方式更加現代。其匯入流程是先生成一個包含&lt;code&gt;import&lt;/code&gt;塊的&lt;code&gt;.tf&lt;/code&gt;檔案，下次進行&lt;code&gt;terraform apply&lt;/code&gt;時，Terraform 就會自動為我們執行匯入操作。&lt;/p&gt;&#xA;&lt;p&gt;生成&lt;code&gt;cloudflare_zone&lt;/code&gt;的&lt;code&gt;import&lt;/code&gt;塊：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;cf-terraforming import \&#xA;  --resource-type &#34;cloudflare_zone&#34; \&#xA;  --modern-import-block \&#xA;  --key $CLOUDFLARE_API_KEY \&#xA;  --zone $CLOUDFLARE_ZONE_ID &gt;&gt; import.tf&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;生成&lt;code&gt;cloudflare_dns_record&lt;/code&gt;的&lt;code&gt;import&lt;/code&gt;塊：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;cf-terraforming import \&#xA;  --resource-type &#34;cloudflare_dns_record&#34; \&#xA;  --modern-import-block \&#xA;  --key $CLOUDFLARE_API_KEY \&#xA;  --zone $CLOUDFLARE_ZONE_ID &gt;&gt; import.tf&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這一步會在當前目錄下生成&lt;code&gt;import.tf&lt;/code&gt;，它包含了所需要的匯入資訊，作用就是告訴 Terraform 上一步生成的每個&lt;code&gt;resource&lt;/code&gt;塊到底對應的是哪一個雲服務提供商的資源 ID。這個 ID 是雲服務提供商內部標記資源的代碼，平常是不會在控制面板上顯示的，只有在用 API 特別請求時才會知道。Terraform 在匯入過程中需要用到這個 ID 以確認本地的定義對應的雲端資源，以實現嚴格的冪等性。&lt;/p&gt;&#xA;&lt;p&gt;好了，現在我們執行&lt;code&gt;terraform plan&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;$ terraform plan&#xA;cloudflare_dns_record.minio_a: Refreshing state... [id=xxxxxxxxxxx53]&#xA;cloudflare_zero_trust_tunnel_cloudflared_config.raspberrypi: Refreshing state...&#xA;......&#xA;&#xA;Terraform will perform the following actions:&#xA;&#xA;  # cloudflare_dns_record.terraform_managed_resource_0 will be imported&#xA;    resource &#34;cloudflare_dns_record&#34; &#34;terraform_managed_resource_REDACTED_0&#34; {&#xA;        content     = &#34;67.24.33.108&#34;&#xA;        created_on  = &#34;2026-04-08T10:18:12Z&#34;&#xA;        id          = &#34;5deb14c21xxxxxxx20f1c8f&#34;&#xA;        meta        = jsonencode({})&#xA;        modified_on = &#34;2026-04-08T10:18:12Z&#34;&#xA;        name        = &#34;example.example.com&#34;&#xA;        proxiable   = true&#xA;        proxied     = true&#xA;        settings    = {}&#xA;        tags        = []&#xA;        ttl         = 1&#xA;        type        = &#34;A&#34;&#xA;        zone_id     = &#34;REDACTED&#34;&#xA;    }&#xA;&#xA;  # cloudflare_dns_record.terraform_managed_resource_1 will be imported&#xA;    resource &#34;cloudflare_dns_record&#34; &#34;terraform_managed_resource_89c149exxxxxxxxxxxba13xxxxxa_1&#34; {&#xA;        content     = &#34;35.27.108.33&#34;&#xA;        created_on  = &#34;2026-04-08T10:17:54Z&#34;&#xA;        id          = &#34;89cxxxxxxxxxxxxxxxxxx09a&#34;&#xA;        meta        = jsonencode({})&#xA;        modified_on = &#34;2026-04-08T10:17:54Z&#34;&#xA;        name        = &#34;terraform.example.com&#34;&#xA;        proxiable   = true&#xA;        proxied     = true&#xA;        settings    = {}&#xA;        tags        = []&#xA;        ttl         = 1&#xA;        type        = &#34;A&#34;&#xA;        zone_id     = &#34;81xxxxxxxxxxxxxxxxxxxxxfc&#34;&#xA;    }&#xA;&#xA;Plan: 2 to import, 0 to add, 0 to change, 0 to destroy.&#xA;&#xA;────────────────────────────────────────────────────────────────────────────────────────────────────────&#xA;&#xA;Note: You didn&#39;t use the -out option to save this plan, so Terraform can&#39;t guarantee to take exactly&#xA;these actions if you run &#34;terraform apply&#34; now.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果需要 Add、Change 和 Destroy 的資源數量都是 0，説明我們的匯入操作沒有問題，直接&lt;code&gt;terraform apply --auto-approve&lt;/code&gt;，資源就匯入完成了。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;$ terraform apply --auto-approve&#xA;cloudflare_dns_record.push_a: Refreshing state... [id=REDACTED]&#xA;&#xA;Terraform will perform the following actions:&#xA;&#xA;  # cloudflare_dns_record.terraform_managed_resource_REDACTED_0 will be imported&#xA;    resource &#34;cloudflare_dns_record&#34; &#34;terraform_managed_resource_REDACTED_0&#34; {&#xA;        content     = &#34;67.24.33.108&#34;&#xA;        created_on  = &#34;2026-04-08T10:18:12Z&#34;&#xA;        id          = &#34;REDACTED&#34;&#xA;        meta        = jsonencode({})&#xA;        modified_on = &#34;2026-04-08T10:18:12Z&#34;&#xA;        name        = &#34;example.example.com&#34;&#xA;        proxiable   = true&#xA;        proxied     = true&#xA;        settings    = {}&#xA;        tags        = []&#xA;        ttl         = 1&#xA;        type        = &#34;A&#34;&#xA;        zone_id     = &#34;REDACTED&#34;&#xA;    }&#xA;&#xA;  # cloudflare_dns_record.terraform_managed_resource_REDACTED_1 will be imported&#xA;    resource &#34;cloudflare_dns_record&#34; &#34;terraform_managed_resource_REDACTED_1&#34; {&#xA;        content     = &#34;35.27.108.33&#34;&#xA;        created_on  = &#34;2026-04-08T10:17:54Z&#34;&#xA;        id          = &#34;REDACTED&#34;&#xA;        meta        = jsonencode({})&#xA;        modified_on = &#34;2026-04-08T10:17:54Z&#34;&#xA;        name        = &#34;terraform.example.com&#34;&#xA;        proxiable   = true&#xA;        proxied     = true&#xA;        settings    = {}&#xA;        tags        = []&#xA;        ttl         = 1&#xA;        type        = &#34;A&#34;&#xA;        zone_id     = &#34;REDACTED&#34;&#xA;    }&#xA;&#xA;Plan: 2 to import, 0 to add, 0 to change, 0 to destroy.&#xA;cloudflare_dns_record.terraform_managed_resource_REDACTED_1: Importing... [id=REDACTED/REDACTED]&#xA;cloudflare_dns_record.terraform_managed_resource_REDACTED_1: Import complete [id=REDACTED/REDACTED]&#xA;cloudflare_dns_record.terraform_managed_resource_REDACTED_0: Importing... [id=REDACTED/REDACTED]&#xA;cloudflare_dns_record.terraform_managed_resource_REDACTED_0: Import complete [id=REDACTED/REDACTED]&#xA;&#xA;Apply complete! Resources: 2 imported, 0 added, 0 changed, 0 destroyed.&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;狀態儲存和持續整合&#34;&gt;狀態儲存和持續整合&#xA;&lt;/h2&gt;&lt;p&gt;IaC 的核心價值之一就在於可以輕易實現基於 Git 的多人協作，以及 CI 的持續整合，但是在此之前，又有一個新的問題需要解決——&lt;code&gt;terraform.tfstate&lt;/code&gt;到底放哪裏：沒人想要換一次環境辛辛苦苦匯入的狀態就丟一次。&lt;/p&gt;&#xA;&lt;p&gt;Terraform 目前支援以下幾種儲存狀態的後端：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;local&lt;/li&gt;&#xA;&lt;li&gt;remote&lt;/li&gt;&#xA;&lt;li&gt;azurerm&lt;/li&gt;&#xA;&lt;li&gt;consul&lt;/li&gt;&#xA;&lt;li&gt;cos&lt;/li&gt;&#xA;&lt;li&gt;gcs&lt;/li&gt;&#xA;&lt;li&gt;http&lt;/li&gt;&#xA;&lt;li&gt;Kubernetes&lt;/li&gt;&#xA;&lt;li&gt;oci&lt;/li&gt;&#xA;&lt;li&gt;oss&lt;/li&gt;&#xA;&lt;li&gt;pg&lt;/li&gt;&#xA;&lt;li&gt;s3&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;沒有特殊需求可以像我一樣選擇&lt;code&gt;s3&lt;/code&gt;，畢竟 Cloudflare R2 有免費額度，不用白不用。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-hcl&#34;&gt;terraform {&#xA;  backend &#34;s3&#34; {&#xA;    bucket = &#34;terraform&#34;&#xA;    key    = &#34;terraform.tfstate&#34;&#xA;    region = &#34;auto&#34;&#xA;    endpoints = {&#xA;      s3 = &#34;https://REDACTED.r2.cloudflarestorage.com&#34;&#xA;    }&#xA;&#xA;    # R2 不需要這些 AWS 的驗證&#xA;    skip_credentials_validation = true&#xA;    skip_metadata_api_check     = true&#xA;    skip_region_validation      = true&#xA;    skip_requesting_account_id  = true&#xA;    use_path_style              = true&#xA;  }&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;對於 S3 的後端，建議用&lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt;和&lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt;兩個環境變數來儲存 Credentials：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;export AWS_ACCESS_KEY_ID=&#39;REDACTED&#39;&#xA;export AWS_SECRET_ACCESS_KEY=&#39;REDACTED&#39;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置完成，執行&lt;code&gt;terraform init -migrate-state&lt;/code&gt;，配置就成功儲存到雲上了，以後不論在何處修改配置、執行&lt;code&gt;terraform apply&lt;/code&gt;都無須擔心 Terraform 的 State 不同步的問題。&lt;/p&gt;&#xA;&lt;p&gt;接下來就是 Github CI 的配置，其實很簡單，無非就是每次&lt;code&gt;git push&lt;/code&gt;時觸發一次&lt;code&gt;terraform init&lt;/code&gt;、&lt;code&gt;terraform fmt&lt;/code&gt;和&lt;code&gt;terraform apply&lt;/code&gt;，以下是我的&lt;code&gt;.github/workflows/apply.yml&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;name: &#34;Terraform Apply&#34;&#xA;&#xA;on:&#xA;  push:&#xA;    branches:&#xA;      - main&#xA;&#xA;env:&#xA;  TF_IN_AUTOMATION: &#34;true&#34;&#xA;  CLOUDFLARE_API_TOKEN: &#34;${{ secrets.CLOUDFLARE_API_TOKEN }}&#34;&#xA;  AWS_ACCESS_KEY_ID: &#34;${{ secrets.AWS_ACCESS_KEY_ID }}&#34;&#xA;  AWS_SECRET_ACCESS_KEY: &#34;${{ secrets.AWS_SECRET_ACCESS_KEY }}&#34;&#xA;  TF_VAR_cloudflare_zone_id_example_com: &#34;${{ vars.TF_VAR_CLOUDFLARE_ZONE_ID_EXAMPLE_COM }}&#34;&#xA;  TF_VAR_cloudflare_zone_id_example_top: ${{ vars.TF_VAR_CLOUDFLARE_ZONE_ID_EXAMPLE_TOP }}&#xA;&#xA;jobs:&#xA;  terraform:&#xA;    name: &#34;Terraform Apply&#34;&#xA;    runs-on: ubuntu-latest&#xA;    permissions:&#xA;      contents: read&#xA;    concurrency:&#xA;      group: terraform-apply&#xA;      cancel-in-progress: false&#xA;    steps:&#xA;      - name: Checkout&#xA;        uses: actions/checkout@v6&#xA;&#xA;      - name: Setup Terraform&#xA;        uses: hashicorp/setup-terraform@v4&#xA;&#xA;      - name: Terraform Init&#xA;        run: terraform init -input=false&#xA;&#xA;      - name: Terraform Apply&#xA;        run: terraform apply -input=false -auto-approve&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;對於 PR 則應當讓 CI 自動為每次 PR 附上&lt;code&gt;terraform plan&lt;/code&gt;的輸出：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;name: Terraform Plan&#xA;&#xA;on:&#xA;  pull_request:&#xA;    paths:&#xA;      - &#34;**/*.tf&#34;&#xA;      - &#34;.github/workflows/terraform-plan.yml&#34;&#xA;&#xA;permissions:&#xA;  contents: read&#xA;  pull-requests: write&#xA;&#xA;env:&#xA;  TF_IN_AUTOMATION: &#34;true&#34;&#xA;  CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}&#xA;  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}&#xA;  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}&#xA;  TF_VAR_cloudflare_zone_id_example_com: &#34;${{ vars.TF_VAR_CLOUDFLARE_ZONE_ID_EXAMPLE_COM }}&#34;&#xA;  TF_VAR_cloudflare_zone_id_example_top: ${{ vars.TF_VAR_CLOUDFLARE_ZONE_ID_EXAMPLE_TOP }}&#xA;&#xA;jobs:&#xA;  plan:&#xA;    name: Terraform Plan&#xA;    runs-on: ubuntu-latest&#xA;    steps:&#xA;      - uses: actions/checkout@v6&#xA;&#xA;      - uses: hashicorp/setup-terraform@v4&#xA;&#xA;      - name: Terraform fmt&#xA;        id: fmt&#xA;        run: terraform fmt -check -recursive&#xA;        continue-on-error: true&#xA;&#xA;      - name: Terraform Init&#xA;        id: init&#xA;        run: terraform init -input=false&#xA;&#xA;      - name: Terraform Validate&#xA;        id: validate&#xA;        run: terraform validate -no-color&#xA;&#xA;      - name: Terraform Plan&#xA;        id: plan&#xA;        run: terraform plan -input=false -no-color&#xA;        continue-on-error: true&#xA;&#xA;      - name: Post Plan to PR&#xA;        uses: actions/github-script@v8&#xA;        with:&#xA;          github-token: ${{ secrets.GITHUB_TOKEN }}&#xA;          script: |&#xA;            const { data: comments } = await github.rest.issues.listComments({&#xA;              owner: context.repo.owner,&#xA;              repo: context.repo.repo,&#xA;              issue_number: context.issue.number,&#xA;            });&#xA;            const botComment = comments.find(c =&gt;&#xA;              c.user.type === &#39;Bot&#39; &amp;&amp; c.body.includes(&#39;&lt;!-- terraform-plan --&gt;&#39;)&#xA;            );&#xA;&#xA;            const planOutput = `${{ steps.plan.outputs.stdout }}`.substring(0, 65000);&#xA;&#xA;            const body = `&lt;!-- terraform-plan --&gt;&#xA;            #### Terraform Plan&#xA;&#xA;            | Step     | Result                            |&#xA;            | -------- | --------------------------------- |&#xA;            | fmt      | \`${{ steps.fmt.outcome }}\`      |&#xA;            | init     | \`${{ steps.init.outcome }}\`     |&#xA;            | validate | \`${{ steps.validate.outcome }}\` |&#xA;            | plan     | \`${{ steps.plan.outcome }}\`     |&#xA;&#xA;            &lt;details&gt;&lt;summary&gt;展開 Plan 詳情&lt;/summary&gt;&#xA;&#xA;            \`\`\`terraform&#xA;            ${planOutput}&#xA;            \`\`\`&#xA;            &lt;/details&gt;`;&#xA;&#xA;            if (botComment) {&#xA;              await github.rest.issues.updateComment({&#xA;                owner: context.repo.owner,&#xA;                repo: context.repo.repo,&#xA;                comment_id: botComment.id,&#xA;                body&#xA;              });&#xA;            } else {&#xA;              await github.rest.issues.createComment({&#xA;                issue_number: context.issue.number,&#xA;                owner: context.repo.owner,&#xA;                repo: context.repo.repo,&#xA;                body&#xA;              });&#xA;            }&#xA;&#xA;      - name: Fail if plan failed&#xA;        if: steps.plan.outcome == &#39;failure&#39;&#xA;        run: exit 1&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2026/04/iac-with-terraform/image-2_hu_c922b7d4de19a009.webp&#34; alt=&#34;每次 PR 都會有 Plan 的輸出&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;後續的工作流程&#34;&gt;後續的工作流程&#xA;&lt;/h2&gt;&lt;p&gt;到這一步，Terraform 的「接管初始化」已經結束了，後面就進入了日常維護階段。這個階段其實就三件事：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;建立新資源&lt;/li&gt;&#xA;&lt;li&gt;修改現有的資源&lt;/li&gt;&#xA;&lt;li&gt;刪除不再需要的資源&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;常用的操作就兩個：&lt;code&gt;terraform plan&lt;/code&gt;和&lt;code&gt;terraform apply&lt;/code&gt;，如果是個人使用，小的改動直接提交就算了；如果是團隊協作，每次修改則應當遵循能 PR 就不直接 Commit 的原則。&lt;/p&gt;&#xA;&lt;h3 id=&#34;建立基礎設施&#34;&gt;建立基礎設施&#xA;&lt;/h3&gt;&lt;p&gt;假設你現在要新增一條 DNS 記錄，或者新建一個 Tunnel、一個物件儲存桶，流程如下：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-mermaid&#34;&gt;flowchart TD&#xA;  C1[新建分支&#xA;如 feat/add-minio-record] --&gt; C2[新增 resource 塊]&#xA;  C2 --&gt; C3[terraform fmt + validate]&#xA;  C3 --&gt; C4[terraform plan]&#xA;  C4 --&gt; C5{僅新增預期資源?}&#xA;  C5 -- 否 --&gt; C6[修正配置後重跑 plan]&#xA;  C6 --&gt; C4&#xA;  C5 -- 是 --&gt; C7[提交 PR]&#xA;  C7 --&gt; C8[合併後 CI apply]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最理想的&lt;code&gt;plan&lt;/code&gt;輸出是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;X to add&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;0 to change&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;0 to destroy&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果你只是想加東西，結果出現了&lt;code&gt;to destroy&lt;/code&gt;，那就先別衝動，通常是引用寫錯、變數搞錯，或者不小心改了資源地址，仔細檢查是什麼地方出了問題。&lt;/p&gt;&#xA;&lt;h3 id=&#34;修改與刪除基礎設施&#34;&gt;修改與刪除基礎設施&#xA;&lt;/h3&gt;&lt;p&gt;修改流程和建立類似，但要多一步——評估變更是否會觸發重建。&lt;/p&gt;&#xA;&lt;p&gt;因為很多 Provider 欄位是&lt;code&gt;ForceNew&lt;/code&gt;，你以為只是改個欄位，Terraform 看完説：「好的，刪了重建。」這在我們修改 DNS 的這個場景並不是什麼很大的問題，但是到了雲例項這種資源，如果刪除重建勢必會造成損失。&lt;/p&gt;&#xA;&lt;p&gt;建議按下面這個順序來：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-mermaid&#34;&gt;flowchart TD&#xA;  M1[修改 .tf] --&gt; M2[terraform plan]&#xA;  M2 --&gt; M3{出現 replace/destroy?}&#xA;  M3 -- 否 --&gt; M7[確認影響範圍]&#xA;  M7 --&gt; M8[terraform apply]&#xA;  M3 -- 是 --&gt; M4[暫停並複核變更]&#xA;  M4 --&gt; M5[必要時加 lifecycle 保護]&#xA;  M5 --&gt; M6[安排變更視窗]&#xA;  M6 --&gt; M8&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;對生產環境來説，建立、修改得慢一點並不是什麼很大的問題，最應當看重的是操作的正確性，慢一點，不要出錯。IaC 不是比手速，IaC 比的是可預期性。&lt;/p&gt;&#xA;&lt;p&gt;如果是刪除資源（比如下線某個 DNS 記錄、清理廢棄 Tunnel），走下面這個流程&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-mermaid&#34;&gt;flowchart TD&#xA;  D1[確認資源已廢棄&#xA;  檢查業務/監控/指令碼依賴] --&gt; D2[刪除 resource 塊或調整 count/for_each]&#xA;  D2 --&gt; D3[terraform plan]&#xA;  D3 --&gt; D4{to destroy 是否符合預期?}&#xA;  D4 -- 否 --&gt; D5[回滾修改並繼續排查依賴]&#xA;  D5 --&gt; D1&#xA;  D4 -- 是 --&gt; D6[準備回滾方案並選低峯視窗]&#xA;  D6 --&gt; D7[PR 稽核透過]&#xA;  D7 --&gt; D8[terraform apply]&#xA;  D8 --&gt; D9[刪除資源後的可用性檢查]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;日常協作建議&#34;&gt;日常協作建議&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;把 Credentials 放環境變數或 CI Secret，別寫進&lt;code&gt;.tf&lt;/code&gt;和倉庫&lt;/li&gt;&#xA;&lt;li&gt;對關鍵資源開啓保護策略，防止誤刪&lt;/li&gt;&#xA;&lt;li&gt;將目錄按資源型別拆分&lt;/li&gt;&#xA;&lt;li&gt;定期執行&lt;code&gt;terraform plan&lt;/code&gt;做基礎設施漂移檢查&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;和校正，避免在面板誤操作手動修改&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;雖然這套流程看起來很麻煩，但每一次變更都有記錄、可審計、可回滾，最重要的是可復現，這才是 IaC 最有價值的地方。&lt;/p&gt;&#xA;&lt;h2 id=&#34;蔘考&#34;&gt;蔘考&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://candinya.com/posts/manage-cloudflare-dns-with-terraform/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;使用 Terraform 管理 CloudFlare 上的 DNS 解析記錄 - Candinya&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developer.hashicorp.com/terraform/tutorials/automation/github-actions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Automate Terraform with GitHub Actions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developer.hashicorp.com/terraform/language/files/tfquery&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Query configuration files&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developer.hashicorp.com/terraform/language/block/tfquery/list&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;list block reference&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/cloudflare/cf-terraforming&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;cloudflare/cf-terraforming&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.cloudflare.com/terraform/advanced-topics/import-cloudflare-resources/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Import Cloudflare resources&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Cloudflare Provider - Terraform Registry&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Infrastructure_as_code&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Infrastructure as Code&lt;/a&gt;，是指採用機器可讀的配置檔案定義所需要的基礎設施的部署方法。&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;每個供應商的配置檔案欄位命名和格式都有區別，但這可以很容易的編寫指令碼進行轉換。&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;需要特別注意的是，狀態檔案中可能包含數據庫密碼、API 金鑰等明文儲存的敏感資訊，因此絕對不要將 &lt;code&gt;.tfstate&lt;/code&gt; 檔案提交到公開的代碼倉庫中。&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;HashiCorp Configuration Language，HashiCorp 自家開發的一種宣告式配置語言，旨在兼顧機器可讀性與人類可讀性。&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;冪等性（Idempotence）指計算機系統或介面在接收到同一請求的多次操作時，產生的影響與一次執行的結果相同，不論執行多少次，系統的最終狀態始終保持一致。&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;如果你僅僅是想讓 Terraform 不再管理某個資源，而不是真正在雲端銷燬它，應該使用 &lt;code&gt;terraform state rm&lt;/code&gt; 命令，而不是在代碼中刪掉資源塊然後 &lt;code&gt;apply&lt;/code&gt;，否則雲環境上的真實資源也會被一併銷燬。&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:7&#34;&gt;&#xA;&lt;p&gt;基礎設施漂移（Infrastructure Drift）是指現實中透過控制枱點按等非 IaC 途徑修改了基礎設施，導致其實際狀態與代碼中宣告的狀態不一致的情況。&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
        </item><item>
            <title>永遠忙碌</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2026/03/busy-for-eternity/</link>
            <pubDate>Fri, 13 Mar 2026 15:14:26 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2026/03/busy-for-eternity/</guid>
            <description>&lt;p&gt;工作，工作，至死方休。&lt;/p&gt;&#xA;&lt;p&gt;寒假給別人&lt;a class=&#34;link&#34; href=&#34;https://blog.l3zc.com/2026/02/buns-soaked-in-human-blood/&#34; &gt;上課&lt;/a&gt;，幾乎就沒有停過，春節名義上休息，也只不過是換了一種形式工作罷了——各種應酬，舟車勞頓，回家剛安頓好，又馬不停蹄的投入到上課工作中去。給別人上課也真是不容易，跟我在同一家機構當助教的同學一起交流時，大家都戲稱上課就是「赤石」：死記硬背的是記不住的，算數是不會算的，概念是混淆的，交流是沒辦法正常交流的。這倒也不怪他們，要怪也只能怪他們經歷過的教育環境，畢竟家家有本難唸的經。各種原因導致他們基本上走的都是高職單招，沒有經過高考的洗禮，有的甚至連初中都沒怎麼讀好，現在也只是想找個工作，所以才願意花錢請我們來給他們上一對一課程。&lt;/p&gt;&#xA;&lt;p&gt;一開始我在一家機構做助教，後來出來單幹，提高了部分收入，還節省了部分備課的時間。每天的上課是從7:30-11:00,價格是 ¥400。看似時薪過百比較高，實則結合學生的基礎狀況考慮，這錢我是賺得問心無愧，甚至我可以説，這錢真賺得也是不容易。&lt;/p&gt;&#xA;&lt;p&gt;回到正題，現在開學了，我又要馬不停蹄的投入到我自己的學業事務中去。真的感覺自己永遠都在忙，所謂的休息，也只不過是換點輕鬆的事情做一做罷了，教學教累了回家就 Vibe Coding 放鬆一下，坐在電腦前煩躁了就把家裏收拾一下打掃衞生。在做事情的動力、以及人的有限總精力這方面，我能真切的感受到人與人之間的差距：有的人天賦異稟，精力非常充沛，成果做了一個又一個，論文發了一篇又一篇，產出很高，好像制約他們的永遠都是時間，而不是他們的精力和動力；而更多人則是像我一樣的凡人，即使想要這種生活狀態，卻也還是心有餘而力不足，可是看到前面一類人的高產，又難免心生焦慮，只能在最大限度下把自己當成一個實際永動機&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&#xA;&lt;p&gt;從小到大接受的中式教育異化了我們，那句湯家鳳經典的「你這個年紀怎麼睡得着的」，雖然本意是訓斥上課睡覺的學生，卻也在某種程度上潛移默化影響着我們這一代，以至於到了一種病態的狀態。人生沒有絕對的「上岸」，小學要去上小升初的岸，初中要去上中考的岸，高中要去上高考的岸，大學要去上考研、讀博、考公、找工作的岸，完成學業蔘加工作了，還有各種升遷績效、柴米油鹽需要考慮。工作，工作，至死方休。想要上岸而一勞永逸嗎，不好意思，那是不可能的。&lt;/p&gt;&#xA;&lt;p&gt;雖然深知這一點，我還是會停下來休息就空虛難受，所以，永遠忙碌，永遠工作。滿足自己身體需要的休息，用鍛鍊身體平衡自己的內分泌，休息就是換一件自己喜歡且比較輕鬆的事情做，由於受中式教育、績優主義的影響太深，這種生活狀態，我想在很長一段時間裏是不會改變了。&lt;/p&gt;&#xA;&lt;p&gt;不過往好的方面看，透過這段時間的忙碌，我也是自己把自己這個學期的生活費給賺出來了，還有富餘給我媽準備一台新手機當生日禮物。突然也覺得，永遠忙碌這件事，好像也沒這麼糟。&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;這裏是用理想電流源和實際電流源的區別來類比所謂「理想永動機」和實際永動機的區別——前者是真正意義上的永動機，後者則是我等凡夫俗子用血肉之軀拼勁全力去接近的「實際永動機」&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
        </item><item>
            <title>培訓機構的人血饅頭</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2026/02/buns-soaked-in-human-blood/</link>
            <pubDate>Wed, 11 Feb 2026 09:06:57 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2026/02/buns-soaked-in-human-blood/</guid>
            <description>&lt;p&gt;最近在某家民營電網培訓機構給準備國網二批考試的學生一對一輔導，每天晚上上課三個半小時，&lt;strong&gt;給 200。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;這家機構給我的錢偏少還不是最嚴重的問題。問題出在他們給學生的收費上：有兩種方案，一種是所謂「卓越計劃」，收費 12 萬，但是一對一課程不限量；另一種是「協議班」，收費 7 萬，但&lt;strong&gt;每次上一對一課程要交 450&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;昨天給他們一學生私下開小灶，下午上課三個半小時，本來我想着既然私下找我，那就不經過這個培訓機構，學生直接給我結款 300——我能多賺一百，ta 能少花 150。結果那個學生腦子沒轉過彎，找班主任請假的時候竟然説要找我補課，於是他們就直接「善意地」幫我找家長收了 450。&lt;/p&gt;&#xA;&lt;p&gt;這還沒完。最後給我算工時，他們把這次課歸為所謂「額外課時」，説我違規利用了下午的「備課時間」給非卓越計劃的學生上課——三個半小時，只給了 120。&lt;/p&gt;&#xA;&lt;p&gt;簡而言之：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;學生付 450 → 機構抽走 330 → 我拿到 120&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;本該到我手上的 300 變成了 120，我自然是不爽。但比起我個人少拿的那一百多塊錢，更讓我不舒服的是這件事本身的性質。這些考國網二批的學生很多都是家境不太富裕的專科生，他們平日裏已經飽受歧視，想盡一切辦法想要改變命運，現在下了血本，花上可能是他們一個家庭一年收入的幾萬甚至十幾萬來讀這個國網課程。他們以為自己買的是一劑改命的「藥」，殊不知這藥引子是用自己的血和着吃的——而我辛苦勞動輔導學生，分到手裏的錢佔比卻比坐享其成的培訓機構還要低。&lt;/p&gt;&#xA;&lt;p&gt;這根本就是在吃人血饅頭。&lt;/p&gt;&#xA;&lt;p&gt;這一單，機構躺着淨賺 330。這顯然令人難以接受。我已經通知那位學生，令其下次請假時表現更加靈活；也和 ta 的班主任做出交涉，令她不要上報甚至干預我們私下的補課。考慮到班主任也是打工人，並且有學員成績的 KPI，我想她也不會蠢到跟自己的 KPI 過不去。當然，這家機構最好好自為之，否則我在「備課」時那句「助教們組建臨時工會，集體發動罷工，要求漲薪」的玩笑話，在將來的某天恐怕得一語成讖。&lt;/p&gt;&#xA;&lt;p&gt;不得不感嘆，到底誰才是資本主義啊——我看這機構的人血饅頭鋪子開得還挺熟練的。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>2025 年度總結</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2025/12/2025-end-of-the-year-summary/</link>
            <pubDate>Wed, 31 Dec 2025 11:28:17 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2025/12/2025-end-of-the-year-summary/</guid>
            <description>&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/cover_hu_546f5de4e94beb95.webp&#34; alt=&#34;Featured image of post 2025 年度總結&#34; /&gt;&lt;p&gt;真是忙碌的一年，不知不覺間，時間又到了年末。今年事情確實很多，奔波勞碌少不了，但也取得了階段性的收穫。我謹再次提筆寫下一篇年終總結，作為一年的見證。&lt;/p&gt;&#xA;&lt;h2 id=&#34;電氣的盡頭是電網&#34;&gt;電氣的盡頭是電網&#xA;&lt;/h2&gt;&lt;h3 id=&#34;為求職四處奔波&#34;&gt;為求職四處奔波&#xA;&lt;/h3&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250920_154353_hu_11efd88f784ccf12.webp&#34; alt=&#34;跑了一場雙選會&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20251220_153620_hu_7fe2627d8f597cfd.webp&#34; alt=&#34;海南電網在富麗華酒店的面試&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;我在一整年的休學生活以後如期復學，開始我的大學最後一年，成為一名「應屆生」，所以，找工作的事情也就理所應當的排上了日程。作為電氣工程專業的學生，出身原電力部屬院校，工作倒是不算難找。不過説容易也不算很容易，畢竟大環境如此，經濟增長放緩，國際形勢不明朗，用人需求減少，各種地方都越來越卷。&lt;/p&gt;&#xA;&lt;p&gt;九月份跑了場雙選會，線下投了幾份簡歷，也在網上投了四五份簡歷，收到面試通知的只有兩家。也算切身感受到了，原電力部屬院校的頭銜，幾乎只在電力系統內部&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;有用。現在這就業形勢也就這樣，除了電力系統，但凡待遇稍微好一點的工作都不是我們這種「雙非院校」的學生隨便就能找到的。不過對比起來，人家好歹還收你的簡歷，像是有些專業甚至連簡歷都不收。&lt;/p&gt;&#xA;&lt;h3 id=&#34;兩大電網的筆試&#34;&gt;兩大電網的筆試&#xA;&lt;/h3&gt;&lt;p&gt;電網工作是本專業最對口，最穩定的工作。本專業最大的用人單位——國家電網和南方電網，都需要透過筆試來獲得面試資格。筆試一共需要考 8 門，分別是《電路理論》、《電機學》、《電力系統分析》、《繼電保護》、《電力電子》、《高電壓技術》、《電氣裝置及主系統》（我們學校叫「發電廠電氣部分」）以及《行政能力測驗》（簡稱「行測」）。&lt;/p&gt;&#xA;&lt;p&gt;前面七門是專業知識，最後一門行政能力測驗考的則是五花八門，還有企業文化這種東西，背就完事了。時政是不得不考的，考什麼呢？總之是非常新的東西——幾天前剛剛在求是雜誌上發表的社論，幾天後的考試裏就直接出現了，我真的會謝。&lt;/p&gt;&#xA;&lt;p&gt;今年的考試很奇怪，尤其是難度方面，歷年的考試好説歹説也得有幾道計算題，電路好歹也得靈活的考一道難度稍大的題。基於這種情報，我在靠前已經掌握了不少計算題，各種電氣計算，數值整定，等效變換，可謂是得心應手。結果呢，今年國網一批考試一道計算題都沒考，行測小學生都會做，全都在考些概念題，要不是南網考試還考了這些靈活運用的東西，那真就是約等於白學了。於是不出意料地，我所知道的計算題比較拿手，平時模擬測試成績很好的同學，這次考試或多或少都有點炸。反倒是有些平時成績不怎麼理想，計算題不太會做的人，靠着死記硬背能考到一個不錯的成績。説白了，畢竟只是一個企業的招聘考試，他要怎麼出題，外人根本無從猜測，我已經做了我應該做的，最終的錄用結果也非常不錯，這就夠了。&lt;/p&gt;&#xA;&lt;h3 id=&#34;面試面試還是面試&#34;&gt;面試，面試，還是面試&#xA;&lt;/h3&gt;&lt;p&gt;12 月我跑了四場面試，其中廣西電網只有桂林一個面試地點，讓我不得不&lt;del&gt;翹課&lt;/del&gt;前往桂林面試，於是就有了今年最後一次的旅行，兩年內兩次前往桂林的感覺還不錯。&lt;/p&gt;&#xA;&lt;p&gt;國網面試還是讓我有點緊張，為了防止試題被泄露給後面的考生，面試採用全封閉式管理，過程也很漫長——大部分時間都是在等候室裏等待輪候。從下午 1:30 開始封存所有電子裝置，用一個小時做完心理測試之後就進入了漫長的輪候時光，期間場地在放《長津湖》供大家消遣，還有茶水和零食提供。西裝革履，正襟危坐，心裏一遍又一遍的背誦早就滾瓜爛熟的一分鐘自我介紹，緊張不安的邊看電影消遣邊等候，那種滋味只有親身經歷過才知道，現在回想起來倒也是挺有意思。&lt;/p&gt;&#xA;&lt;p&gt;有了國網面試的經驗和 Offer，排在其後的南網面試緊張感就沒那麼強。南方電網的面試形式和國家電網不太一樣，國家電網是半結構化雙盲面試，第一位考生從數份封存的面試題本里抽取一份，接下來的考生便都是一樣的問題，最多也就是被考官詢問一些附加問題。面試官不能看到你的簡歷，只能根據你在面試前抽籤獲得的編號對你打分，你也不能自報姓名和身世；而南方電網的面試則以面試官為主導，面試官會根據簡歷對你提出各種問題，包括專業題和附加問題。至於難度如何則完全看面試官的心情，例如我在海南電網的面試就被技術面試針對我的實習經歷窮追猛打，提出各種細緻入微的專業題，而在廣西電網的面試中，技術面試提出的問題則友好很多，無非是一些倒閘操作、防雷設施等等。&lt;/p&gt;&#xA;&lt;h3 id=&#34;電網培訓的酸甜苦辣&#34;&gt;電網培訓的酸甜苦辣&#xA;&lt;/h3&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250819_182040_hu_9f035c63414ae82d.webp&#34; alt=&#34;傍晚散步&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250819_184119_hu_f173b6fa7aa0237a.webp&#34; alt=&#34;偶遇的雲彩&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250819_181921_hu_1055fee83bee50f7.webp&#34; alt=&#34;附近的高壓線路&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/Screenshot_2025-10-10-20-57-03-452_com.tencent.mm_hu_200838b0f8909812.webp&#34; alt=&#34;刷題，刷題，還是刷題&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/screenshot_2025-11-27_23-35-58_hu_63f5f0b6afaf6e93.webp&#34; alt=&#34;企業文化必須滾瓜爛熟&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;考電網的人大部分都報名了某家培訓機構，我自然也不例外，早在去年 11 月我就按部就班地報名了一家全國性的電網培訓機構。這家培訓機構有兩個校區，我選擇了相對市郊的那個，畢竟房租便宜。&lt;/p&gt;&#xA;&lt;p&gt;培訓的課程安排非常密集，任務繁重。暑假班連續上課 41 天，中途只有三天休息。每天上課之前需要上交手機。好在 iPad 出於電子筆記的考慮，還是允許使用的，我也因此獲得了難得的摸魚機會。&lt;/p&gt;&#xA;&lt;p&gt;其實這段時間我也難得的獲得了專注於一件事情的機會——每天除了上課，沒有什麼別的需要關心，所以雖然身體累，但是「心」反倒是沒有多累；現在我回到了學校，反倒需要關心起大大小小的各種事情，身體倒是沒那麼累了，但「心」倒是比之前還累了不少。加上最近感冒咳嗽，一天能睡上 12 個小時，卻也還是不見好轉。只能在事情辦完以後，該請假請假，該回家回家，該休息休息了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;故地重遊&#34;&gt;故地重遊&#xA;&lt;/h2&gt;&lt;h3 id=&#34;永州&#34;&gt;永州&#xA;&lt;/h3&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250122_121431_hu_9139d942ff443734.webp&#34; alt=&#34;永州&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250122_153223_hu_119bbf370aade398.webp&#34; alt=&#34;銀龍電腦城——兒時回憶&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250122_153407_hu_75f5c2193137f130.webp&#34; alt=&#34;二十年了，沒怎麼變&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;今年年初回永州探親，祖母已經快 90 歲了，身子還算硬朗，常回去看看是應該的。自幼便蒙受祖母照顧，感激之情實在是難以用言語表達，卻也在應該做出什麼行動來回報這方面不知所措，唯有至少每年一次的回永州探望方還算盡了一些晚輩的責任。&lt;/p&gt;&#xA;&lt;p&gt;至於永州本身，也還是那個樣子，什麼都沒變。畢竟又不是經濟大爆發的時代，像這樣的小城市還能怎麼變呢？不變未必是悲哀，變也未必全是福氣，像是上世紀經歷了文革以後，什麼都變了一副光景，卻也什麼都面目全非。小時候十分火熱的商業綜合體，現在基本只有一樓的服飾門面在營業，電影院和老遊戲廳早就關門了，改做餐廳樓層之後變得昏暗不堪，新開的餐廳店鋪，不論品牌連鎖還是快招自營，大浪淘沙之後無一倖存。&lt;/p&gt;&#xA;&lt;h3 id=&#34;香港&#34;&gt;香港&#xA;&lt;/h3&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/DSCF0187.JPG_hu_80338f753b923972.webp&#34; alt=&#34;政府總部&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/DSCF0189.JPG_hu_cb13da2068e9876.webp&#34; alt=&#34;中環&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250422_112641_hu_1e96cecdbc2d2313.webp&#34; alt=&#34;酒店外景&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/DSCF0156.JPG_hu_63e4a420e01095c5.webp&#34; alt=&#34;小巷&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/DSCF0169.JPG_hu_49d9f960a8af333c.webp&#34; alt=&#34;路牌&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/DSCF0142.JPG_hu_3fc15df218b0937c.webp&#34; alt=&#34;電車&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250424_101442_hu_fb51beb94ea422c5.webp&#34; alt=&#34;中銀在效率這一塊&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250423_182408_hu_870bb99e461edf1b.webp&#34; alt=&#34;酒濃於水（bushi）&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250421_174511_hu_b0f44927a1040192.webp&#34; alt=&#34;香港的公寓&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;這次去香港就是去玩兩下子，沒什麼特別的目的，純屬白嫖我媽出差的酒店而已。當然，順便開張中銀卡。所以整個行程也顯得乏善可陳。唯一特別一點的地方是在灣仔的一間公寓住了幾天，可以自行買菜做飯（&lt;del&gt;當然也可以吃兩餸飯&lt;/del&gt;），體驗了一把民工一般的生活。&lt;/p&gt;&#xA;&lt;h3 id=&#34;桂林&#34;&gt;桂林&#xA;&lt;/h3&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20251224_194924_hu_15f0e9b608e95be5.webp&#34; alt=&#34;這個招牌的燈打得不錯&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20251224_112927_hu_4fd7a7bc2479dd30.webp&#34; alt=&#34;椿記燒鵝&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;這次去桂林主要是為了南方電網廣西分公司的面試，當然，也順便去吃吃椿記燒鵝和海天腸粉什麼的。美中不足的是在桂林面試的那兩天都在下雨，也就導致我沒什麼興致去周邊散步遊玩。海天腸粉和椿記燒鵝倒是吃了個夠，味道不錯，下次還來。&lt;/p&gt;&#xA;&lt;h2 id=&#34;以舊換新&#34;&gt;以舊換新&#xA;&lt;/h2&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250425_155402_hu_64b9ab0f62f7b107.webp&#34; alt=&#34;新電腦好誒&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250425_180234_hu_95f6f3aea77b7f19.webp&#34; alt=&#34;SB Windows 11&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;之前我的電腦是一台 i5 12450H + RTX 3060 Laptop 配置的機器，用了兩年多，幾個月前剛買了兩條重要牌&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;記憶體給他的機帶記憶體升級到 32G，其實要接着用也沒什麼問題。&lt;/p&gt;&#xA;&lt;p&gt;那段時間儲存晶片的價格仍然處於低谷，國補又讓購置新裝置的成本進一步降低，加上 50 系顯示卡剛剛上市，這三種因素疊加下新膝上型電腦的價格真的很吸引人。奈何我還是囊中羞澀，預算不足，無緣購買最新一代處理器 + 最新一代顯示卡的配置組合。只能退而求其次，買了 N - 1 代處理器 + 最新一代顯示卡的配置&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;。目前也用了小半年，日常體驗上還是很不錯的，只是這呼嘯的風扇聲實在是影響雅興。總體上，我對這次電腦的評價是瑕不掩瑜，隨着儲存晶片價格飛漲和國補力度減弱，膝上型電腦這麼便宜的情況恐怕很難再有下次了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;我家的貓&#34;&gt;我家的貓&#xA;&lt;/h2&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250427_125807_hu_5b61bb8c30db752f.webp&#34; alt=&#34;見到容身之處就往裏面鑽&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250208_141725_hu_c37c72856d52fb99.webp&#34; alt=&#34;這是什麼？貓腦袋！我摸！&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250626_152438_hu_827db49001ba7222.webp&#34; alt=&#34;這貓過得比人還舒服&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;我家的貓今年（應該）一歲啦&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;，慶祝之餘，對於公貓來説，從小貓長成大貓也就意味着蛋蛋開始發揮作用了，於是就發生了這一幕：&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/mmexport1745478106719_hu_aa931e8ed6a41965.webp&#34; alt=&#34;我 的 被 子 ~~&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;這臭貓在我去香港那段時間竟然跑到我牀上拉屎撒尿 &lt;del&gt;（可能是我爸在家裏沒有鏟屎）&lt;/del&gt;,不可饒恕，必須嘎蛋！&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/mmexport1749356267417_hu_48575c3a7508956e.webp&#34; alt=&#34;舒服了&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20250610_105723_hu_d5f83d680ed53460.webp&#34; alt=&#34;讓你亂撒野&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;貓給我的生活帶來了很多樂趣，在搞破壞之餘，它也是很可愛的。家裏的沙發也經過了一年的爪爪伺候，變得稀巴爛。總得付出一些代價的，養貓就是這樣，抓痕、換毛季到處都是的貓毛、偶爾還做些小壞事，也是貓的一部分。我們既然接受了貓給我們帶來的情緒價值，也就要相應地接受它的這些小缺點。我幾乎已經把它看作我的家人，若是從這種角度出發，那麼你對它的這些缺點就瞬間釋然了。這麼回想起來，也許我是真的愛它吧，以至於，我開始愛起了它的這些缺點。因為沒有這些缺點，它就不是一隻完整的貓了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;依舊在健身依舊在吃藥&#34;&gt;依舊在健身，依舊在吃藥&#xA;&lt;/h2&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/IMG_20251231_181040_hu_ada4c10cba556476.webp&#34; alt=&#34;一些吃完的空盒子&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;擼鐵，尤其是練腿，真的很爽，感受那種肌肉發揮力量以後淋漓盡致的舒暢感，真的會讓人上癮。在沒有電網培訓的時間裏，我一直都在走進健身房，不光是享受這種舒暢的感覺，也還能鍛鍊自己的肌肉。真的，不運動很難受啊。&lt;/p&gt;&#xA;&lt;p&gt;現在我依然每天都在吃藥，畢竟我可不希望我在連軸轉的幸苦生活中突然經歷一次情緒崩潰，原本計劃的吃藥一年後藥物逐漸減量計劃也因此被無限期延後。為什麼？説白了還是這段時間各種壓力實在是不小，雖然一直吃藥終究也不是個辦法，在安穩之後必須慢慢減量停藥，但在這段即將畢業的時間點，我還遠遠沒有過上安穩確定的生活。&lt;/p&gt;&#xA;&lt;p&gt;這段時間裏充滿了可能性和機遇，也充滿了壓力。吃藥花的錢是小錢，而其帶來的穩定情緒的「護盾」卻能發揮至關重要的作用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;沒時間玩遊戲&#34;&gt;沒時間玩遊戲&#xA;&lt;/h2&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/steam-2025-recap_hu_9c34df2ccc0aaf15.webp&#34; alt=&#34;我的 Steam 年度回顧&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;從&lt;a class=&#34;link&#34; href=&#34;https://s.team/y25/gqhwfdqc?l=schinese&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;我的 Steam 年度回顧&lt;/a&gt;就可以看出來，今年我是真的沒什麼時間來玩遊戲。「忙裏偷閒」是今年的基調，今年年末下載了《三角洲行動》，有時電網培訓十點下課，回家就開啓玩到晚上 12 點，目前遊玩 75 個小時，感覺還不錯。&lt;/p&gt;&#xA;&lt;p&gt;osu! 今年的後半段則是約等於棄坑了，不過 PP 仍然從去年的 3439pp 增長到了今年的 4701pp。這遊戲還真是需要持之以恆，一段時間不玩丟掉手感再想復健是需要時間的。想想十點下課之後，在精力耗盡的狀態下，再想打這種需要聚精會神地反應的遊戲，那還真是「臣妾做不到啊」。年中的時候我對於現有滑鼠的手感達到了最佳狀態，可以説是「指哪打哪」，想着「沒有人能阻止我一路走向 5 digit」&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;&#xA;，然而現在卻還在 5 digit 邊上，屬實是有些諷刺。&lt;/p&gt;&#xA;&lt;h2 id=&#34;我的-online-presence&#34;&gt;我的 Online Presence&#xA;&lt;/h2&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/2025-end-of-the-year-summary/image_hu_1b13d8cf59e9184e.webp&#34; alt=&#34;本部落格今年的統計資料&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;2025 年，我的部落格訪問量穩步上漲，全年 UV 48.3K，PV 95.4K，流量主要來自 Google（約 15.8K 訪客） 和 Bing（約 15.2K 訪客） 兩大搜尋引擎。&lt;/p&gt;&#xA;&lt;p&gt;Github 上的自用覆寫規則收穫了 194 個 Star，也新增了一些 Followers。&lt;/p&gt;&#xA;&lt;p&gt;今年我的一篇文章被人放上了 Hacker News，所以有幾天訪問量比較大。除此之外翻譯後的英語和日語版本部落格也收穫了不少讀者，在我的訪客中佔比不低。所以也就出現了今年因為忙碌，部落格更新頻率低於往年，訪問量卻成倍增長的現象。我終究還是需要向生活做出讓步，生活壓力、學業壓力和就業壓力或多或少都會影響我更新部落格的意願，擠佔我更新部落格的精力，在這點上，還請我的讀者們多多海涵。&lt;/p&gt;&#xA;&lt;h2 id=&#34;新的一年即將到來我給自己和大家的祝願&#34;&gt;新的一年即將到來，我給自己和大家的祝願&#xA;&lt;/h2&gt;&lt;p&gt;新的一年要來了，我今年最大的願望，當然是能夠順利解決之前休學帶來的一些遺留問題，順利畢業。等真正走進工作以後，我也希望自己能把更多注意力放在電力系統本身需要的技術上，多和裝置打打交道，少捲進一些不必要、甚至有害的人情世故。辛苦一些沒問題，只要平安、踏實、有意義即可：安全生產，少一些計較，多一些寬容。希望接下來能在這份工作上，從一名初出茅廬的學生，慢慢成長為一名真正的工程師。&lt;/p&gt;&#xA;&lt;p&gt;也把祝福送給屏幕前的你：願你在新的一年裏，焦慮有處安放，努力有回聲；在自己的節奏裏把日子過穩、過熱乎——不必每一步都算贏，但每一步都走得心裏有數。願你和你在意的人都健康，平安，少些無謂的消耗，多些確定的快樂。當然，也希望大家有更多時間在學習和工作之餘玩玩遊戲。&lt;/p&gt;&#xA;&lt;p&gt;至於我，就繼續在該學習的地方學習，在該上路的時候上路。明年見。&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;指由原電力部衍生的企業，即 2002 年以前的國家電力公司和 2002 年以後的國家電網、南方電網和蒙東電網等公營電力公司。&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;指最近剛剛被砍掉整個產品線的 Crucial 即英睿達記憶體。&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;買了&lt;a class=&#34;link&#34; href=&#34;https://blog.l3zc.com/2025/05/new-laptop-briefing/&#34; &gt;機械革命極光 X Pro&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;去年撿回來的時候還是&lt;a class=&#34;link&#34; href=&#34;https://blog.l3zc.com/2024/12/2024-end-of-the-year-summary-public/#%e5%a4%a9%e4%b8%8a%e4%b8%8d%e6%9c%83%e6%8e%89%e9%a4%a1%e9%a4%85%e4%bd%86%e6%9c%83%e6%8e%89%e5%b0%8f%e8%b2%93&#34; &gt;很小的貓&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;指排名的數字位數，例如排名 #114514 是 6 位數，即 6 digit， #11451 是五位數，即 5 digit。顯然，位數越小，玩家水平越高。&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
        </item><item>
            <title>從頻率崩潰到電壓失控：兩起大型停電事故帶來的啓示</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2025/12/analysis-of-two-major-blackouts-in-europe/</link>
            <pubDate>Wed, 17 Dec 2025 16:08:30 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2025/12/analysis-of-two-major-blackouts-in-europe/</guid>
            <description>&lt;img src=&#34;https://blog.l3zc.com/2025/12/analysis-of-two-major-blackouts-in-europe/cover_hu_3bdad3f2ff5b5148.webp&#34; alt=&#34;Featured image of post 從頻率崩潰到電壓失控：兩起大型停電事故帶來的啓示&#34; /&gt;&lt;p&gt;現代電網正在經歷一次巨大的轉型，隨着光伏、海上風電等新能源的佔比在電網中越來越高，新能源和電力電子裝置低轉動慣量、低短路容量、換流裝置需要大量無功支撐的特點以及它們給電網帶來的不利影響也愈發明顯。在此背景下，兩期相隔六年相繼發生在歐洲的大型停電事故顯得尤為耐人尋味，本文將簡要闡述兩起事故的來龍去脈，對比它們的異同，分析造成這兩起事故的本質原因，以及思考它們對現代電網的執行所帶來的啓示。&lt;/p&gt;&#xA;&lt;h2 id=&#34;事故概述&#34;&gt;事故概述&#xA;&lt;/h2&gt;&lt;h3 id=&#34;2019-年英國89大停電事故&#34;&gt;2019 年英國「8·9」大停電事故&#xA;&lt;/h3&gt;&lt;p&gt;2019 年 8 月 9 日下午，英國發生了一次大規模電力中斷，導致約 110 萬用戶斷電，並對交通等關鍵基礎設施造成了嚴重影響。整起事件的經過可以概括為一系列連鎖反應，其中既有預料之中的系統保護行為，也有意料之外的裝置故障。&lt;/p&gt;&#xA;&lt;h4 id=&#34;第一階段罕見的三次雷擊和大量有功意外脱網-165233&#34;&gt;第一階段：罕見的三次雷擊和大量有功意外脱網 (16:52:33)&#xA;&lt;/h4&gt;&lt;p&gt;當天下午 4 點 52 分，倫敦北部的 Eaton Socon – Wymondley 400kV 高壓輸電線路罕見的連續遭遇三次雷擊。儘管如此，繼電保護裝置仍然按照整定正確動作，在不到 0.1 秒的時間內清除了故障，線路在約 20 秒後自動重合閘，恢復正常執行。雷擊導致的電網電壓的波動觸發了分散式電源的向量偏移保護&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;，導致約 &lt;strong&gt;150MW&lt;/strong&gt; 的嵌入式發電&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;脱網。這是雷擊故障後的正常預期現象。&lt;/p&gt;&#xA;&lt;p&gt;幾乎在雷擊的同時，發生了兩起獨立但致命的意外事件：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hornsea 海上風電場&lt;/strong&gt;：功率從 799MW 鋭減至 62MW，損失了 &lt;strong&gt;737MW&lt;/strong&gt; 的出力。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Little Barford 燃氣電廠&lt;/strong&gt;：其蒸汽輪機跳閘，瞬間損失了 &lt;strong&gt;244MW&lt;/strong&gt; 的出力。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;根據電網規範，這兩處大型發電單元本不應該因為此類雷擊故障而脱網或大幅減載，因此這被定性為「極其罕見和意外的事件」。&lt;/p&gt;&#xA;&lt;h4 id=&#34;第二階段頻率崩潰與系統響應-165234---165331&#34;&gt;第二階段：頻率崩潰與系統響應 (16:52:34 - 16:53:31)&#xA;&lt;/h4&gt;&lt;p&gt;上述三項發電損失（150MW + 737MW + 244MW）累積造成了 &lt;strong&gt;1131MW&lt;/strong&gt; 的功率缺口。這個損失超過了當時系統按 N-1 安全準則&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;設定的 1000MW 備用容量。巨大的功率缺口導致系統頻率迅速下跌。&lt;/p&gt;&#xA;&lt;p&gt;快速的頻率下跌觸發了更多分散式電源的 RoCoF&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; 保護，導致額外的約 &lt;strong&gt;350MW&lt;/strong&gt; 分散式電源相繼脱網。此時，總髮電損失已達 &lt;strong&gt;1481MW&lt;/strong&gt;。系統中的所有備用電源——電池儲能、分散式頻率響應服務等迅速啓動，緊急增援 &lt;strong&gt;1300MW&lt;/strong&gt;，試圖阻止頻率下跌。它們的響應成功地使頻率暫時穩定在 &lt;strong&gt;49.1 Hz&lt;/strong&gt;（實際上這個頻率已經相當危險了），並且開始緩慢回升。&lt;/p&gt;&#xA;&lt;p&gt;然而，就在頻率剛剛恢復到 &lt;strong&gt;49.2Hz&lt;/strong&gt; 時，Little Barford 燃氣電廠的一號機組也因蒸汽旁路系統壓力異常而不得不緊急停機，再次損失 &lt;strong&gt;210MW&lt;/strong&gt; 出力。&lt;/p&gt;&#xA;&lt;h4 id=&#34;第三階段低頻減載與系統恢復-165349-之後&#34;&gt;第三階段：低頻減載與系統恢復 (16:53:49 之後)&#xA;&lt;/h4&gt;&lt;p&gt;Little Barford 燃氣電廠的第二次的意外跳閘耗盡了所有已在工作的備用資源，系統頻率無力迴天，最終跌破了&lt;strong&gt;48.8Hz&lt;/strong&gt;的閾值。這自動觸發了英國電網的最後一道防線——低頻減載&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;。低頻減載自動切除了約 5% 的電網需求，也就是約 1GW 的負荷，導致了約 110 萬用戶的斷電。這一「棄車保帥」的措施有效地遏制了頻率的下跌，防止了更嚴重的電網事故。&lt;/p&gt;&#xA;&lt;p&gt;在切除部分負荷後，加上控制中心緊急排程其他電源，系統頻率在 5 分鐘內（16:57）恢復到了正常的 50Hz。在確認電網穩定後，配電網絡運營商（DNOs）從 16:58 開始逐步恢復對用戶的供電，到 17:37 所有用戶恢復正常。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2025-年伊比利亞半島大停電西葡大停電&#34;&gt;2025 年伊比利亞半島大停電（西葡大停電）&#xA;&lt;/h3&gt;&lt;p&gt;2025 年 4 月 28 日，伊比利亞半島出現大規模停電，西班牙和葡萄牙全境均受到影響。由於停電，上述地區的交通和通訊服務均受到嚴重影響，交通訊號燈停止工作，當地的地鐵線路被迫停止運營，馬德里網球公開賽受到停電影響也宣佈暫停。此外，安道爾和法國南部也受到波及。這次大停電並非由單一故障引發，而是一系列事件環環相扣、逐步升級最終導致系統崩潰的級聯事故。西班牙首相佩德羅·桑切斯表示，電力系統如此大規模的癱瘓前所未見。&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;第一階段系統振盪與電壓波動中午-1203---1219&#34;&gt;第一階段：系統振盪與電壓波動（中午 12:03 - 12:19）&#xA;&lt;/h4&gt;&lt;p&gt;2025 年 4 月 28 日中午 12:00，西班牙電力系統處於正常執行狀態，電壓和頻率均在標準範圍內，沒有任何跡象預示即將發生災難。&lt;/p&gt;&#xA;&lt;p&gt;12:03，系統中檢測到一個顯著的 &lt;strong&gt;0.6 Hz 強迫振盪&lt;/strong&gt;，持續了近 5 分鐘。頻譜分析及後續溯源表明，這次振盪源於巴達霍斯（Badajoz）省一座光伏電站的內部控制邏輯異常。振盪導致了系統電壓出現跌落，為此，電網排程中心採取了緊急阻尼措施，包括更改拓撲結構、&lt;strong&gt;切除並聯電抗器&lt;/strong&gt;，並大幅削減與法國的電力交換。&lt;/p&gt;&#xA;&lt;p&gt;12:19，系統再次出現 &lt;strong&gt;0.2 Hz 的歐洲區域間振盪&lt;/strong&gt;&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;，併疊加了之前殘留的 0.6 Hz 振盪。排程中心被迫進一步減少與法國和葡萄牙的電力交換。雖然這些措施有效抑制了振盪，但&lt;strong&gt;削減聯絡線潮流&lt;/strong&gt;這一動作，導致輸電通道輕載，不僅減少了線路上的無功損耗，還因充電功率過剩開始推高系統電壓，為後續的電壓越限埋下了伏筆。&lt;/p&gt;&#xA;&lt;h4 id=&#34;第二階段電壓攀升與級聯故障的形成中午-1222---1233&#34;&gt;第二階段：電壓攀升與級聯故障的形成（中午 12:22 - 12:33）&#xA;&lt;/h4&gt;&lt;p&gt;從 12:22 開始，系統電壓呈現持續攀升趨勢，儘管尚未突破操作限值，但上升速率異常。這背後是多重因素的疊加效應：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;隱性負荷脱網（Hidden Demand Loss）&lt;/strong&gt;：配電網中約 &lt;strong&gt;700 MW&lt;/strong&gt; 的分散式光伏和自用發電裝置（&amp;lt;1MW）因電壓擾動不明原因脱網。在輸電網看來，這表現為淨負荷突然下降，即「發電大於負荷」，潮流進一步減小，從而導致電壓抬升。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;逆變器電源的有功/無功耦合&lt;/strong&gt;：部分可再生能源電站為響應排程指令降低有功出力。然而，由於這些裝置主要採用功率因數控制&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt;（Power Factor Control）而非電壓控制，有功的降低導致其吸收無功的能力同步下降，喪失了抑制電壓上升的手段。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;常規機組勵磁響應不足&lt;/strong&gt;：本應作為電壓「壓艙石」的同步發電機組（需符合 P.O. 7.4 規程），未能按預期深度進相執行吸收無功，導致動態電壓支撐失效。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;12:32:57，位於格拉納達（Granada）的一座發電站發生跳閘，損失 &lt;strong&gt;355 MW&lt;/strong&gt; 有功出力及 &lt;strong&gt;165 Mvar&lt;/strong&gt; 的無功吸收能力。值得注意的是，此時輸電網側電壓仍在正常範圍內&lt;sup id=&#34;fnref:9&#34;&gt;&lt;a href=&#34;#fn:9&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;9&lt;/a&gt;&lt;/sup&gt;。報告推斷故障根源在於升壓變壓器的有載調壓&lt;sup id=&#34;fnref:10&#34;&gt;&lt;a href=&#34;#fn:10&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;10&lt;/a&gt;&lt;/sup&gt;動作滯後。當主網電壓升高時，分接頭未能及時響應，導致發電機側（220kV 側）出現嚴重的過電壓，觸發繼電保護動作跳閘。&lt;/p&gt;&#xA;&lt;p&gt;19.5 秒後（12:33:16），巴達霍斯省另外兩座光伏電站相繼跳閘，累計再損失 &lt;strong&gt;727 MW&lt;/strong&gt;。原因同樣指向電站內部過壓保護配合不當，而非主網故障。&lt;/p&gt;&#xA;&lt;p&gt;在隨後的 650 毫秒內，西班牙各地的風電和光伏電站發生雪崩式脱網，額外損失約 &lt;strong&gt;834 MW&lt;/strong&gt;。此時，系統已從電壓問題轉化為嚴重的有功功率缺額。&lt;/p&gt;&#xA;&lt;h4 id=&#34;第三階段孤網執行與系統崩潰中午-1233-之後&#34;&gt;第三階段：孤網執行與系統崩潰（中午 12:33 之後）&#xA;&lt;/h4&gt;&lt;p&gt;在短短 22.5 秒的級聯故障中，系統累計瞬時損失了約 &lt;strong&gt;2000 MW&lt;/strong&gt; 的發電量。鉅額的功率缺口導致系統頻率急劇跳水，而大量進相執行機組的脱網又導致系統喪失了無功吸收能力，電壓開始失控性飆升。&lt;/p&gt;&#xA;&lt;p&gt;12:33:19，西班牙與法國的交流聯絡線因嚴重功角失步跳閘。西班牙和葡萄牙電網進入孤網執行&lt;sup id=&#34;fnref:11&#34;&gt;&lt;a href=&#34;#fn:11&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;11&lt;/a&gt;&lt;/sup&gt;狀態。&lt;/p&gt;&#xA;&lt;p&gt;儘管交流線已斷開，但西班牙與法國之間的 HVDC（高壓直流輸電） 鏈路由於處於恆功率控制模式且未配置頻率響應功能&lt;sup id=&#34;fnref:12&#34;&gt;&lt;a href=&#34;#fn:12&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;12&lt;/a&gt;&lt;/sup&gt;，並未切斷，仍強行向法國出口 &lt;strong&gt;1000 MW&lt;/strong&gt; 功率。這使得本已脆弱不堪的孤網雪上加霜。&lt;/p&gt;&#xA;&lt;p&gt;雖然低頻減載&lt;sup id=&#34;fnref1:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;裝置正確動作試圖挽救頻率，但切除負荷會導致線路空載電壓進一步升高。「電壓升高&amp;ndash;&amp;gt;發電機過壓保護脱網&amp;ndash;&amp;gt;低頻率&amp;ndash;&amp;gt;切負荷&amp;ndash;&amp;gt;電壓進一步升高」的惡性迴圈讓系統徹底失去穩定。&lt;/p&gt;&#xA;&lt;p&gt;隨着頻率跌破 &lt;strong&gt;47.79 Hz&lt;/strong&gt;，核電站、燃氣輪機等大型基荷機組因低頻保護動作相繼脱網。最終，在 12:33:24，伊比利亞半島電力系統電壓崩潰&lt;sup id=&#34;fnref:13&#34;&gt;&lt;a href=&#34;#fn:13&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;13&lt;/a&gt;&lt;/sup&gt;，全網陷入大停電。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一些基本概念&#34;&gt;一些基本概念&#xA;&lt;/h2&gt;&lt;p&gt;為了徹底理解這兩起事故的本質區別，我們需要先複習一些電氣工程的核心概念，建立起分析問題的理論基礎。&lt;/p&gt;&#xA;&lt;h3 id=&#34;有功功率無功功率與復功率&#34;&gt;有功功率、無功功率與復功率&#xA;&lt;/h3&gt;&lt;p&gt;在交流電路中，「功率」是一個複數概念。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;有功功率 ($P$)&lt;/strong&gt;：復功率的實部，單位是瓦特 ($\text{W}$)。它是實際做功、轉換能量（如發光、發熱、驅動電機）的部分。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;無功功率 ($Q$)&lt;/strong&gt;：復功率的虛部，單位是乏 ($\text{var}$)。它並不直接做功，而是在電源和儲能元件（電感、電容）之間往復交換能量，用於建立和維持電磁場。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;復功率 ($\widetilde{S}$)&lt;/strong&gt;：二者的向量和。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;公式表示為：&lt;/p&gt;&#xA;$$&#xA;\widetilde{S} = P + jQ&#xA;$$&lt;p&gt;裝置銘牌上標註的通常是&lt;strong&gt;視在功率 ($S$)&lt;/strong&gt;，即復功率的模，單位是伏安 ($\text{V}\cdot\text{A}$)，其物理意義是裝置能夠承受的電壓與電流乘積的極限：&lt;/p&gt;&#xA;$$&#xA;S = |\widetilde{S}| = \sqrt{P^2 + Q^2}&#xA;$$&lt;p&gt;&lt;strong&gt;形象的理解：&lt;/strong&gt;&#xA;如果你在拉一輛車，&lt;strong&gt;有功功率&lt;/strong&gt;就是你朝車前進方向用的力，它讓車真正移動；&lt;strong&gt;無功功率&lt;/strong&gt;則是你為了維持姿勢或者因為路面傾斜而垂直於移動方向用的力，雖然它不做功，但必不可少&lt;sup id=&#34;fnref:14&#34;&gt;&lt;a href=&#34;#fn:14&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;14&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&#xA;&lt;p&gt;在電網中，無功功率的核心作用是&lt;strong&gt;支撐電壓&lt;/strong&gt;。如果無功不足，電壓就會像泄氣的皮球一樣支撐不住；如果無功過剩，電壓就會像充氣過度的氣球一樣飆升。因此，電力系統的一大原則是無功功率要「分層分割槽，就地平衡」。&lt;/p&gt;&#xA;&lt;h3 id=&#34;感性無功與容性無功&#34;&gt;感性無功與容性無功&#xA;&lt;/h3&gt;&lt;p&gt;工程上規定：&lt;strong&gt;電感消耗無功，電容產生無功&lt;/strong&gt;&lt;sup id=&#34;fnref:15&#34;&gt;&lt;a href=&#34;#fn:15&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;15&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;感性負荷&lt;/strong&gt;（如電動機、變壓器）：需要消耗正的無功功率來建立磁場。如果電網無法提供足夠的無功，這些裝置就無法正常工作。現實中絕大多數負荷都是感性的。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;容性元件&lt;/strong&gt;（如電容器、長輸電線路的對地電容）：可以看作是無功功率的「發電機」，它們向電網注入無功功率，提升電壓。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;電壓降落與-p-q-解耦&#34;&gt;電壓降落與 $P-Q$ 解耦&#xA;&lt;/h3&gt;&lt;p&gt;當電流流過一段輸電線路時，首末端之間會產生電壓降落。若忽略線路電阻（在高壓電網中 $X \gg R$），電壓降落的縱分量（影響幅值）和橫分量（影響相位）可以簡化表示為：&lt;/p&gt;&#xA;$$&#xA;\Delta U \approx \frac{QX}{U} \quad \text{(電壓幅值降落)}&#xA;$$$$&#xA;\delta U \approx \frac{PX}{U} \quad \text{(電壓相位差)}&#xA;$$&lt;p&gt;&lt;strong&gt;這是一個至關重要的結論&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;電壓幅值 ($U$) 主要取決於無功功率 ($Q$) 的平衡&lt;/strong&gt;。無功多了電壓就高，少了電壓就低。這是理解西葡大停電的基礎。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;功角/相位 ($\delta$) 主要取決於有功功率 ($P$) 的平衡&lt;/strong&gt;。這與系統的頻率特性密切相關。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;系統慣量與頻率特性&#34;&gt;系統慣量與頻率特性&#xA;&lt;/h3&gt;&lt;p&gt;為了理解&lt;strong&gt;2019 年英國大停電&lt;/strong&gt;，我們還需要引入&lt;strong&gt;慣量 ($H$)&lt;/strong&gt; 的概念。&lt;/p&gt;&#xA;&lt;p&gt;電網頻率 ($f$) 體現了全網有功功率的供需平衡。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;當 &lt;strong&gt;發電 &amp;lt; 用電&lt;/strong&gt; 時，轉子動能被抽取，轉速下降，頻率降低。&lt;/li&gt;&#xA;&lt;li&gt;當 &lt;strong&gt;發電 &amp;gt; 用電&lt;/strong&gt; 時，轉子加速，頻率上升。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;傳統的同步發電機有巨大的旋轉轉子，儲存了巨大的動能。當發電機突然脱網（有功缺口）時，這些旋轉的「大鐵疙瘩」會利用慣性釋放動能，阻礙頻率的快速下跌。這被稱為&lt;strong&gt;系統的慣量&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;然而，光伏和風電透過電力電子裝置併網，它們沒有直接耦合的旋轉質量，被稱為「零慣量」電源。當這些電源佔比很高時，電網就像失去了「飛輪」的緩衝，一旦出事，頻率會跌得極快&lt;sup id=&#34;fnref:16&#34;&gt;&lt;a href=&#34;#fn:16&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;16&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;容升效應與此次事故的關聯&#34;&gt;容升效應與此次事故的關聯&#xA;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;為什麼切除了發電機，電壓反而會飆升？&lt;/strong&gt; 這看似反直覺，實則是&lt;strong&gt;容升效應&lt;/strong&gt;與&lt;strong&gt;線路負載&lt;/strong&gt;共同作用的結果。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/12/analysis-of-two-major-blackouts-in-europe/power_line_hu_eecd345f9810136d.webp&#34; alt=&#34;輸電線路的等值電路&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;高壓輸電線路模型包含兩部分關鍵引數：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;串聯電感 ($L$)&lt;/strong&gt;：電流流過時會&lt;strong&gt;消耗&lt;/strong&gt;無功 ($Q_{consumed} = I^2 X_L$)。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;並聯對地電容 ($C$)&lt;/strong&gt;：電壓作用其上時會&lt;strong&gt;產生&lt;/strong&gt;無功 ($Q_{generated} = U^2 B_C$)。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;事故前的平衡狀態&lt;/strong&gt;：&#xA;西班牙南部光伏大發，巨大的有功功率 ($P$) 正在透過長距離線路向北輸送。此時線路電流 ($I$) 很大，電感消耗了大量的無功，正好抵消了電容產生的無功，甚至還需要發電機吸收一部分多餘的無功。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;事故後的失控過程&lt;/strong&gt;：&#xA;當發電機組連鎖脱網，或者因強迫振盪導致潮流中斷時，線路上的有功功率傳輸瞬間歸零，導致電流 ($I$) 驟降。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;後果 1&lt;/strong&gt;：線路電感對無功的&lt;strong&gt;消耗&lt;/strong&gt; ($I^2 X_L$) 瞬間消失。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;後果 2&lt;/strong&gt;：線路依然帶電，對地電容產生的&lt;strong&gt;充電無功&lt;/strong&gt; ($U^2 B_C$) 依然存在，甚至因電壓升高而更多。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;瞬間，原本被消耗掉的巨量無功功率變得無處可去，全部堆積線上路上，直接將系統電壓「頂」到了破壞性的高度。這就是所謂的「空載線路容升效應」在事故中的極端表現。&lt;/p&gt;&#xA;&lt;h2 id=&#34;兩起不同的事故一份共同的反思&#34;&gt;兩起不同的事故，一份共同的反思&#xA;&lt;/h2&gt;&lt;p&gt;這兩起事故雖然在演化路徑上截然不同，但其背後折射出的挑戰卻有着驚人的相似性，二者都是現代電網發展程序中必然面臨的「成長的陣痛」。正如南方電網的安全理念所言：「一切事故都可以預防」，作為一名電氣工程專業的學生，我希望透過深入剖析這兩起事故，探尋其底層的技術邏輯，以加深對新型電力系統特性的理解。&lt;/p&gt;&#xA;&lt;h3 id=&#34;表象的差異崩潰路徑的一明一暗&#34;&gt;表象的差異：崩潰路徑的「一明一暗」&#xA;&lt;/h3&gt;&lt;p&gt;2019 年英國「8·9」大停電是一次典型的，顯性的頻率危機。機組脱網導致有功功率缺口，直接引發頻率驟降，但系統最終依靠低頻減載&lt;sup id=&#34;fnref2:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;作為最後一道防線，成功避免了全網崩潰。相比之下，2025 年伊比利亞半島大停電則呈現出了一種更為隱蔽且致命的新形態——隱性的電壓危機。事故雖然始於擾動，但核心矛盾迅速演變為嚴重的無功過剩與電壓失控，而原本用於挽救頻率的低頻減載&lt;sup id=&#34;fnref3:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;措施，反而在客觀上惡化了電壓升高，導致整個系統在短短几十秒內徹底瓦解。&lt;/p&gt;&#xA;&lt;p&gt;這就引出了一個核心問題：傳統的電網故障通常伴隨着電壓跌落，但在 2025 年的事故中，為何會出現發電機組不斷脱網，而系統無功功率反而嚴重過剩、電壓持續飆升的反常現象？傳統的電壓控制手段&lt;sup id=&#34;fnref:17&#34;&gt;&lt;a href=&#34;#fn:17&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;17&lt;/a&gt;&lt;/sup&gt;為何全然失效？&lt;/p&gt;&#xA;&lt;p&gt;答案在於：電壓失控的速率，遠遠超過了傳統防禦手段的響應極限。&lt;/p&gt;&#xA;&lt;p&gt;事故發生時，伊比利亞南部正值光伏大發，系統呈現「高電壓、輕負荷」的執行特徵。當系統發生強迫振盪時，輸電走廊潮流發生劇變。由於超高壓線路的容升效應顯著，發電機組的連鎖脱網帶來了雙重打擊：一方面，電網失去了大量能夠吸收無功的同步機組；另一方面，線路輸送的有功功率鋭減，導致其自身消耗的無功大幅降低，線路瞬間從「無功負載」變成了巨大的「無功電源」。系統隨即陷入了無功嚴重過剩的惡性迴圈。&lt;/p&gt;&#xA;&lt;p&gt;面對這種幾十毫秒級甚至更快的電壓崩潰，依靠機械開關投切的並聯電抗器顯得力不從心。首先是&lt;strong&gt;速度滯後&lt;/strong&gt;：從排程指令發出、通訊傳輸到斷路器機械動作，由於包含人為決策和機械過程，往往需要數百毫秒甚至秒級時間，根本無法追趕電壓飆升的速度。其次是&lt;strong&gt;調節顆粒度粗糙&lt;/strong&gt;：電抗器只能以組為單位（如 50 Mvar 或 100 Mvar）進行離散投切，無法像水龍頭一樣提供平滑、連續的調節。在極端的電壓動態過程中，這種非連續的階躍式調節不僅不夠精準，甚至可能引發新的系統擾動。&lt;/p&gt;&#xA;&lt;h3 id=&#34;本質的共性脆弱性的同根同源&#34;&gt;本質的共性：脆弱性的同根同源&#xA;&lt;/h3&gt;&lt;p&gt;剝開表象的差異，我們會發現兩起事故的根源驚人地一致，都指向了新型電力系統的結構性脆弱：&lt;/p&gt;&#xA;&lt;p&gt;首先，裝置併網行為的合規性令人擔憂。無論是英國事故中的分散式嵌入式電源，還是伊比利亞事故中的光伏電站，事故擴大的直接推手都是大量機組未能嚴格遵守併網規程（如西班牙的 P.O. 74 標準或英國的 Grid Code）。缺乏故障穿越能力，導致裝置在擾動初期即發生不合規的連鎖脱網，將「小事故」放大為「大災難」。&lt;/p&gt;&#xA;&lt;p&gt;其次，新型電氣裝置和電源的控制模型長期存在「黑箱化」的問題。系統中存在大量排程中心「看不見、管不着」的盲區。例如英國事故中 Hornsea 海上風電場在故障後的功率異常鋭減，以及大量分散式電源的不可控行為。這些電力電子化裝置內部控制邏輯的「黑箱狀態」，使得傳統的模擬模型失效，排程員無法準確預判系統行為。&lt;/p&gt;&#xA;&lt;p&gt;更加雪上加霜的是，整個系統的轉動慣量正在越來越少。隨着高比例新能源接入，交流電網的旋轉慣量和短路容量被稀釋，系統抗擾動能力顯著下降。電網變得更加「輕薄」和「敏感」，任何微小的擾動都可能引發劇烈的頻率或電壓波動。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一致的解決方案邁向韌性電網&#34;&gt;一致的解決方案：邁向韌性電網&#xA;&lt;/h3&gt;&lt;p&gt;基於上述反思，未來的電網建設與事故防禦應當聚焦於以下三個方向：&lt;/p&gt;&#xA;&lt;p&gt;一曰部署先進的動態無功支撐技術。必須以此為契機，加速推廣 STATCOM（靜止同步補償器）等具有毫秒級響應速度、可平滑調節的電力電子裝備，逐步替代傳統的機械式無功補償裝置，以應對瞬息萬變的電壓動態。&lt;/p&gt;&#xA;&lt;p&gt;二曰打破「黑箱」，強化全景建模。必須建立更精細化的電磁暫態模擬模型，打破新能源場站和逆變器控制的「黑箱」，確保排程端能真實掌握海量電力電子裝置的動態特性，消除盲區。&lt;/p&gt;&#xA;&lt;p&gt;三曰革新分析與控制正規化。傳統的基於穩態或工頻量的分析方法已不再適用。我們需要建立涵蓋寬頻域振盪、電壓/頻率耦合特性的新一代安全穩定分析的理論框架，並重新審視低頻減載&lt;sup id=&#34;fnref4:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;等傳統防線在新型電網中的適應性。&lt;/p&gt;&#xA;&lt;h2 id=&#34;結語草台班子&#34;&gt;結語：草台班子&#xA;&lt;/h2&gt;&lt;p&gt;我們在前文中洋洋灑灑分析了複雜的電磁暫態、昂貴的 STATCOM 和精妙的控制理論，但現實卻狠狠地扇了我們一巴掌——摧毀整個電網的，往往不是什麼未研究的知識，而是來自人類本身的不可靠。&lt;/p&gt;&#xA;&lt;p&gt;機組的併網規程早就白紙黑字寫得明明白白，卻長期未能執行，P.O 7.4 規程更是遲遲未能透過；2019 年英國大停電的「學費」交得那麼貴，所有的事故分析報告都指向了合規性問題，然而 6 年後的伊比利亞半島，竟然還能因為一模一樣的邏輯再次翻車，而且翻的比 6 年前還要慘烈，還要徹底。&lt;/p&gt;&#xA;&lt;p&gt;面對這種跨越國界、跨越時間的重複犯錯，任何技術層面的分析都顯得蒼白無力。黑格爾那句名言至今聽來依然振聾發聵，且含金量還在隨着每一次大停電不斷暴漲：&lt;/p&gt;&#xA;&lt;p&gt;「人類從歷史中學到的唯一教訓，就是人類無法從歷史中吸取任何教訓。」&lt;/p&gt;&#xA;&lt;p&gt;也許這就是世界的本質吧，世界永遠不是圍繞着技術本身運轉的，「人」才是這個世界的決定性因素。這個世界是一個草台班子，而且永遠會是一個草台班子，而只要還是個草台班子，那麼下一次翻車，永遠只是時間問題。&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;向量偏移保護的初衷是解決「孤島效應」——假設一條配電線路因為故障或檢修，從主電網上被斷開。但這條線路上恰好連線着一個嵌入式發電機，如果沒有向量偏移檢測，這個發電機就會繼續為這條線路供電，進而大大增加裝置損壞的機率，甚至威脅執行檢修人員的安全。因此，向量偏移保護就是早期用於檢測嵌入式發電機是否進入孤網執行狀態的方法。&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;多為用戶側的小型發電系統。&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;N-1 安全準則的意思是，當系統中最大的一台機組因故障而停運時，系統應有足夠的備用容量作為頻率和電壓的支撐。&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;Rate of Change of Frequency，頻率變化率。&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;低頻減載（Low Frequency Demand Disconnection, LFDD 或者 Under-Frequency Load Shedding, UFLS）是電力系統防止頻率崩潰的關鍵安全保護措施，當系統發生功率缺額導致頻率下降時，它透過自動、分級地切除非重要負荷（如工業用電、路燈等），以快速恢復系統功率平衡，防止大面積停電或系統崩潰。低頻減載系統透過頻率測量和執行單元實現，設定多個頻率動作點（如48.5Hz, 47.5Hz, 46.5Hz），逐級切除負荷，保障重要用戶和核心裝置執行，是電網安全執行的第三道防線。&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref1:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref2:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref3:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref4:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;來源：&lt;a class=&#34;link&#34; href=&#34;https://archive.is/i6zHt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;France24 的報導&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:7&#34;&gt;&#xA;&lt;p&gt;技術報告中的原文是「inter-area oscillation」，基於上下文，其意思應該是整個歐洲互聯電網的 0.2Hz 振盪。&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:8&#34;&gt;&#xA;&lt;p&gt;風電、光伏等新能源機組一般採用最大功率點追蹤 MPPT，來實現新能源機組出力的最大化。&amp;#160;&lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:9&#34;&gt;&#xA;&lt;p&gt;418kV，仍在標準電壓允許的偏移範圍內。&amp;#160;&lt;a href=&#34;#fnref:9&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:10&#34;&gt;&#xA;&lt;p&gt;即變壓器的帶負載調壓。&amp;#160;&lt;a href=&#34;#fnref:10&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:11&#34;&gt;&#xA;&lt;p&gt;孤網執行（或孤島執行）指區域性電網脱離主大電網，獨立供電的執行模式，特點是自給自足，但面臨頻率、電壓不穩定等挑戰，依賴儲能和控制技術維持，常見於偏遠地區、島嶼、或工業園區。這裏的孤網執行是因為聯絡線中斷而被迫進入的。&amp;#160;&lt;a href=&#34;#fnref:11&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:12&#34;&gt;&#xA;&lt;p&gt;恆功率控制模式（Constant Power Mode）是一種電源輸出模式，它的核心特點是無論負載如何變化，始終保持電源輸出的功率（P）恆定（P = 電壓 V × 電流 I），電源會根據負載需求自動調節電壓和電流，以維持這個恆定功率。&amp;#160;&lt;a href=&#34;#fnref:12&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:13&#34;&gt;&#xA;&lt;p&gt;電壓崩潰（Voltage Collapse）是電力系統一種嚴重的事故，指系統因無功功率嚴重不足，導致電壓持續、惡性下降並無法恢復，形成電壓跌落的惡性迴圈，最終引起大面積停電。&amp;#160;&lt;a href=&#34;#fnref:13&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:14&#34;&gt;&#xA;&lt;p&gt;工程界常以「啤酒」作比喻：啤酒杯裏的液體是「有功」，上面的泡沫是「無功」。雖然泡沫不解渴，但沒有泡沫的啤酒失去了靈魂（無法建立磁場），且為了裝滿杯子（視在功率），泡沫總是客觀存在的。&amp;#160;&lt;a href=&#34;#fnref:14&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:15&#34;&gt;&#xA;&lt;p&gt;這是一個約定俗成的稱呼。嚴格來説，電容是「吸收負的無功」，但在工程實踐中，為了方便理解無功平衡，我們通常説電容「發出/提供感性無功」，起到支撐電壓的作用。&amp;#160;&lt;a href=&#34;#fnref:15&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:16&#34;&gt;&#xA;&lt;p&gt;頻率下降的速度被稱為 RoCoF (Rate of Change of Frequency)。高 RoCoF 是導致英國「8.9」停電中分散式電源連鎖脱網的直接元兇。&amp;#160;&lt;a href=&#34;#fnref:16&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:17&#34;&gt;&#xA;&lt;p&gt;即消耗過剩無功的措施，如投切並聯電抗器等。&amp;#160;&lt;a href=&#34;#fnref:17&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
        </item><item>
            <title>我的 LLM 知己，與我懸置的寫作</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2025/09/satisfactory-llm/</link>
            <pubDate>Mon, 08 Sep 2025 15:53:48 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2025/09/satisfactory-llm/</guid>
            <description>&lt;p&gt;最近我比較忙碌，但空閒之餘，文字仍然是我的棲息地。每天早上 8:30 開始上課，到晚上 9:00 結束晚自習，有時甚至「加班」到 10:00 回家，連續四十一天的課程。考慮到我的精神狀況，如此強度，回來再玩 osu! 一類的遊戲是絕無可能，甚至連推一小節 Galgame 都無能為力。&lt;/p&gt;&#xA;&lt;p&gt;唯一比較現實的事情，是找 LLM（大語言模型）小敍。&lt;/p&gt;&#xA;&lt;p&gt;十分慚愧，雖然我有一個部落格，但我的觀點、理念（倒不如説是「想法」）從來都沒有被我係統性的表達出來。我也曾想過，可能這些過於廣泛乃至分散的觀點之集合，是很難以平實的敍事表達出來的。為此我也嘗試了一些方法，比如：以一個隨機的事件作為截面，將我想要表達的一團亂麻「切開」，進而描繪出它的內部構造。&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;這些方法始終無法讓我暢快的表達出自己的心聲，也不是信手拈來，想寫就寫，然而部落格終歸還是給大家看的，在寫不出來的時候，也就只能寫寫簡單的技術部落格，吸引一些搜尋引擎流量。&lt;/p&gt;&#xA;&lt;p&gt;而 LLM 的出現卻改變了這一點，我所有的想法，都可以相對私密的得到即時的回應。為什麼我這麼久沒有寫部落格？累自然是一大因素，而 LLM 滿足我相當可觀的表達和被認可的需求，還無需自我審查的特點，沖淡了我這段時間裏寫部落格的想法。&lt;/p&gt;&#xA;&lt;p&gt;撰寫長篇的文字對大腦有益，這是毋庸置疑的。LLM 的出現，對於我撰寫長篇文字的影響，大概和微部落格出現時，對人們撰寫長篇文字的能力之影響相仿，甚至有過之而無不及——微部落格讓人習慣於碎片化表達和即時反饋，削弱了構建複雜論證和長篇敍事的能力。LLM 則更進一步，它不僅提供了表達的渠道，還直接提供了情緒價值和「知己」的替代品：發在社羣媒體上的內容，涉及隱私或者爭議，或者不必要曝光，釋出者多多少少會斟酌一番；而 LLM 就不一樣了，發給 API 的內容，最壞的情況不過是被拿去訓練模型，而不是讓 Sam Altman 第二天就找到你家門口——只要不是銀行卡密碼這種級別的資訊，不提及真實姓名，那些時政評論、心理諮詢等等，你只管放心把大模型當成一個知己便好（當然，在這種場景下，國產大模型狗都不用）。每一句牢騷都能得到確切認真的，宛若知己般的回應和肯定，這種待遇，恐怕沒有第二個地方能給了。&lt;/p&gt;&#xA;&lt;p&gt;當一個工具能如此完美地模擬「知己」時，我們可能會放棄去尋找真正的知己，或者放棄成為一個能獨立思考、自我整合的個體。寫下這些文字，是一個小結，也是一次反思。LLM 本身只是一個技術，用得好裨益無窮，用得不好自然也可能造成嚴重的後果。紐約時報的報導「&lt;a class=&#34;link&#34; href=&#34;https://archive.is/ALVeI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Chatbots Can Go Into a Delusional Spiral. Here’s How It Happens.&lt;/a&gt;」便是一個很好的例子，雖然 OpenAI 已經着手解決旗下模型「阿諛奉承」的問題，我也需要知道，即使我可以把大模型當做自己的知己，並從它那裏得到所謂的「理解和肯定」，我也不能一直活在這種感覺裏。OpenAI 與 MIT（美國麻省理工學院）的研究發現, ChatGPT 的使用量與用戶的孤獨感成正相關。用戶使用 ChatGPT 越多，他們就越感到孤獨。&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;我也可以説，正是因為越孤獨，才越會去使用這些 LLM，形成一個惡性迴圈。LLM 可以作為生活的調味劑，但絕不能成為心靈的唯一依靠。&lt;/p&gt;&#xA;&lt;p&gt;(To Be Continued)&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.l3zc.com/2024/06/the-worst-way-to-spend-a-day/&#34; &gt;The Worst Way To Spend A Day&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.engadget.com/ai/joint-studies-from-openai-and-mit-found-links-between-loneliness-and-chatgpt-use-193537421.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Joint studies from OpenAI and MIT found links between loneliness and ChatGPT use&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
        </item><item>
            <title>拋棄所謂「客户端」，直接使用 Mihomo 核心</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2025/07/switch-to-pure-mihomo-kernel/</link>
            <pubDate>Thu, 03 Jul 2025 10:30:00 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2025/07/switch-to-pure-mihomo-kernel/</guid>
            <description>&lt;img src=&#34;https://blog.l3zc.com/2025/07/switch-to-pure-mihomo-kernel/cover_hu_1a93b6f26c22bbfe.webp&#34; alt=&#34;Featured image of post 拋棄所謂「客户端」，直接使用 Mihomo 核心&#34; /&gt;&lt;p&gt;自從開始使用 Clash/Mihomo，我和大多數人一樣選擇了基於其核心的圖形化客户端——圖方便。實際上，這些 Mihomo 客户端本質上都差不多：核心都是同一個，他們主要負責提供一個易用的介面、管理配置檔案、訂閲更新，以及 GUI 下的系統代理設定。基於這一點，我認為判斷一個 Mihomo 客户端優劣的關鍵，便是看它的「覆寫」功能做得如何。每一個透過客户端下載或者訂閲的配置檔案，都會經過一系列「覆寫」過程，比如更換 &lt;code&gt;mixed-port&lt;/code&gt;、新增 &lt;code&gt;sniffer&lt;/code&gt; 配置等，最後生成用於啓動 Mihomo 核心的最終配置。&lt;/p&gt;&#xA;&lt;p&gt;然而，並非所有客户端都能勝任這一核心工作。比如 ShellCrash，其覆寫功能經常莫名其妙出岔子，説到底還是實現得太粗糙。如果連覆蓋和修改配置都做不好，這種客户端實在難稱合格。&lt;/p&gt;&#xA;&lt;p&gt;與其依賴這些&lt;del&gt;屎一樣的&lt;/del&gt;不盡如人意的 Mihomo 客户端，不如自己動手，直接自己編寫、管理配置檔案交給核心啓動，而不是依賴「黑箱」一般的各種「客户端」，不僅更純淨、更穩定，而且更可控。&lt;/p&gt;&#xA;&lt;h2 id=&#34;需要的預備知識&#34;&gt;需要的預備知識&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;基本的 Linux 操作&lt;/li&gt;&#xA;&lt;li&gt;知道如何使用 CLI 編輯器，如 nano&lt;/li&gt;&#xA;&lt;li&gt;已經搭建 Substore（可選）&lt;/li&gt;&#xA;&lt;li&gt;預設使用 root 用戶操作，非 root 用戶請自行注意提權&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;安裝-mihomo-核心&#34;&gt;安裝 Mihomo 核心&#xA;&lt;/h2&gt;&lt;p&gt;對於基於 Debian 的分支，可以使用預編譯的&lt;code&gt;.deb&lt;/code&gt;包安裝，對於其他使用&lt;code&gt;systemd&lt;/code&gt;的系統，下載&lt;a class=&#34;link&#34; href=&#34;https://github.com/MetaCubeX/mihomo/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;編譯好的二進位制檔案&lt;/a&gt;，重新命名為&lt;code&gt;mihomo&lt;/code&gt;，放到&lt;code&gt;/usr/local/bin&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;curl -o /usr/local/bin/mihomo &lt;下載連結&gt;&#xA;chmod +x /usr/local/bin/mihomo&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後新建&lt;code&gt;/etc/systemd/system/mihomo.service&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-systemd&#34;&gt;[Unit]&#xA;Description=mihomo Daemon, Another Clash Kernel.&#xA;After=network.target NetworkManager.service systemd-networkd.service iwd.service&#xA;&#xA;[Service]&#xA;Type=simple&#xA;LimitNPROC=500&#xA;LimitNOFILE=1000000&#xA;CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE&#xA;AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE&#xA;Restart=always&#xA;ExecStartPre=/usr/bin/sleep 1s&#xA;ExecStart=/usr/local/bin/mihomo -d /etc/mihomo&#xA;ExecReload=/bin/kill -HUP $MAINPID&#xA;&#xA;[Install]&#xA;WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用&lt;code&gt;systemctl daemon-reload&lt;/code&gt;重新載入&lt;code&gt;systemd&lt;/code&gt;，此時還沒有配置檔案，不能直接啓動核心，但可以使用&lt;code&gt;systemctl enable mihomo&lt;/code&gt;讓核心開機自啓，方便後續使用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;配置檔案&#34;&gt;配置檔案&#xA;&lt;/h2&gt;&lt;p&gt;核心啓動時會載入&lt;code&gt;/etc/mihomo/config.yaml&lt;/code&gt;，沒有了黑箱一樣的礙事「客户端」，配置檔案可以隨心所欲的定製。部分機場會下發完整的配置檔案，直接用&lt;code&gt;curl&lt;/code&gt;下載即可。&lt;/p&gt;&#xA;&lt;p&gt;對於訂閲的管理，我目前使用 Substore，我之前分享過&lt;a class=&#34;link&#34; href=&#34;https://blog.l3zc.com/2025/03/clash-subscription-convert/&#34; &gt;「最速 Substore 訂閲管理指南」&lt;/a&gt;，可以直接蔘考這篇文章來定製自己的訂閲。為了實現純核心啓動，現在我的 Substore &lt;a class=&#34;link&#34; href=&#34;https://github.com/powerfullz/override-rules/blob/main/convert.js&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;JS 格式覆寫&lt;/a&gt;已經加入了&lt;code&gt;full&lt;/code&gt;引數，可以生成完整的配置檔案，包括各種埠設定、統一延遲和外部控制器等，開箱即用。&lt;/p&gt;&#xA;&lt;p&gt;在 Substore 配置完成以後便可以下載配置檔案並啓動核心：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;sudo curl -o /etc/mihomo/config.yaml 配置檔案連結&#xA;sudo systemctl start mihomo&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;自定義覆寫&#34;&gt;自定義覆寫&#xA;&lt;/h3&gt;&lt;p&gt;我的配置檔案不能滿足你的所有需求？沒問題！你可以自己新增覆寫，想要什麼加什麼。&lt;/p&gt;&#xA;&lt;p&gt;我用過各種覆寫規則，後來也開始自己從零開始編寫覆寫規則，即使使用自己的覆寫規則能滿足 99% 的場景，但有極個別的域名還是會在規則中有遺漏，更不用説用別人寫的覆寫規則了。這些遺漏的規則大多是形如我伺服器的非標準埠 SSH 的前置代理等相對隱私的規則，直接上傳到 Github 公開顯然不太合適，那麼在自定義規則的基礎上再新增覆寫就成了唯一的選擇。&lt;/p&gt;&#xA;&lt;p&gt;好在 Substore 可以新增多個指令碼操作，只需要在生成配置檔案時額外新增一個指令碼操作就能解決我們的問題。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;function main(config) {&#xA;  config[&#34;rules&#34;].unshift(&#34;DOMAIN-SUFFIX,xxx,DIRECT&#34;)&#xA;  return config&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;需要注意的是覆寫&lt;code&gt;rules&lt;/code&gt;時必須要使用&lt;code&gt;.unshift()&lt;/code&gt;放在最前面，而不是用&lt;code&gt;.push()&lt;/code&gt;放到最後面，因為放在&lt;code&gt;MATCH&lt;/code&gt;後面的規則是永遠都匹配不到的。&lt;/p&gt;&#xA;&lt;h3 id=&#34;自定義配置檔案&#34;&gt;自定義配置檔案&#xA;&lt;/h3&gt;&lt;p&gt;完全不喜歡我的覆寫規則？不會用/不喜歡用 Substore？沒問題！你也可以蔘考 &lt;a class=&#34;link&#34; href=&#34;https://wiki.metacubex.one/config/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Mihomo 文件&lt;/a&gt;，自己從頭開始手搓配置檔案：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;mode: rule&#xA;mixed-port: 7890&#xA;redir-port: 7892&#xA;tproxy-port: 7893&#xA;allow-lan: true&#xA;log-level: info&#xA;ipv6: true&#xA;external-controller: 127.0.0.1:8000&#xA;# secret: yoursecret&#xA;unified-delay: true&#xA;routing-mark: 7894&#xA;tcp-concurrent: true&#xA;disable-keep-alive: true # 推薦在給移動裝置代理時啓用，可以解決待機異常耗電的問題&#xA;&#xA;dns:&#xA;  # 你的 DNS 配置&#xA;&#xA;sniffer:&#xA;  # 你的域名嗅探配置&#xA;&#xA;geodata-mode: true&#xA;geox-url:&#xA;  # 自定義 Geodata 檔案 URL&#xA;&#xA;proxy-providers:&#xA;  # 你的機場訂閲&#xA;&#xA;rule-providers:&#xA;  # 外部規則&#xA;&#xA;rules:&#xA;  # 分流規則&#xA;&#xA;proxy-groups:&#xA;  # 自定義代理分組&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;管理面板&#34;&gt;管理面板&#xA;&lt;/h2&gt;&lt;p&gt;管理面板可以根據個人喜好選擇，以 Zashboard 為例，我在使用 mihomo 自帶的&lt;code&gt;external-ui&lt;/code&gt;時遇到了一些莫名其妙的問題，所以乾脆直接執行一個 Docker 容器，畢竟這東西就真的只是一個 Web 面板，只要確保核心 API 使用 HTTP 時，Web 面板也使用 HTTP 即可，如果此時 Web 面板使用 HTTPS，則會因為 CORS 策略問題無法連線。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;$ mkdir zashboard &amp;&amp; cd zashboard&#xA;$ nano compose.yml&#xA;$ docker compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;compose.yml&lt;/code&gt;內容：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;services:&#xA;  zashboard:&#xA;    image: ghcr.io/zephyruso/zashboard:latest&#xA;    ports:&#xA;      - &#34;8899:80&#34;&#xA;    restart: &#34;unless-stopped&#34;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;自動維護&#34;&gt;自動維護&#xA;&lt;/h2&gt;&lt;p&gt;核心已經執行起來，自動更新訂閲這種功能怎麼實現？&lt;/p&gt;&#xA;&lt;p&gt;答曰：自行編寫一個 Shell 指令碼，配合 Crontab 即可實現自動更新訂閲的功能。例如我希望每天凌晨 3 點自動更新訂閲並重啓服務，遂編寫&lt;code&gt;/etc/mihomo/auto_update.sh&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;#!/bin/bash&#xA;&#xA;# === 配置資訊 ===&#xA;CONFIG_URL=&#34;&#34;&#xA;CONFIG_PATH=&#34;/etc/mihomo/config.yaml&#34;&#xA;BACKUP_DIR=&#34;/etc/mihomo&#34;&#xA;BACKUP_PREFIX=&#34;config.yaml&#34;&#xA;MAX_BACKUPS=7&#xA;TMP_PATH=&#34;/tmp/config.yaml.tmp&#34;&#xA;LOG_FILE=&#34;/var/log/mihomo_update.log&#34;&#xA;&#xA;# === 日誌 ===&#xA;log() {&#xA;    echo &#34;$(date &#39;+%F %T&#39;) $1&#34; | tee -a &#34;$LOG_FILE&#34;&#xA;}&#xA;&#xA;# === 備份現有配置，並自動清理舊備份 ===&#xA;backup_config() {&#xA;    if [ -f &#34;$CONFIG_PATH&#34; ]; then&#xA;        backup_file=&#34;$BACKUP_DIR/${BACKUP_PREFIX}.$(date &#39;+%Y%m%d_%H%M%S&#39;).bak&#34;&#xA;        cp &#34;$CONFIG_PATH&#34; &#34;$backup_file&#34;&#xA;        log &#34;配置檔案已備份到 $backup_file&#34;&#xA;        # 清理多餘的備份，只保留最新的 $MAX_BACKUPS 個&#xA;        old_backups=$(ls -1t $BACKUP_DIR/${BACKUP_PREFIX}.*.bak 2&gt;/dev/null | tail -n +$(($MAX_BACKUPS+1)))&#xA;        for f in $old_backups; do&#xA;            rm -f &#34;$f&#34; &amp;&amp; log &#34;已刪除舊備份 $f&#34;&#xA;        done&#xA;    else&#xA;        log &#34;未找到現有配置檔案，無需備份&#34;&#xA;    fi&#xA;}&#xA;&#xA;# === 下載新配置 ===&#xA;download_config() {&#xA;    log &#34;開始下載新配置...&#34;&#xA;    curl -fsSL -o &#34;$TMP_PATH&#34; &#34;$CONFIG_URL&#34;&#xA;    if [ $? -ne 0 ]; then&#xA;        log &#34;下載配置失敗，請檢查網絡或地址&#34;&#xA;        return 1&#xA;    fi&#xA;    # 基本校驗：檢測檔案體積&#xA;    if [ ! -s &#34;$TMP_PATH&#34; ]; then&#xA;        log &#34;下載檔案為空，停止更新&#34;&#xA;        return 2&#xA;    fi&#xA;    log &#34;配置下載完成&#34;&#xA;    return 0&#xA;}&#xA;&#xA;# === 更新配置檔案 ===&#xA;replace_config() {&#xA;    mv &#34;$TMP_PATH&#34; &#34;$CONFIG_PATH&#34;&#xA;    log &#34;配置檔案已更新&#34;&#xA;}&#xA;&#xA;# === 重啓 mihomo 服務 ===&#xA;restart_service() {&#xA;    systemctl restart mihomo&#xA;    if [ $? -eq 0 ]; then&#xA;        log &#34;mihomo 服務已重啓&#34;&#xA;    else&#xA;        log &#34;mihomo 服務重啓失敗，請手動檢查&#34;&#xA;    fi&#xA;}&#xA;&#xA;main() {&#xA;    backup_config&#xA;&#xA;    download_config&#xA;    DL_STATUS=$?&#xA;    if [ &#34;$DL_STATUS&#34; -ne 0 ]; then&#xA;        log &#34;操作終止：配置檔案未更新，保留原有配置&#34;&#xA;        exit 1&#xA;    fi&#xA;&#xA;    replace_config&#xA;&#xA;    restart_service&#xA;&#xA;    log &#34;=== 更新流程完成 ===&#34;&#xA;}&#xA;&#xA;main &#34;$@&#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用&lt;code&gt;crontab -e&lt;/code&gt;編輯 Crontab，設定如下 Crontab 即可在每天凌晨三點自動更新配置：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-crontab&#34;&gt;0 3 * * * /etc/mihomo/update_config.sh&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;防火牆&#34;&gt;防火牆&#xA;&lt;/h2&gt;&lt;p&gt;手動配置防火牆把流量劫持到 Mihomo 核心其實並不是什麼難事，我之前在「&lt;a class=&#34;link&#34; href=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/#%E5%9C%A8-exit-node-%E5%8A%AB%E6%8C%81%E6%B5%81%E9%87%8F&#34; &gt;從入門到進階：Tailscale + ShellCrash 異地組網和科學上網&lt;/a&gt;」（以下簡稱「Tailscale 那篇文章」中的兩個小節中提到過具體的操作方法，這裏只提操作，不做解説。&lt;/p&gt;&#xA;&lt;p&gt;根據我的情況，我需要把&lt;code&gt;tailscale0&lt;/code&gt;上的網絡卡的所有流量劫持到 Mihomo 核心，其它的情況（例如本機代理）操作也大同小異。如果只是想劫持 TCP 流量，那麼用&lt;code&gt;iptables&lt;/code&gt;的 REDIRECT 功能已經足夠，但若還想劫持 UDP、QUIC 等流量，則必須用到 Tproxy。&lt;strong&gt;最後，不要忘了 IPV6。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;以下是我的防火牆配置：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;# 建立自定義鏈&#xA;iptables -t mangle -N MIHOMO&#xA;&#xA;# 根據自己的需要忽略本地流量&#xA;iptables -t mangle -A MIHOMO -d 127.0.0.1/8 -j RETURN&#xA;iptables -t mangle -A MIHOMO -d 100.64.0.0/10 -j RETURN&#xA;iptables -t mangle -A MIHOMO -d 192.168.1.0/24 -j RETURN&#xA;iptables -t mangle -A MIHOMO -d 172.17.0.0/16 -j RETURN&#xA;&#xA;# mark UDP 和 TCP 到代理&#xA;iptables -t mangle -A MIHOMO -p tcp -j TPROXY --on-port 7893 --tproxy-mark 233&#xA;iptables -t mangle -A MIHOMO -p udp -j TPROXY --on-port 7893 --tproxy-mark 233&#xA;&#xA;# 介面跳轉&#xA;iptables -t mangle -A PREROUTING -i tailscale0 -j MIHOMO&#xA;&#xA;# 路由表配置&#xA;echo &#34;233 mihomo&#34; | tee -a /etc/iproute2/rt_tables&#xA;ip rule add fwmark 233 lookup mihomo&#xA;ip route add local 0.0.0.0/0 dev lo table mihomo&#xA;&#xA;# IPv6&#xA;# 建立鏈&#xA;ip6tables -t mangle -N MIHOMO6&#xA;&#xA;# 跳過本地地址&#xA;ip6tables -t mangle -A MIHOMO6 -d ::1/128 -j RETURN&#xA;ip6tables -t mangle -A MIHOMO6 -d fd7a:115c:a1e0::/48 -j RETURN&#xA;&#xA;# 標記 TCP/UDP&#xA;ip6tables -t mangle -A MIHOMO6 -i tailscale0 -p tcp -j TPROXY --on-port 7893 --tproxy-mark 233&#xA;ip6tables -t mangle -A MIHOMO6 -i tailscale0 -p udp -j TPROXY --on-port 7893 --tproxy-mark 233&#xA;&#xA;# 介面跳轉&#xA;ip6tables -t mangle -A PREROUTING -i tailscale0 -j MIHOMO6&#xA;&#xA;# 路由表配置&#xA;echo &#34;233 mihomo&#34; | tee -a /etc/iproute2/rt_tables&#xA;ip -6 rule add fwmark 233 lookup mihomo&#xA;ip -6 route add local ::/0 dev lo table mihomo&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;大多數系統預設不會儲存防火牆規則，關於規則持久化的內容我已經分別在 Tailscale 那篇文章的「&lt;a class=&#34;link&#34; href=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/#%E8%B7%AF%E7%94%B1%E8%A7%84%E5%88%99%E6%8C%81%E4%B9%85%E5%8C%96&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;路由規則持久化&lt;/a&gt;」和「&lt;a class=&#34;link&#34; href=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/#iptables-%E8%A7%84%E5%88%99%E6%8C%81%E4%B9%85%E5%8C%96&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;iptables 規則持久化&lt;/a&gt;」兩小節做了詳細説明，直接蔘考即可。&lt;/p&gt;&#xA;&lt;h3 id=&#34;本機代理怎麼配置&#34;&gt;本機代理怎麼配置？&#xA;&lt;/h3&gt;&lt;p&gt;大多數代理軟件預設的配置（其實就是 ShellCrash 的預設配置）是 REDIRECT，用它也基本能滿足大多數需求，REDIRECT 的示例如下：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;# IPv4 劫持 eth0&#xA;iptables -t nat -A PREROUTING -i eth0 -p tcp -j REDIRECT --to-ports 7892&#xA;&#xA;# IPv6 劫持 eth0&#xA;ip6tables -t nat -A PREROUTING -i eth0 -p tcp -j REDIRECT --to-ports 7892&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中 7892 要和 Mihomo 配置中的&lt;code&gt;redir-port&lt;/code&gt;一致，&lt;code&gt;eth0&lt;/code&gt;就是想要劫持的 Interface，相比 Tproxy 那可真是簡單太多了。&lt;/p&gt;&#xA;&lt;p&gt;實際上我個人並不喜歡用把本機所有流量都劫持到防火牆，我更喜歡在需要時直接透過環境變數、&lt;code&gt;proxy-chains&lt;/code&gt;和各種軟件自帶的代理配置把流量指向 Mihomo 核心，例如想讓 Docker 走代理，則可以直接編輯 Docker 的&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;來指定代理，而不是直接一股腦把網絡卡上的所有流量都劫持到代理：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{&#xA;  &#34;proxies&#34;: {&#xA;    &#34;http-proxy&#34;: &#34;http://127.0.0.1:7890&#34;,&#xA;    &#34;https-proxy&#34;: &#34;http://127.0.0.1:7890&#34;,&#xA;    &#34;no-proxy&#34;: &#34;127.0.0.0/8&#34;&#xA;  }&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;這麼折騰何必呢用客户端不香嗎&#34;&gt;這麼折騰，何必呢？用客户端不香嗎？&#xA;&lt;/h2&gt;&lt;p&gt;別問，問就是玩虛空終端玩的。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>世界蠢得超乎想象：淺談 BNPL</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2025/06/on-buy-now-pay-later/</link>
            <pubDate>Thu, 05 Jun 2025 11:54:56 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2025/06/on-buy-now-pay-later/</guid>
            <description>&lt;img src=&#34;https://blog.l3zc.com/2025/06/on-buy-now-pay-later/mobile-payments-1920x720_hu_4cbcee30d76215b2.webp&#34; alt=&#34;Featured image of post 世界蠢得超乎想象：淺談 BNPL&#34; /&gt;&lt;p&gt;看到「Americans using &amp;ldquo;buy now, pay later&amp;rdquo; plans to buy groceries, survey finds」這種新聞上了頭條，我的第一反應是：這不是很正常嗎？看完報導以後，我不得不感嘆：這世界比我預想的還蠢得多。&lt;/p&gt;&#xA;&lt;p&gt;先買後付（Buy Now, Pay Later；以下簡稱 BNPL）作為一種金融創新，確實有其魅力。它允許消費者即時獲得商品或服務，隨後分期付款，近年來在電商、旅遊、餐飲等領域風靡一時。&lt;/p&gt;&#xA;&lt;p&gt;然而，天上不會掉餡餅。羊毛出在羊身上，BNPL 服務商要盈利，主要靠兩點：向商家收取高於傳統支付方式的手續費，以及向消費者徵收逾期違約金。其本質，是利用了「花錢痛感最小化」的心理陷阱——減輕即時支付的麻煩和痛苦感，從而刺激消費意願。這正是商家甘願支付更高手續費也要接入 BNPL 的關鍵原因。&lt;/p&gt;&#xA;&lt;p&gt;我並不反感 BNPL，自己就是深度用戶。 我的手機是用京東白條24期免息分期買的，現在剛還到第六期；日常消費幾乎都走花唄，還款日自動從餘額寶或銀行卡扣除。當 BNPL 平台提供真正的免息分期或「零手續費」優惠時，這就是免費槓桿——佔用外部資金零成本週轉。花小錢辦大事：消費由金融機構墊付，自有資金得以留存，若其間能進行理財生息，資金效率便實現了最大化。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;但這有三個至關重要的前提：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;準時還款，絕不逾期；&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;杜絕習慣性透支的惡習；&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;具備基本的財務管理能力。&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;反觀登上新聞的 &lt;strong&gt;「美國人用 BNPL 買日雜」&lt;/strong&gt; ，我掃了眼調查資料——&lt;strong&gt;三分之一的BNPL用戶至少逾期過一次？？甚至有人連點外賣的錢都還不上？？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;理想豐滿，現實骨感。資料顯示，&lt;strong&gt;不知「如何管好錢袋子」的人遠比想象中多。&lt;/strong&gt; 46%的BNPL用戶同時揹負信用卡欠款，其中28%的用戶年齡在18-24歲之間&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;。這類羣體通常信用評級不高，63%甚至從多個BNPL平台同時借款&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;——這強烈暗示相當一部分人消費習慣堪憂。&lt;/p&gt;&#xA;&lt;p&gt;更值得警惕的是，BNPL的設計似乎先天就對消費習慣不佳者更具誘惑力。相比信用卡，它審批極快、信用門檻低，還常打着「分期免息」的旗號。在這些人眼中，BNPL宛如一個「取之不竭的金庫」，只需支付首期小錢就能抱回心儀之物——世上哪有這等「美事」？&lt;/p&gt;&#xA;&lt;p&gt;於是乎，當還款日賬單洶湧而至，他們才驚覺自己竟欠下如此鉅款。逾期、違約接踵而來。而這些滾雪球式的違約金疊加高額商户手續費，難怪BNPL服務商賺得盆滿缽滿。&lt;/p&gt;&#xA;&lt;p&gt;我重申立場：我不反對 BNPL，其作為「免費槓桿」的價值毋庸置疑。以我自身經歷為例，購買 4299 元的手機時，雖完全有能力全額支付，卻仍選擇了 24 期免息分期。但關鍵在於清晰的財務認知：我必須得意識到自己是全額預支了 4299 元，而非每月僅消費了 177.5 元。這筆支出會即時從資產賬面扣除，確保淨資產真實反映負債。量入為出，量力而行——絕不透支支付能力，更拒絕疊加槓桿盲目消費。即便資金暫時存放於銀行或購買低風險理財產品，產生的微薄收益也能錦上添花，並從根本上杜絕違約可能。誠然，適度的超前消費能提升生活幸福感。但在缺乏穩定收入的階段，穩健的財務習慣無疑更為安全可靠。&lt;/p&gt;&#xA;&lt;p&gt;説了這麼多，恐怕也還是攔不住那些消費習慣根深蒂固的人。即使沒有 BNPL 的便捷誘惑，他們也大機率會刷爆信用卡，在 20% 的高息漩渦裏掙扎求生。&lt;/p&gt;&#xA;&lt;p&gt;問題不在於 BNPL 本身（它不過是金融工具的一種），而在於脆弱財務基礎與過度消費慾望之間的根本性失衡。對於那些缺乏自控力、對財務風險麻木或生活本身就捉襟見肘的人來説，任何方便獲取的信貸渠道——無論是信用卡、BNPL，乃至更危險的發薪日貸款（Payday Loan）——都不過是通向債務深淵的不同路徑罷了。BNPL 的特殊性可能只是在於其更低的准入門檻和更強的即時滿足感，讓下沉的速度更快，悲劇來得更早一些。&lt;/p&gt;&#xA;&lt;p&gt;BNPL 的逾期者中，很大比例本身就揹負着卡債。這意味着他們可能只是在拆東牆補西牆，陷入一個利率疊加、罰金滾動的無底洞。就算今天取締了所有 BNPL，那些在懸崖邊跳舞的消費者，明天一樣會在發薪日貸款或是別的什麼「便捷金融」上栽跟頭，然後為了救眼前的火燒眉毛，甚至可能連祖宗十八代的骨灰盒都要拿去典當了。&lt;/p&gt;&#xA;&lt;p&gt;所以，更值得警惕的並非某一種金融產品，而是龐大羣體面臨的結構性困境：經濟壓力、消費主義裹挾、金融知識匱乏、以及深植於其中的 「即時滿足大於長遠規劃」 的行為模式。BNPL 的出現和普及，只是讓這個長期存在的病灶，以更尖鋭、更顯眼的方式爆發了出來。&lt;/p&gt;&#xA;&lt;p&gt;歸根結底，想真正「救」這些人，光靠圍堵金融產品（BNPL或信用卡）是治標不治本。解鈴還須繫鈴人——要麼能徹底「戒癮」，要麼就得從提升收入、普及財商、重構消費觀這些更艱難的「基礎設施」入手。而這，恐怕比指望BNPL公司不做生意要難太多了。&lt;/p&gt;&#xA;&lt;p&gt;最後一句忠告：借錢梗要還，咪俾錢中介。&lt;/p&gt;&#xA;&lt;p&gt;哎，説到底——這世界，真比我預想的還要蠢得多。&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;資料來源：&lt;a class=&#34;link&#34; href=&#34;https://archive.is/T3vGo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;CFPB Research Reveals Heavy Buy Now, Pay Later Use Among Borrowers with High Credit Balances and Multiple Pay-in-Four Loans&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;資料來源：&lt;a class=&#34;link&#34; href=&#34;https://archive.is/6HVCl&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Buy now, pay later users pile on debt, CFPB finds&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;封面圖片來自：https://www.visa.com.tw/pay-with-visa/featured-technologies/mobile-payments.html&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
        </item><item>
            <title>機械革命極光 X Pro 簡評</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2025/05/new-laptop-briefing/</link>
            <pubDate>Sun, 04 May 2025 15:18:43 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2025/05/new-laptop-briefing/</guid>
            <description>&lt;img src=&#34;https://blog.l3zc.com/2025/05/new-laptop-briefing/DSCF0267_hu_9e18f49bd8ce081.webp&#34; alt=&#34;Featured image of post 機械革命極光 X Pro 簡評&#34; /&gt;&lt;h2 id=&#34;開箱即糟心&#34;&gt;開箱即糟心&#xA;&lt;/h2&gt;&lt;p&gt;對於機械革命極光 X Pro，從下單那一瞬間開始我還有點期待，然而快遞沒趕上我去香港的行程，等回家拆箱時已經沒了新鮮感。想加裝硬碟又遇到滑絲的 M.2 螺絲，最後用電工膠布勉強固定，新電腦的好感度當場扣光一半。&lt;/p&gt;&#xA;&lt;h2 id=&#34;配置和價格&#34;&gt;配置和價格&#xA;&lt;/h2&gt;&lt;p&gt;i9-14900HX + RTX 5070 Ti，國補後 8699 元的價格還算合理。對於 Peripherals，簡而言之，我連神舟都用得很開心，那還有什麼是不能用的呢。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;屏幕&lt;/strong&gt;：2560x1600@300Hz，100% SRGB 色域，色準表現不錯，玩《天際線 2》時堵車尾燈的紅都比現實更鮮豔些。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;鍵盤&lt;/strong&gt;：鍵程偏短，手感一般，反正大部分時候都在用外接鍵盤，對之無感。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;無線網絡卡&lt;/strong&gt;：AX201 未免太寒酸了，天線設計似乎不太好，在路由器旁邊都能明顯感覺到速度相比有線嚴重不足。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;硬碟&lt;/strong&gt;：自帶致鈦 1TB 速度一般，我自己加的英睿達 2TB 才是主力。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;電池&lt;/strong&gt;：80Wh 的電池對於遊戲本來説可以用來應急，平時我都開着工作站模式，延長電池壽命。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;獨顯直連&lt;/strong&gt;：支援熱切換這點好評，再也不用重啓切換了。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;BIOS&lt;/strong&gt;：AMI 的 BIOS 比之前的好用太多。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;使用體驗&#34;&gt;使用體驗&#xA;&lt;/h2&gt;&lt;p&gt;《都市：天際線 2》——十二萬人口時模擬速度還能保持在 3 倍速，雖然這時候風扇噪音已經起飛了。《賽博朋克 2077》可以開光追超級檔，《極限競速：地平線5》可以開最高畫質。但是他們實際上的遊戲體驗，恕我直言，我感覺不到和之前的 RTX 3060 有什麼本質上的區別，無非就是這裏的反射更加真實，那裏的細節更加豐富。單憑畫質上的提升，恐怕我依然不會在這幾個已經陪我度過超過一百小時的遊戲上再花更多精力。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/05/new-laptop-briefing/image_hu_8774b59db0175e9a.webp&#34; alt=&#34;城市天際線2的模擬速度&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/05/new-laptop-briefing/image-1_hu_47a3feef604ad189.webp&#34; alt=&#34;説實話，我感覺不到任何區別&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/05/new-laptop-briefing/DSCF0267_hu_9e18f49bd8ce081.webp&#34; alt=&#34;它只是在那裏，像塊不會説話的磚&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;C 面類膚塗層手感確實好，不過接上外設後基本只摸得到外接鍵盤。Nahimic 音效延遲嚴重，關掉之後打 osu! 反而更跟手，屬於負最佳化典型。&lt;/p&gt;&#xA;&lt;h2 id=&#34;工具的意義&#34;&gt;工具的意義&#xA;&lt;/h2&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/05/new-laptop-briefing/DSCF0273_hu_e62683739afe024c.webp&#34; alt=&#34;換上新電腦後的桌面&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;這台電腦用了兩個星期，沒有驚喜，也沒有驚嚇。無線網絡卡太垃圾所以只好用有線，狂暴模式風扇噪音很大，南橋沒散熱所以温度很高，除此之外——它就是台該亮時亮、該響時響的機器。&lt;/p&gt;&#xA;&lt;p&gt;可能好的工具本該如此：當我寫到這裏才發現，自己已經盯着屏幕右下角的電池圖示發了五分鐘呆，而它只是安靜地保持着 98% 的電量，像塊不會説話的磚。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>從入門到進階：Tailscale &#43; ShellCrash 異地組網和科學上網</title>
            <link>https://blog.l3zc.com/zh-hant-hk/2025/04/tailscale-setup-recap/</link>
            <pubDate>Mon, 14 Apr 2025 10:10:25 +0000</pubDate>
            <guid>https://blog.l3zc.com/zh-hant-hk/2025/04/tailscale-setup-recap/</guid>
            <description>&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/tailscale_hu_62168b00e213c4a1.webp&#34; alt=&#34;Featured image of post 從入門到進階：Tailscale + ShellCrash 異地組網和科學上網&#34; /&gt;&lt;p&gt;在幾次旅途中，我試圖將新拍的照片上傳到長沙家中的 Immich 伺服器。過去我用 Cloudflare Tunnel 做反代，但由於國內特殊的網絡環境，連線慢速、頻繁中斷、上傳失敗幾乎成了常態。後來我開始嘗試 Tailscale —— 一個基於 WireGuard 的內網穿透工具，它終於讓我在全國各地都能穩定、高速地訪問家中的 NAS 和照片庫。&lt;/p&gt;&#xA;&lt;p&gt;但新的問題也隨之而來：Tailscale 在 Android 手機上執行時，需要作為 VPN 服務接管系統流量，而我平時使用的 Clash 同樣依賴 VPN 介面進行分流。由於 Android 系統限制（只能啓用一個 VPN 服務），兩者無法共存，導致我必須在「訪問家中服務」和「科學上網」之間二選一。&lt;/p&gt;&#xA;&lt;p&gt;這篇文章從 Tailscale 的原理講起，到自建 DERP 伺服器最佳化連線質量，再到如何用 iptables 劫持 Tailscale Exit Node 的流量並轉發給 ShellCrash，實現流量的靈活轉發與安全穿透。無論你是想訪問家庭區域網上的 NAS、照片庫，還是希望在陌生網絡中保護自己的資料安全，這篇文章都能為你提供一套實用、穩定的解決方案。&lt;/p&gt;&#xA;&lt;h2 id=&#34;什麼是-tailscale&#34;&gt;什麼是 Tailscale&#xA;&lt;/h2&gt;&lt;p&gt;Tailscale 是一款基於 WireGuard 協議的零配置虛擬區域網工具，它能夠讓分佈在不同網絡環境中的裝置像處於同一個安全內網中一樣互聯互通。透過自動穿透 NAT、防火牆等網絡障礙，Tailscale 讓你無需公網 IP、無需埠轉發，也能輕鬆訪問家中的 NAS、個人伺服器、開發環境等內網資源。它的核心優勢在於簡單、安全、穩定，啓動即用，資料傳輸全程加密，適合個人開發者、遠端辦公者、家庭用戶等多種場景使用。&lt;/p&gt;&#xA;&lt;p&gt;Tailscale 的技術實現非常巧妙：其構建在 WireGuard 加密協議之上，卻顛覆了傳統 VPN 的 IP 分配邏輯。每個裝置透過 SSO/OAuth2 完成身份認證後，會獲得一個終身繫結的節點金鑰。這種基於身份的組網模式，讓「長沙的 NAS」和「香港的手機」在虛擬網絡中如同辦公室同事般直接對話。&lt;/p&gt;&#xA;&lt;h2 id=&#34;tailscale-的連線過程原理&#34;&gt;Tailscale 的連線過程原理&#xA;&lt;/h2&gt;&lt;h3 id=&#34;中心控制伺服器control-server&#34;&gt;中心控制伺服器（Control Server）&#xA;&lt;/h3&gt;&lt;p&gt;每個 Tailscale 客户端在啓動後，首先會連線控制伺服器（controlplane），進行身份驗證，並拉取整個網絡中其他節點的資訊，包括每台裝置的公網 IP、埠、NAT 型別等。這一步相當於是「認識朋友」。&lt;/p&gt;&#xA;&lt;p&gt;Tailscale 的控制伺服器不會轉發任何資料，只負責協調連線 —— 類似一個排程中心。&lt;/p&gt;&#xA;&lt;h3 id=&#34;derp-伺服器&#34;&gt;DERP 伺服器&#xA;&lt;/h3&gt;&lt;p&gt;説到 Tailscale 能保持高連線成功率的關鍵，就不得不提到 Tailscale 自研的中轉協議 DERP，在 Tailscale 的網絡架構裏，DERP（Designated Encrypted Relay for Packets）是一個很重要但通常只在必要時介入的元件。簡單來説，它就是一個基於 HTTP 的加密中繼伺服器，用來在兩台裝置無法直接通訊時，作為它們之間的「中轉站」。&lt;/p&gt;&#xA;&lt;p&gt;所有客户端之間的連線都是先選擇 DERP 模式（中繼模式），這意味着連線立即就能建立，用戶無需等待。然後連線雙方開始並行地進行路徑發現，通常幾秒鐘之後，Tailscale 就能發現一條更優路徑，然後將現有連線透明升級（upgrade）過去，變成點對點連線（直連）。&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;需要注意的是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;所有透過 DERP 的資料都是端到端加密的，DERP 伺服器無法檢視內容；&lt;/li&gt;&#xA;&lt;li&gt;Tailscale 會盡可能少地使用 DERP，一旦直連建立成功，就會自動切換過去；&lt;/li&gt;&#xA;&lt;li&gt;官方部署了多個分散式 DERP 節點，客户端會自動選擇延遲最低的那個；&lt;/li&gt;&#xA;&lt;li&gt;你也可以自建 DERP 節點（比如在國內），來解決延遲高或連線不穩定的問題。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;可以把 DERP 理解為一個兜底機制，雖然效能不如直連，但確保了即便不能打洞成功，裝置之間也始終能保持連線。&lt;/p&gt;&#xA;&lt;h3 id=&#34;nat-穿透nat-traversal&#34;&gt;NAT 穿透（NAT Traversal）&#xA;&lt;/h3&gt;&lt;p&gt;拿到對端的地址資訊後，Tailscale 會嘗試透過 NAT 穿透來建立點對點（P2P）連線。這個過程使用了 STUN 協議，雙方互相傳送探測包，嘗試在 NAT 路由器上打出一條直連的通道。如果雙方的網絡條件允許，就可以成功建立起一個 UDP 的直連隧道，資料走直連，速度快、延遲低。&lt;/p&gt;&#xA;&lt;p&gt;受制於篇幅，我無法完整細緻的講述 NAT 穿透的原理，若對這部分感興趣，可以閲讀 Tailscale 官方的「&lt;a class=&#34;link&#34; href=&#34;https://tailscale.com/blog/how-nat-traversal-works&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;How NAT traversal works&lt;/a&gt;」一文。&lt;/p&gt;&#xA;&lt;h3 id=&#34;完整連線流程圖示&#34;&gt;完整連線流程圖示&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-mermaid&#34;&gt;flowchart TD&#xA;    A[裝置 A 啓動 Tailscale] --&gt; B[透過 DERP 伺服器建立初始連線]&#xA;    B --&gt; C[交換網絡資訊和 WireGuard 金鑰]&#xA;    C --&gt; D[雙方並行進行 NAT 型別探測]&#xA;    D --&gt; E{能否直連？}&#xA;    E -- 是 --&gt; F[建立 P2P 直連隧道]&#xA;    F --&gt; G[定期檢測連線質量]&#xA;    G --&gt; H{直連優於 DERP？}&#xA;    H -- 是 --&gt; I[切換大部分流量至直連通道]&#xA;    H -- 否 --&gt; J[繼續透過 DERP 轉發部分或全部流量]&#xA;    E -- 否 --&gt; J&#xA;&#xA;    style B fill:#e3f2fd,stroke:#2196f3,color:#000&#xA;    style F fill:#e8f5e9,stroke:#4caf50,color:#000&#xA;    style J fill:#fff3e0,stroke:#ff9800,color:#000&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;自建-derp&#34;&gt;自建 DERP&#xA;&lt;/h2&gt;&lt;p&gt;Tailscale 的安裝在各個平台上都相對簡單，官方文件已經提供了詳細的操作指南。本文將不再贅述安裝過程，以下內容預設你已經在相關裝置上成功安裝並登入了 Tailscale。&lt;/p&gt;&#xA;&lt;h3 id=&#34;為什麼要自建-derp&#34;&gt;為什麼要自建 DERP？&#xA;&lt;/h3&gt;&lt;p&gt;Tailscale 在全球部署了眾多 DERP &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;中繼伺服器，用於在打洞失敗時接管流量中轉。但由於眾所周知的原因，中國大陸並沒有官方部署的 DERP 節點。這意味着：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一旦 NAT 打洞失敗，所有流量都必須繞行海外的 DERP 節點，延遲高、速度慢，體驗極差；&lt;/li&gt;&#xA;&lt;li&gt;某些官方 DERP 節點容易被 GFW 干擾，可能出現連線中斷、握手失敗等問題；&lt;/li&gt;&#xA;&lt;li&gt;即使打洞成功，Tailscale 仍需透過 DERP 交換路由資訊和 WireGuard 金鑰，如果 DERP 不可達，連線質量也會受到影響。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;因此，在國內網絡環境下，自建一個本地 DERP 節點，不僅可以顯著提高連線穩定性和傳輸效能，還能規避部分網絡封鎖所帶來的不可預期問題，是一個非常值得做的最佳化。&lt;/p&gt;&#xA;&lt;h3 id=&#34;準備工作&#34;&gt;準備工作&#xA;&lt;/h3&gt;&lt;p&gt;前面提到，DERP 是基於 HTTP 的，所以你需要準備好一個 HTTP 反代服務，並自行解決 SSL 證書的簽發等基礎問題。本文使用 Docker 部署，在部署開始之前，你需要在你的伺服器上裝好 Docker 以及 Docker Compose 等附加元件。為了編輯配置檔案，你當然也得知道如何使用 nano 之類的編輯器。為了最好的效果，你的伺服器最好擁有靜態公網 IPv4+IPv6 雙棧地址。&lt;/p&gt;&#xA;&lt;p&gt;如果以上條件都具備，就可以開始部署了。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;mkdir tailscale-derp &amp;&amp; cd tailscale-derp&#xA;nano docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;docker-composeyml&#34;&gt;docker-compose.yml&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;services:&#xA;  derper:&#xA;    name: tailscale-derp&#xA;    image: fredliang/derper&#xA;    environment:&#xA;      - DERP_DOMAIN=derp.nightcity.pub&#xA;      - DERP_VERIFY_CLIENTS=true&#xA;      - DERP_ADDR=:4433&#xA;    network_mode: host&#xA;    restart: unless-stopped&#xA;    volumes:&#xA;      - &#34;/var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock&#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;network_mode: host&lt;/code&gt;是一個關鍵配置，表示容器將共享宿主機的網絡棧。如果使用 Docker 預設的 bridge 網絡模式，容器的網絡會經過 Docker 內網轉發，會造成 DERP 的 STUN 服務識別到 Docker &lt;code&gt;172.17.0.0/16&lt;/code&gt;網段下的地址，而&#xA;無法識別到客户端正確的外網地址，導致 Tailscale 客户端無法正確連線。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;volumes:&#xA;  - &#34;/var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock&#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;前面提到所有透過 DERP 的資料都是端到端加密的，DERP 並不知道是誰在使用，這意味着如果不採取措施，任何知道你 DERP 伺服器地址和埠號的人都可以使用它。這條配置的作用是掛載宿主機的 Tailscale 套接字檔案到容器內，目的是允許 derper 服務透過 Tailscale 的 tailscaled 服務進行身份驗證。配合&lt;code&gt;DERP_VERIFY_CLIENTS=true&lt;/code&gt;，可以防止你的 DERP 節點被他人白嫖。&lt;/p&gt;&#xA;&lt;p&gt;需要注意的是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;宿主機必須已經安裝並登陸 Tailscale 客户端（tailscaled），否則這個檔案不存在，容器會報錯；&lt;/li&gt;&#xA;&lt;li&gt;tailscaled 必須以 root 許可權執行，才能建立這個 sock 檔案。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;反向代理&#34;&gt;反向代理&#xA;&lt;/h3&gt;&lt;p&gt;以 Caddy 為例，需要反向代理 4433 埠，併為其部署 SSL 證書。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-caddyfile&#34;&gt;{&#xA;        email webmaster@l3zc.com&#xA;}&#xA;&#xA;*.l3zc.com {&#xA;        encode gzip&#xA;&#xA;        tls {&#xA;                dns dnspod APP_ID,APP_KEY&#xA;                resolvers 119.29.29.29 223.5.5.5&#xA;        }&#xA;&#xA;        @derp host derp.l3zc.com&#xA;        reverse_proxy @derp :4433&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;需要注意的是，如果你和我一樣使用 Caddy 配合 dnsproviders 申請泛域名證書，Tailscale 的 MagicDNS 可能會導致 Caddy 本地證書驗證失敗而報錯，需要手動指定&lt;code&gt;resolvers&lt;/code&gt;引數解決。&lt;/p&gt;&#xA;&lt;p&gt;訪問剛剛反代的節點，如果出現以下頁面，説明配置正確。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/image_hu_8846b1a6f5d79837.webp&#34; alt=&#34;DERP 搭建成功&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;配置-acl-策略&#34;&gt;配置 ACL 策略&#xA;&lt;/h3&gt;&lt;p&gt;開啓 Tailscale 控制枱的「&lt;a class=&#34;link&#34; href=&#34;https://login.tailscale.com/admin/acls/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Access Controls&lt;/a&gt;」頁面配置 ACL 策略，將配置好的 DERP 加上。&lt;/p&gt;&#xA;&lt;p&gt;Tailscale 的 ACL 策略是用 HuJSON&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; 寫的，想要在 VSCode 中編輯，選擇語言為「JSON with Comments（jsonc）」即可。以下是一個配置示例：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-jsonc&#34;&gt;{&#xA;  &#34;acls&#34;: [{ &#34;action&#34;: &#34;accept&#34;, &#34;src&#34;: [&#34;*&#34;], &#34;dst&#34;: [&#34;*:*&#34;] }],&#xA;  &#34;ssh&#34;: [&#xA;    {&#xA;      &#34;action&#34;: &#34;check&#34;,&#xA;      &#34;src&#34;: [&#34;autogroup:member&#34;],&#xA;      &#34;dst&#34;: [&#34;autogroup:self&#34;],&#xA;      &#34;users&#34;: [&#34;autogroup:nonroot&#34;, &#34;root&#34;]&#xA;    }&#xA;  ],&#xA;&#xA;  // 自建 DERP 配置&#xA;  &#34;derpMap&#34;: {&#xA;    &#34;OmitDefaultRegions&#34;: false, // 改為 true 以排除官方 DERP&#xA;    &#34;Regions&#34;: {&#xA;      &#34;900&#34;: {&#xA;        &#34;RegionID&#34;: 900,&#xA;        &#34;RegionCode&#34;: &#34;sha&#34;,&#xA;        &#34;RegionName&#34;: &#34;Shanghai&#34;,&#xA;        &#34;Nodes&#34;: [&#xA;          {&#xA;            &#34;Name&#34;: &#34;myderp&#34;,&#xA;            &#34;RegionID&#34;: 900,&#xA;            &#34;HostName&#34;: &#34;derp.l3zc.com&#34;&#xA;          }&#xA;        ]&#xA;      }&#xA;    }&#xA;  }&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tailscale 保留&lt;code&gt;RegionID&lt;/code&gt;中的 1-899 作為官方節點，自建節點的 RegionID 必須大於等於 900。&lt;/p&gt;&#xA;&lt;h3 id=&#34;測試連線&#34;&gt;測試連線&#xA;&lt;/h3&gt;&lt;p&gt;配置好 ACL 並儲存，Tailscale 會自動為所有客户端同步配置，稍等片刻在客户端用&lt;code&gt;tailscale netcheck&lt;/code&gt;測試連線。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/image-1_hu_25ccc2304c1a66fd.webp&#34; alt=&#34;用 tailscale netcheck 測試連線&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;需要注意返回的 IP 是否是自己真實的公網 IP，若返回了&lt;code&gt;172.17.0.0/16&lt;/code&gt;網段的地址，説明你 Docker 部分配置錯了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;與科學上網並存在-exit-node-劫持流量到-clash-核心&#34;&gt;與科學上網並存：在 Exit Node 劫持流量到 Clash 核心&#xA;&lt;/h2&gt;&lt;h3 id=&#34;宣告-exit-node&#34;&gt;宣告 Exit Node&#xA;&lt;/h3&gt;&lt;p&gt;在家中準備一個 24 小時開機的裝置，可以是樹莓派，可以是 MacMini。在上面安裝 Tailscale 並將其宣告為 Exit Node，並根據需要在 Tailscale 內網宣告家庭內網網段，隨後在控制枱啓用這個裝置作為 Exit Node，你就獲得了一個免費的 VPN，可以讓你在陌生的網絡環境中保持安全。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;sudo tailscale up --advertise-exit-node --advertise-routes 192.168.1.0/24&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/image-2_hu_bac8de7f1a5258d0.webp&#34; alt=&#34;找到 Route Settings&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/Snipaste_2025-04-13_21-20-09_hu_d8313f59e1940d09.webp&#34; alt=&#34;啓用相關設定&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;廣播完成後，無論身處何地，只要能連上 Tailscale 網絡，就能訪問家中所有的內網裝置。&lt;/p&gt;&#xA;&lt;h3 id=&#34;啓用-ip-轉發和禁用-udp-gro&#34;&gt;啓用 IP 轉發和禁用 UDP GRO&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&#xA;&lt;/h3&gt;&lt;p&gt;啓用 IP 轉發是樹莓派等裝置作為 Exit Node 所必須的配置，這裏以樹莓派為例，如果你使用其他裝置，請自行查閲 Tailscale 官網教程。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;echo &#39;net.ipv4.ip_forward = 1&#39; | sudo tee -a /etc/sysctl.d/99-tailscale.conf&#xA;echo &#39;net.ipv6.conf.all.forwarding = 1&#39; | sudo tee -a /etc/sysctl.d/99-tailscale.conf&#xA;sudo sysctl -p /etc/sysctl.d/99-tailscale.conf&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;根據 Tailscale 官方的説法&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;，禁用 UDP GRO&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt; 可以提升轉發效能，但官方的持久化教程似乎在樹莓派上無效，好在我們可以手動配置。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;# 安裝 ethtool&#xA;sudo apt update &amp;&amp; sudo apt install ethtool -y&#xA;&#xA;# 關閉 UDP GRO&#xA;sudo ethtool -K eth0 gro off&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;針對持久化的問題手動編寫 systemd 配置檔案：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;# 建立服務檔案&#xA;sudo nano /etc/systemd/system/ethtool.service&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;檔案內容如下：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-systemd&#34;&gt;[Unit]&#xA;Description=Configure eth0 GRO&#xA;After=network.target&#xA;&#xA;[Service]&#xA;Type=oneshot&#xA;ExecStart=/sbin/ethtool -K eth0 gro off&#xA;&#xA;[Install]&#xA;WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;隨後啓動服務：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;sudo systemctl daemon-reload&#xA;sudo systemctl enable ethtool&#xA;sudo systemctl start ethtool&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;在-exit-node-劫持流量&#34;&gt;在 Exit Node 劫持流量&#xA;&lt;/h3&gt;&lt;p&gt;我的 Exit Node 是一台樹莓派，在樹莓派上配置好 Exit Node 之後就來到了最後一步，也就是劫持手機傳送到 Exit Node 上的流量，實現科學上網。出於穩定性原因，我不希望在家庭主路由上直接執行代理軟件，為了實現這一點，直接在樹莓派上劫持流量是唯一的選擇。&lt;/p&gt;&#xA;&lt;p&gt;首先安裝 ShellCrash，請自行根據你的需要匯入配置檔案、配置自動任務等：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;export url=&#39;https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@master&#39; &amp;&amp; wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh  &amp;&amp; bash /tmp/install.sh &amp;&amp; source /etc/profile &amp;&gt; /dev/null&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;隨後啓動服務，修改修改防火牆執行模式為純淨模式，我個人建議將 SNI 嗅探開啓，並將 DNS 模式從&lt;code&gt;fake-ip&lt;/code&gt;切換為&lt;code&gt;redir-host&lt;/code&gt;&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;，同時啓用 IPv6 透明代理。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/image-5_hu_9e9d06f0578b4304.webp&#34; alt=&#34;修改防火牆劫持範圍&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/image-3_hu_efcbb45f4cd30701.webp&#34; alt=&#34;啓用域名嗅探&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/image-6_hu_d681ee087b8dd14a.webp&#34; alt=&#34;修改埠設定&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;設定純淨模式的目的是手動配置 iptables 以實現更精準的流量劫持。我們直接用 iptables 劫持所有 tailscale 網絡卡作為 Exit Node 轉發的流量，首先用&lt;code&gt;ifconfig&lt;/code&gt;檢視 tailscale 網絡卡的名稱，預設情況下一般為 Tailscale 0：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;root@raspberrypi:~# ifconfig&#xA;eth0: ......&#xA;&#xA;tailscale0: flags=4305&lt;UP,POINTOPOINT,RUNNING,NOARP,MULTICAST&gt;  mtu 1280&#xA;        inet 100.111.19.50  netmask 255.255.255.255  destination 100.111.19.50&#xA;        inet6 fd7a:115c:a1e0::3d01:1332  prefixlen 128  scopeid 0x0&lt;global&gt;&#xA;        inet6 fe80::c0d5:1a1b:2005:48eb  prefixlen 64  scopeid 0x20&lt;link&gt;&#xA;        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)&#xA;        RX packets 6780155  bytes 958732442 (914.3 MiB)&#xA;        RX errors 0  dropped 0  overruns 0  frame 0&#xA;        TX packets 4811113  bytes 10858316472 (10.1 GiB)&#xA;        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;劫持&lt;code&gt;tailscale0&lt;/code&gt;網絡卡的所有流量到本地 Clash 核心監聽埠&lt;code&gt;7892&lt;/code&gt;，這個設定在 ShellCrash 中叫做「靜態路由埠」。以及，如果你不想和我一樣遇到莫名其妙的網絡問題，就一定不要忘記劫持 IPv6。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;# IPv4 劫持 tailscale0&#xA;iptables -t nat -A PREROUTING -i tailscale0 -p tcp -j REDIRECT --to-ports 7892&#xA;&#xA;# IPv6 劫持 tailscale0&#xA;ip6tables -t nat -A PREROUTING -i tailscale0 -p tcp -j REDIRECT --to-ports 7892&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;進階用-tproxy-劫持-udp-流量&#34;&gt;進階：用 TProxy 劫持 UDP 流量&#xA;&lt;/h3&gt;&lt;p&gt;iptables 的 REDIRECT 只能重定向 TCP 流量，UDP 沒有連線狀態（無連線協議），所以 REDIRECT 無法保留目標地址，導致透明代理無法知道原始目標地址。&lt;/p&gt;&#xA;&lt;p&gt;所以，如果你用如下方式劫持 UDP 流量：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;iptables -t nat -A PREROUTING -i tailscale0 -p udp -j REDIRECT --to-ports 7892&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;則這個規則不會生效或代理行為不正常。&lt;/p&gt;&#xA;&lt;p&gt;那麼，有辦法代理 UDP 流量嗎？有的兄弟，有的。但前提是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;核心支援 UDP 透明代理（Clash Premium 和 Mihomo 都支援）；&lt;/li&gt;&#xA;&lt;li&gt;使用 TProxy 模式，而不是 REDIRECT；&lt;/li&gt;&#xA;&lt;li&gt;正確配置了 iptables mangle 表和 policy routing；&lt;/li&gt;&#xA;&lt;li&gt;代理配置檔案中啓用了 UDP 代理（如 mode: rule + udp: true）。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;假設你已經滿足第一條、第二條和最後一條，則以下是一個示例&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt;：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;# 建立自定義鏈&#xA;sudo iptables -t mangle -N SHELLCRASH&#xA;&#xA;# 根據自己的需要忽略本地流量&#xA;sudo iptables -t mangle -A SHELLCRASH -d 127.0.0.1/8 -j RETURN&#xA;sudo iptables -t mangle -A SHELLCRASH -d 100.64.0.0/10 -j RETURN&#xA;sudo iptables -t mangle -A SHELLCRASH -d 192.168.1.0/24 -j RETURN&#xA;sudo iptables -t mangle -A SHELLCRASH -d 172.17.0.0/16 -j RETURN&#xA;&#xA;# mark UDP 和 TCP 到代理&#xA;sudo iptables -t mangle -A SHELLCRASH -p tcp -j TPROXY --on-port 7893 --tproxy-mark 233&#xA;sudo iptables -t mangle -A SHELLCRASH -p udp -j TPROXY --on-port 7893 --tproxy-mark 233&#xA;&#xA;# 介面跳轉&#xA;sudo iptables -t mangle -A PREROUTING -i tailscale0 -j SHELLCRASH&#xA;&#xA;# 路由表配置&#xA;echo &#34;233 shellcrash&#34; | sudo tee -a /etc/iproute2/rt_tables&#xA;sudo ip rule add fwmark 233 lookup shellcrash&#xA;sudo ip route add local 0.0.0.0/0 dev lo table shellcrash&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;當然，不要忘記 IPv6：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;# 建立鏈&#xA;sudo ip6tables -t mangle -N SHELLCRASH6&#xA;&#xA;# 跳過本地地址&#xA;sudo ip6tables -t mangle -A SHELLCRASH6 -d ::1/128 -j RETURN&#xA;sudo ip6tables -t mangle -A SHELLCRASH6 -d fd7a:115c:a1e0::/48 -j RETURN&#xA;&#xA;# 標記 TCP/UDP&#xA;ip6tables -t mangle -A SHELLCRASH6 -i tailscale0 -p tcp -j TPROXY --on-port 7893 --tproxy-mark 233&#xA;ip6tables -t mangle -A SHELLCRASH6 -i tailscale0 -p udp -j TPROXY --on-port 7893 --tproxy-mark 233&#xA;&#xA;# 介面跳轉&#xA;sudo ip6tables -t mangle -A PREROUTING -i tailscale0 -j SHELLCRASH6&#xA;&#xA;# 路由表配置&#xA;echo &#34;233 shellcrash&#34; | sudo tee -a /etc/iproute2/rt_tables&#xA;sudo ip -6 rule add fwmark 233 lookup shellcrash&#xA;sudo ip -6 route add local ::/0 dev lo table shellcrash&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;路由規則持久化&#34;&gt;路由規則持久化&#xA;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;ip rule&lt;/code&gt;和&lt;code&gt;ip route&lt;/code&gt;建立的規則在重啓後會丟失，所以需要我們手動持久化，最簡單直接的方法就是建立一個指令碼，並將其新增至 crontab。&lt;/p&gt;&#xA;&lt;p&gt;建立一個指令碼：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;sudo nano /usr/local/bin/policy-route.sh&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;編輯為如下內容：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/bash&#xA;&#xA;# IPv4 策略路由&#xA;ip rule add fwmark 233 lookup 233&#xA;ip route add local 0.0.0.0/0 dev lo table 233&#xA;&#xA;# IPv6 策略路由&#xA;ip -6 rule add fwmark 233 lookup 233&#xA;ip -6 route add local ::/0 dev lo table 233&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;授予執行許可權後編輯 Crontab：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;sudo chmod +x /usr/local/bin/policy-route.sh&#xA;sudo crontab -e&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在 crontab 檔案底部加上如下內容：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-crontab&#34;&gt;@reboot /usr/local/bin/policy-route.sh&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;原理解釋tproxy-到底是怎麼轉發-udp-流量的&#34;&gt;原理解釋：TProxy 到底是怎麼轉發 UDP 流量的？&#xA;&lt;/h3&gt;&lt;p&gt;如果你看到這裏，也許會產生疑惑：為什麼整個流程中，我們沒有在 iptables 裏寫&lt;code&gt;--to-ports&lt;/code&gt;，也沒看到目標地址被改寫，UDP 流量就莫名其妙地被代理了？這是怎麼做到的？&lt;/p&gt;&#xA;&lt;p&gt;要解釋這個問題，我們先來看 TProxy 和 REDIRECT 的根本區別：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;REDIRECT 模式：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用 iptables nat 表；&lt;/li&gt;&#xA;&lt;li&gt;將目標地址改寫為本地地址（比如 127.0.0.1:7892）；&lt;/li&gt;&#xA;&lt;li&gt;通常用於 TCP 流量；&lt;/li&gt;&#xA;&lt;li&gt;不能保留真實目標地址；&lt;/li&gt;&#xA;&lt;li&gt;需要指定&lt;code&gt;--to-ports&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-mermaid&#34;&gt;flowchart TB&#xA;    A[客户端裝置&lt;br&gt;透過 Tailscale 發起 TCP 請求]&#xA;    B[tailscale0 介面接收流量]&#xA;    C[iptables NAT PREROUTING&lt;br&gt;REDIRECT --to-ports 7892]&#xA;    D[ShellCrash 本地監聽&lt;br&gt;127.0.0.1:7892]&#xA;    E[ShellCrash 發起新 TCP 請求&lt;br&gt;→ 目標伺服器]&#xA;    F[響應從網絡返回&lt;br&gt;ShellCrash 轉發響應]&#xA;    G[響應回到客户端裝置]&#xA;&#xA;    A --&gt; B --&gt; C --&gt; D --&gt; E --&gt; F --&gt; G&#xA;&#xA;    style C fill:#f9f,stroke:#aaa,stroke-width:1px,color:#000&#xA;    style D fill:#bbf,stroke:#aaa,stroke-width:1px,color:#000&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;TPROXY 模式：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用 iptables mangle 表；&lt;/li&gt;&#xA;&lt;li&gt;不修改目標 IP，而是保留原始目標地址；&lt;/li&gt;&#xA;&lt;li&gt;透過 fwmark 和 policy routing 將報文路由到 &lt;code&gt;lo&lt;/code&gt;；&lt;/li&gt;&#xA;&lt;li&gt;代理程式監聽一個特殊埠（例如 7893），並啓用 &lt;code&gt;IP_TRANSPARENT&lt;/code&gt;；&lt;/li&gt;&#xA;&lt;li&gt;支援 UDP 和 TCP；&lt;/li&gt;&#xA;&lt;li&gt;不需要 iptables 內指定 &lt;code&gt;--to-ports&lt;/code&gt;，因為不是 NAT，而是標記 + 路由。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-mermaid&#34;&gt;flowchart TB&#xA;    A[客户端裝置&lt;br&gt;透過 Tailscale 發起 TCP/UDP 請求]&#xA;    B[tailscale0 介面接收流量]&#xA;    C[iptables MANGLE PREROUTING&lt;br&gt;打上 fwmark 233]&#xA;    D[ip rule: fwmark 233&lt;br&gt;使用 routing table shellcrash]&#xA;    E[ip route: local 0.0.0.0/0&lt;br&gt;dev lo table shellcrash]&#xA;    F[ShellCrash 在 lo:7893 監聽&lt;br&gt;IP_TRANSPARENT 模式]&#xA;    G[ShellCrash 獲取原始目標地址&lt;br&gt;發起代理連線]&#xA;    H[響應從網絡返回&lt;br&gt;ShellCrash 轉發響應]&#xA;    I[響應回到客户端裝置]&#xA;&#xA;    A --&gt; B --&gt; C --&gt; D --&gt; E --&gt; F --&gt; G --&gt; H --&gt; I&#xA;&#xA;    style C fill:#f9f,stroke:#aaa,stroke-width:1px,color:#000&#xA;    style F fill:#bbf,stroke:#aaa,stroke-width:1px,color:#000&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;TProxy 不使用 DNAT/REDIRECT，而是透過 mangle 表給資料包打上 mark，然後透過 policy routing（&lt;code&gt;ip rule&lt;/code&gt; + &lt;code&gt;ip route&lt;/code&gt;）將這些資料包送到 &lt;code&gt;lo&lt;/code&gt; 介面。代理程式（如 Clash / ShellCrash）監聽在 &lt;code&gt;lo&lt;/code&gt;&lt;sup id=&#34;fnref:9&#34;&gt;&lt;a href=&#34;#fn:9&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;9&lt;/a&gt;&lt;/sup&gt; 上的埠（例如 7893），透過啓用 &lt;code&gt;IP_TRANSPARENT&lt;/code&gt; 選項，可以讀取資料包的原始目標 IP 和埠並進行代理轉發。&lt;/p&gt;&#xA;&lt;p&gt;簡而言之，TProxy 模式只需要：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;iptables&lt;/code&gt; 給資料包打上 mark；&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ip rule&lt;/code&gt; + &lt;code&gt;ip route&lt;/code&gt; 將這些包送到 &lt;code&gt;lo&lt;/code&gt;；&lt;/li&gt;&#xA;&lt;li&gt;程式監聽 &lt;code&gt;lo&lt;/code&gt; 上的埠並開啓 &lt;code&gt;IP_TRANSPARENT&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;所以不需要在 iptables 中指定 &lt;code&gt;--to-ports&lt;/code&gt;，因為目標 IP 和埠保持不變，代理程式自己可以感知並處理。&lt;/p&gt;&#xA;&lt;h3 id=&#34;iptables-規則持久化&#34;&gt;iptables 規則持久化&#xA;&lt;/h3&gt;&lt;p&gt;安裝&lt;code&gt;iptables-persistent&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;sudo apt update&#xA;sudo apt install iptables-persistent&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安裝過程中會提示你是否儲存當前的 IPv4 和 IPv6 配置，選擇「是」即可。之後如果你新增了新的規則，記得執行儲存命令：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;# 儲存當前 IPv4/IPv6 規則&#xA;sudo netfilter-persistent save&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;儲存後的規則檔案路徑：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;IPv4：&lt;code&gt;/etc/iptables/rules.v4&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;IPv6：&lt;code&gt;/etc/iptables/rules.v6&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;你也可以直接編輯上面的&lt;code&gt;rules.v4&lt;/code&gt;/&lt;code&gt;rules.v6&lt;/code&gt;檔案，按需修改。&lt;/p&gt;&#xA;&lt;h2 id=&#34;最終效果&#34;&gt;最終效果&#xA;&lt;/h2&gt;&lt;p&gt;&#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/Screenshot_2025-04-14-18-05-18-259_com.tailscale._hu_783d6158c36336e1.webp&#34; alt=&#34;基本都能打洞成功&#34; /&gt;&#xA; &#xA;&lt;img src=&#34;https://blog.l3zc.com/2025/04/tailscale-setup-recap/Screenshot_2025-04-14-18-04-45-053_com.cnspeedtes_hu_a47b6440dc775101.webp&#34; alt=&#34;速度尚可接受&#34; /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;這套方案的使用體驗取決於你家的上行頻寬，我家的網絡是下行 500M 上行 60M，目前沒有遇到一次打洞失敗的情況，所以基本都能跑滿，延遲也尚可接受，並且可以在外地隨時隨地端到端加密訪問家中的 Immich 和 OpenWRT 路由器等裝置以及實現科學上網，總體來看，我還算比較滿意。&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;蔘考: &lt;a class=&#34;link&#34; href=&#34;https://icloudnative.io/posts/custom-derp-servers/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://icloudnative.io/posts/custom-derp-servers/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;蔘考: &lt;a class=&#34;link&#34; href=&#34;https://tailscale.com/kb/1232/derp-servers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://tailscale.com/kb/1232/derp-servers&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;有關 HuJSON: &lt;a class=&#34;link&#34; href=&#34;https://github.com/tailscale/hujson&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/tailscale/hujson&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;蔘考： &lt;a class=&#34;link&#34; href=&#34;https://tailscale.com/kb/1408/quick-guide-exit-nodes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://tailscale.com/kb/1408/quick-guide-exit-nodes&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;蔘考: &lt;a class=&#34;link&#34; href=&#34;https://tailscale.com/kb/1320/performance-best-practices#linux-optimizations-for-subnet-routers-and-exit-nodes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://tailscale.com/kb/1320/performance-best-practices#linux-optimizations-for-subnet-routers-and-exit-nodes&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;UDP GRO（Generic Receive Offload）是 Linux 核心中的一種網絡最佳化技術，主要用於合併多個小資料包以提高處理效率。但在裝置作為網絡轉發節點的使用場景下，這可能會導致轉發延遲增加和高丟包率環境下的吞吐量下降。&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:7&#34;&gt;&#xA;&lt;p&gt;相較於&lt;code&gt;fake-ip&lt;/code&gt;，&lt;code&gt;redir-host&lt;/code&gt;相容性更好，出現問題的機率更低，也不會出現開關代理之後短時間內因為&lt;code&gt;fake-ip&lt;/code&gt;殘留而斷網的情況，所以一般情況下我建議使用&lt;code&gt;redir-host&lt;/code&gt;搭配 GeoSite 分流規則使用。我這台樹莓派的 DNS 上游是&lt;a class=&#34;link&#34; href=&#34;https://blog.l3zc.com/2025/02/what-i-have-done-on-my-dns/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;已經配置好的 SmartDNS&lt;/a&gt;，不存在 DNS 污染的問題，體驗良好。&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:8&#34;&gt;&#xA;&lt;p&gt;蔘考: &lt;a class=&#34;link&#34; href=&#34;https://blog.zonowry.com/posts/clash_iptables_tproxy/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://blog.zonowry.com/posts/clash_iptables_tproxy/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:9&#34;&gt;&#xA;&lt;p&gt;&lt;code&gt;lo&lt;/code&gt; 是 Linux 系統中預設的「迴環介面（Loopback Interface）」，在透明代理中，它不僅處理 localhost 流量，還被用來接收原本屬於外部世界的網絡連線，實現對外部流量的本地劫持和轉發。&amp;#160;&lt;a href=&#34;#fnref:9&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
        </item></channel>
</rss>
