主控台預設只聽 127.0.0.1:8092,也就是「只有這台主機自己連得到」。這是刻意的:管理介面直接掛在公網上,會變成別人可以慢慢猜的一扇門。
所以在別的電腦上打開它,要先決定走哪一條路。兩條路都不需要把 8092 開在防火牆上。
| SSH 通道 | 反向代理 | |
|---|---|---|
| 要改設定嗎 | 完全不用 | 要,而且要重新啟動服務 |
| 誰連得到 | 只有你,而且要有 SSH 權限 | 任何連得到那個網址的人 |
| 要準備什麼 | 一個 SSH 帳號 | 網域、憑證、Apache 或 nginx |
| 適合 | 偶爾看一下、自己一個人用 | 長期多人用、想用手機看 |
| 做錯的後果 | 連不上 | 管理介面被公開 |
⭐ 不確定的話選 SSH 通道。它每一次都要你先證明自己進得了這台主機,所以做錯的結果是「連不上」,不是「被別人連上」。
這個做法不改主機上的任何東西。它只是在 SSH 連線裡再開一條管道:你在自己電腦上連 127.0.0.1:8092,封包從 SSH 走過去,再從主機自己的 127.0.0.1 進主控台——對主控台來說,這就是一個本機連線。
ssh -L 8092:127.0.0.1:8092 你的帳號@你的主機位址
這個視窗保持開著,然後在瀏覽器打開:
http://127.0.0.1:8092
關掉視窗,通道就沒了。這正是它安全的地方:沒有東西被留下來。
換左邊那個數字就好,右邊不要動——右邊是主機上的埠:
ssh -L 18092:127.0.0.1:8092 你的帳號@你的主機位址
然後開 http://127.0.0.1:18092。
連線之前,左邊選 Connection → SSH → Tunnels:
8092127.0.0.1:8092沒有按 Add 的話設定不會生效,這是最常見的一個漏掉。
listen_addr = 0.0.0.0:8092——因為套件中心的「開啟」鈕要連得到它。也就是說 DSM 上的主控台本來就對整個區域網路開著。你在 DSM 上要做的通常不是「打開它」,而是決定要不要把它關小:在主控台系統設定頁的「主控台連線」選「只限本機」,或在主機上執行 svrguard console-listen lan 開放私有網段(拒絕所有來自網際網路的連線;設定頁會印出這台的完整指令)。選「只限本機」之後就只能走 SSH 通道或反向代理進去,而套件中心的「開啟」鈕會失效。svrguard service status。[web] 段的 listen_addr。如果它被改成某張網卡的位址(不是 127.0.0.1),-L 右邊要跟著改成同一個位址。http:// 不是 https://。通道本身已經被 SSH 加密了,主控台這一端沒有憑證。設定檔在哪一個路徑、怎麼改、改完怎麼重新啟動,都在設定那一頁。
要長期給好幾個人用、或想用手機看,就把主控台放在你自己的 Apache 或 nginx 後面,由它負責 HTTPS 與存取控制。
主控台這邊要改的只有一件事(甚至可以不改):
[web] listen_addr = 127.0.0.1:8092 ; 維持只聽本機,讓代理成為唯一入口 base_path = /agent ; 只有要掛在子路徑時才需要
掛在自己的子網域(https://guard.example.com/)就不要填 base_path。要跟別的東西共用一個網域、掛在 https://example.com/agent 底下,才填。
⚠️ 改完要重新啟動服務,設定檔只在啟動時讀一次。
<VirtualHost *:443>
ServerName guard.example.com
# 憑證設定省略
# 建議保留,理由在下面「來源位址是怎麼判斷的」
RequestHeader unset X-Forwarded-For
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8092/
ProxyPassReverse / http://127.0.0.1:8092/
</VirtualHost>
掛在子路徑時(設定檔要填 base_path = /agent)改成:
ProxyPass /agent http://127.0.0.1:8092/agent ProxyPassReverse /agent http://127.0.0.1:8092/agent
server {
listen 443 ssl;
server_name guard.example.com;
# 憑證設定省略
location / {
proxy_pass http://127.0.0.1:8092;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
# ⛔ $remote_addr,不是 $proxy_add_x_forwarded_for
proxy_set_header X-Forwarded-For $remote_addr;
}
}
主控台要講得出「誰登入的」,而它的登入鎖定是按來源位址算的:同一個位址 15 分鐘內錯 10 次就鎖住。所以「你是從哪裡來的」這件事不能讓來的人自己說了算。
它的判斷方式是兩段:
127.0.0.1:8092)⇒ 採信 X-Forwarded-For,而且只取最後一個。Apache 與 nginx 都是把它們真正看到的來源接在最後面,所以最後一個才是真的;外面的人自己填進來的會留在前面,不算數。X-Forwarded-For 完全不看,一律用連線本身的位址。上面兩段設定各有一行是建議保留的,它讓標頭乾淨、也讓多層代理時的結果可預期:
RequestHeader unset X-Forwarded-For。先把外面送來的清掉,mod_proxy 接著會自己填上它真正看到的來源。proxy_set_header X-Forwarded-For $remote_addr;。⚠️ 網路上到處抄得到的 $proxy_add_x_forwarded_for 的意思是「把外面送來的值保留、再接上真正的來源」——結果仍然是對的,但那個標頭裡會多出一段別人寫的東西,沒有必要。Secure 旗標會自動跟著 X-Forwarded-Proto 走,所以只要代理有送那個標頭就不必管它。要強制的話填 [web] cookie_secure = true。⚠️ 在還沒上 HTTPS 之前不要填 true,那會讓你登不進去(瀏覽器不會把 cookie 送回來)。在主機上執行:
ss -ltnp | grep 8092
看左邊那個位址:
127.0.0.1:8092 —— 只有本機連得到。這是你要的。0.0.0.0:8092 或 *:8092 —— 只要網路到得了這台主機的人都連得到。DSM 預設就是這樣;其他平台上看到它,表示有人改過 listen_addr。⭐ 光看設定檔不夠——設定檔寫的是「下次啟動會聽哪裡」,ss 看的是「現在真的聽在哪裡」。改完沒重新啟動,兩者就是不一樣的。