
目前對外只有一個門牌:iron30.com,而 iron30.com 底下所有子網域都指向同一個位址(1.2.3.4)。當外面連進來,到底誰接手?答案是在門口放一個人,看每個請求要找哪個網域,再轉給內網對應的那台機器。這就是反向代理。它讓「一個對外位址」和「很多個網站」不再互相牴觸。
從這一篇開始,所有操作都不再回到那台實體 Proxmox上做,一律在上一篇建好的 hq 上進行。它是控制中心。既然要當控制中心,它得先知道機隊裡有什麼 —— 所以第一件事是建一份機器清冊。一張總表,加上每台機器一份自己的檔案:這台是什麼、怎麼連進去、跟誰有依賴、以及做過什麼的變更歷史。現在只有兩台,寫起來很快;等到二十幾台,你不會有力氣回頭補。
有個工作要先做:
把你會用到的網域名稱,設定好。如:
hq.iron30.com
llm.iron30.com
nas.iron30.com
www.iron30.com
mail.iron30.com
tts.iron30.com
stt.iron30.com
hermas.iron30.com
rag.iron30.com
remotion.iron30.com
....
都指向 1.2.3.4 這個固定IP。怎麼做? 請參考之前有關 DNS 那篇,用 cloudflare 的,就截圖問 AI。
這個要先做好,不然以後的都做不成。
現在來弄個網頁:
ssh 連線到 hq,192.168.0.20:22022
cd /opt/claud-working
claude,完成登錄。
告訴 claude code:
你現在在 hq,192.168.0.20。從今天起這台是控制中心,
之後所有機器都從這裡管,所以它要先知道機隊裡有什麼。
一、在 /opt/claude-working/ 底下建機器清冊:
1. machines.md —— 一張總表,一台一列:
名字、IP、SSH 埠、登入帳號、角色、建立日期、目前狀態。
2. machines/<名字>.md —— 每台一份自己的檔案:
- 這台是什麼、上面跑什麼
- 怎麼連進去(IP、SSH 埠、帳號)
- 它跟誰有依賴關係
- 變更歷史:日期 + 做了什麼
每次你動了某台機器,就在那台的檔案末尾補一筆,不要另外開新檔。
目前已經有的機器:
- gw,192.168.0.10,OpenWrt 路由器
- hq,192.168.0.20,控制中心
資料不足的欄位寫「未確認」,不要猜。
⛔ 密碼、金鑰一律禁止寫進這些檔案。
二、另外建一份 /opt/claude-working/secrets.md,密碼和金鑰放這裡:
- 一台一段,名字跟 machines.md 對得起來。
- 檔案權限設成只有擁有者讀得到。
- 建一份 .gitignore 把它排除掉,這個檔案永遠不進版控。
- 之後任何機器的密碼都寫進這裡,不要散落在別的文件。
三、在這台上跑一個最簡單的測試網頁,綁 8080 埠,只聽內網。
頁面上要印出這台的主機名稱、IP 和現在時間 ——
我等一下要靠「頁面上寫的是不是 hq」來確認代理有沒有打對機器。
做完告訴我從內網怎麼確認它活著。
跑完會跟你說:
瀏覽:http://192.168.0.20:8080 ,看一下,頁面會顯示主機名稱、IP 和現在時間。如果跑錯誤,截圖或複製錯誤訊息,貼給 claude code,叫它修。
這樣,以後,每次動了某台機器,就會在那台的檔案末尾補一筆:日期,做了什麼。
清冊裡寫位址、埠號、帳號,不寫密碼也不寫金鑰。這種檔案的宿命就是被複製、被備份、被貼進聊天視窗。連線資訊和登入憑證要分開放,沒有例外。所以密碼另外開一個檔案,權限設成只有自己讀得到,並且加進版控 (git)的排除清單 —— 永遠不進版控。這件事要在第一天就做對:等到清冊裡已經散了三個密碼,你再回頭想把它們抽出來,一定會漏掉一個,而漏掉的那個你不會知道是哪個。
反向代理設好之前,得先有一個能被指向的東西。所以先在控制中心上先跑一個最簡單的測試頁。關鍵是那個頁面要印出自己的主機名稱。等一下從外面連上來,看到頁面寫著控制中心的名字,才算證明請求有真正連到了正確的這台。如果它只回一句「成功」,你分不出它是不是打到別人家去了。驗證用的東西,要能告訴你它是誰。
再來是 SSL 憑證。
憑證是靠「對方連得到你」來驗證的:簽發單位會照著你的網域去連,連得到才發放憑證。所以網域指向必須先生效,再去申請。順序顛倒就失敗。所以,要先設定好網域名,先確認從外面查得到那個網域指向你的位址,再往下做。
路由器上只需要兩條轉發:網頁的兩個標準埠:80,443,都指向反向代理那一台。不要為了方便直接把後端機器的埠也開出去 —— 一旦開了,反向代理就被繞過,它上面設的所有規則都等於不存在。一個入口的價值,在於它真的是唯一的入口。
有網頁可以測試了,現在部署反向代理:
告訴 claude code
從 ubuntu-base 範本複製一台新機器:名字 npm,固定位址 192.168.0.11。
這台是反向代理。請照這個順序做,順序有相依:
1. 裝 Nginx Proxy Manager。
2. 去路由器 192.168.0.10 加兩條通訊埠轉發:80 和 443 都轉到 192.168.0.11。
那台的 LAN SSH 是留著的,你進得去。
⛔ 只開這兩條,禁止把後端機器的埠也轉出去。
3. 設一條代理:hq.iron30.com → 192.168.0.20:8080。
4. 幫 hq.iron30.com 申請免費憑證,而且要能自動續約。
⚠️ 這一步要等第 2 步做完才會過 —— 簽發單位是從外面連進來驗證的,
80 埠不通就一定失敗。
5. 強制轉到 https。
6. 沒有對應規則的請求,一律不要回應內容,不要露出預設歡迎頁。
規則:
- 整件事你做完,不要把步驟列給我叫我自己去點。
- 申請憑證前先自己確認 hq.iron30.com 從外面解得到 1.2.3.4,
解不到就停下來告訴我,不要硬申請。
- 動路由器會讓我斷線,改之前先跟我說一聲。
- 做完把連線資訊寫進這台虛擬機的 Proxmox 備註欄,
並且在 machines.md 和 machines/npm.md 補上這台。
- 另外建一份 /opt/claude-working/exposure.md,記「對外到底開了什麼」:
路由器上每一條通訊埠轉發、代理上每一條規則,
一條一列,寫下網域、後端是哪台的哪個埠、什麼時候加的、憑證到期日。
以後每加一條規則就補一列,砍掉就標記砍掉的日期,不要直接刪那一行。
反向代理預設會對「沒有對應規則」的請求,回一個歡迎頁。那等於對每一個網路爬蟲說:這裡有東西,而且有人在維護。設成什麼都不回應,少一個被盯上的理由。
代理規則清單跟防火牆轉發一樣會長草。時間一長,好幾條指向可能早就搬走或關掉了 —— 但是沒有人會通知你,它只會一直開著。把規則清單建成資產定期對帳,自動修改。不然,以後你要找 8090 是轉到哪一台,做甚麼,會浪費很多時間的。
安裝好之後,告訴 claude code:
幫我從「外面」驗證,不是從內網 curl 自己:
1. https://hq.iron30.com 打得開嗎?頁面上的主機名稱是不是 hq?
2. 憑證是誰簽的、到期日什麼時候、自動續約的排程真的在嗎?
3. 用 http 進來會不會轉到 https?
4. 直接用 IP 連 https://1.2.3.4 會看到什麼?應該什麼都不給。
5. 有沒有哪個埠是我沒打算開卻開著的?
⛔ 不要從內網那台機器測。封包會在路由器上繞回來,
你會得到一個假的通過。
玩玩看,你的 hq.iron30.com 可以從外面連進來看了。
最後一件事:憑證有到期日,而自動續約是會壞的。壞掉的時候沒有人會告訴你,直到你發現網站跳警告。所以「有沒有東西在計算到期日」和「有沒有設定自動續約」是兩件事,兩件都要做。計算的那部分,留到告警那一篇。
反向代理做好之後,新增一個網站不再是「去改防火牆」,而是「在清冊上加一列、在代理上加一條規則」。對外的邊界從此只有一個地方要看:NPM —— 這件事的價值不在省事,在於你終於說得出「我的系統,對外到底開了哪些服務。」
明天,我們來完善我們的控制中心。