找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 0|回覆: 0

    反向代理的三種做法:NPM、Caddy、Traefik 怎麼選

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    家裡跑了 HA、NAS、Frigate、Grafana……
    每個都要記 IP 和通訊埠,而且都是 http 沒有憑證。

    反向代理就是解決這個的。



    反向代理在做什麼
    1. 沒有反向代理:
    2.   http://192.168.1.50:8123   ← HA
    3.   http://192.168.1.20:3000   ← Grafana
    4.   http://192.168.1.20:5000   ← Frigate
    5. 有反向代理:
    6.   https://ha.example.com
    7.   https://grafana.example.com
    8.   https://frigate.example.com
    9.   (全部指向同一台代理,由它轉給後面)
    複製代碼

    好處


    • 好記的網址
    • 統一的 HTTPS 憑證(Let's Encrypt 自動續簽)
    • 集中管理存取控制
    • 後端換 IP 或通訊埠,只要改代理的設定


    三個選擇

    一、Nginx Proxy Manager(NPM)


    • 有圖形介面,滑鼠點一點就設好
    • 基於 nginx
    • 內建 Let's Encrypt 申請和續簽
    • 有存取清單(Access List)可以做基本的權限控制


    適合:不想碰設定檔、服務數量不多(十個以內)、想快速上手。
    1. services:
    2.   npm:
    3.     image: jc21/nginx-proxy-manager:latest
    4.     restart: unless-stopped
    5.     ports:
    6.       - "80:80"
    7.       - "443:443"
    8.       - "81:81"        # 管理介面
    9.     volumes:
    10.       - ./data:/data
    11.       - ./letsencrypt:/etc/letsencrypt
    複製代碼

    起來之後到 http://你的IP:81
    預設帳號 admin@example.com / 密碼 changeme
    第一次登入一定要改掉)。

    二、Caddy


    • 設定檔極簡,而且自動處理 HTTPS(不用任何額外設定)
    • 純文字設定,方便版控
    • 效能好、記憶體佔用小


    Caddyfile 長這樣
    1. ha.example.com {
    2.     reverse_proxy 192.168.1.50:8123
    3. }
    4. grafana.example.com {
    5.     reverse_proxy 192.168.1.20:3000
    6. }
    7. frigate.example.com {
    8.     reverse_proxy 192.168.1.20:5000
    9.     basicauth {
    10.         charles $2a$14$...雜湊過的密碼...
    11.     }
    12. }
    複製代碼

    就這樣。憑證它自己會去申請、自己續簽。

    這是 Caddy 最大的賣點 —— 其他工具都要設定 ACME,Caddy 是預設行為。
    1. services:
    2.   caddy:
    3.     image: caddy:latest
    4.     restart: unless-stopped
    5.     ports:
    6.       - "80:80"
    7.       - "443:443"
    8.     volumes:
    9.       - ./Caddyfile:/etc/caddy/Caddyfile
    10.       - ./data:/data
    11.       - ./config:/config
    複製代碼

    適合:習慣改設定檔、想要簡潔、服務中等數量。

    三、Traefik


    • 專為容器設計 —— 會自動偵測新容器並建立路由
    • 設定用 Docker label 寫在 compose 檔裡
    • 功能最完整(中介軟體、負載平衡、服務發現)
    • 學習曲線最陡

    1. services:
    2.   traefik:
    3.     image: traefik:v3
    4.     command:
    5.       - --providers.docker=true
    6.       - --entrypoints.web.address=:80
    7.       - --entrypoints.websecure.address=:443
    8.       - --certificatesresolvers.le.acme.email=you@example.com
    9.       - --certificatesresolvers.le.acme.storage=/le/acme.json
    10.       - --certificatesresolvers.le.acme.tlschallenge=true
    11.     ports: ["80:80", "443:443"]
    12.     volumes:
    13.       - /var/run/docker.sock:/var/run/docker.sock:ro
    14.       - ./letsencrypt:/le
    15.   grafana:
    16.     image: grafana/grafana
    17.     labels:
    18.       - traefik.enable=true
    19.       - traefik.http.routers.grafana.rule=Host(`grafana.example.com`)
    20.       - traefik.http.routers.grafana.tls.certresolver=le
    複製代碼

    新增服務不用改代理的設定,加幾行 label 就好。

    適合:容器很多、常常增減服務、願意花時間學。



    我的建議


    • 第一次做NPM。有介面,不會卡住
    • 喜歡設定檔、服務不多Caddy。最省心
    • 容器超過十五個而且常變動Traefik


    三個都試過之後我自己用 Caddy
    因為設定檔可以進 Git,而且真的完全不用管憑證

    接 HA 的重要設定

    不管用哪個,HA 這邊都要改
    1. # configuration.yaml
    2. http:
    3.   use_x_forwarded_for: true
    4.   trusted_proxies:
    5.     - 192.168.1.20          # 反向代理的 IP
    6.     - 172.16.0.0/12         # Docker 網段(如果代理在容器裡)
    複製代碼

    沒有這段的話 HA 會拒絕連線,錯誤訊息是
    "A request from a reverse proxy was received from ..."

    trusted_proxies 一定要寫具體的 IP
    不要寫 0.0.0.0/0 —— 那樣任何人都能偽造來源 IP。

    WebSocket 一定要支援

    HA 的即時更新靠 WebSocket。代理沒轉發的話,
    你會看到畫面能開但狀態不會更新


    • NPM:在那個 Proxy Host 的設定裡勾 Websockets Support
    • Caddy:預設就支援,不用設定
    • Traefik:預設就支援


    憑證怎麼拿:兩種驗證方式

    HTTP-01 驗證


    • Let's Encrypt 會連到 你的網域 + /.well-known/acme-challenge/
    • 所以需要對外開 80 埠
    • 不能用在只有內網的服務


    DNS-01 驗證


    • 在 DNS 加一筆 TXT 記錄來證明你擁有網域
    • 不用開任何通訊埠
    • 可以簽發萬用憑證(*.example.com)
    • 需要 DNS 供應商的 API(Cloudflare 最常用)


    強烈建議用 DNS-01,尤其是內網服務。

    Caddy 的寫法(要用有 Cloudflare 模組的版本):
    1. {
    2.     acme_dns cloudflare {env.CF_API_TOKEN}
    3. }
    4. *.home.example.com {
    5.     tls {
    6.         dns cloudflare {env.CF_API_TOKEN}
    7.     }
    8.     @ha host ha.home.example.com
    9.     handle @ha {
    10.         reverse_proxy 192.168.1.50:8123
    11.     }
    12.     @grafana host grafana.home.example.com
    13.     handle @grafana {
    14.         reverse_proxy 192.168.1.20:3000
    15.     }
    16. }
    複製代碼



    內網 vs 外網:兩種部署模式

    模式 A:只給內網用


    • 代理只監聽內網
    • DNS 記錄指向內網 IP(用本地 DNS 或公開 DNS 都可以)
    • 用 DNS-01 拿憑證
    • 完全不開任何通訊埠
    • 從外面存取的話先連 VPN


    這是最安全的做法,我自己用這個。

    模式 B:對外開放


    • 開 80、443 埠
    • DNS 指向你的公網 IP
    • 一定要加額外的保護:Cloudflare Tunnel(不用開埠,而且有 WAF),
      或至少設 fail2ban、限制來源國家、加一層 Basic Auth


    直接把 HA 開在公網上是很危險的。
    就算有 HTTPS,暴力破解和 0-day 漏洞還是存在。

    如果一定要對外,我的優先順序


    • Nabu Casa —— 最安全,官方維護
    • Cloudflare Tunnel —— 不開埠,有 WAF,免費
    • VPN —— 安全,但每次要先連
    • 反向代理 + 完整防護 —— 需要你懂在做什麼


    一個一定要知道的陷阱

    如果你的反向代理在前面用 http 轉給後端,
    而後端又設定了「強制 HTTPS 轉址」——

    會變成無限轉址,整站打不開。

    因為後端看到 http 就叫你去 https,
    你去了 https(在代理那層),代理又用 http 轉進來……

    解法:讓後端信任 X-Forwarded-Proto 標頭:
    1. # nginx 後端的話
    2. if ($http_x_forwarded_proto = "https") {
    3.     set $is_https 1;
    4. }
    複製代碼

    或者更簡單:後端不要開強制 HTTPS,讓代理那層負責就好。

    ---

    最後提醒一件事:反向代理是你整個系統的單點故障。

    它掛掉的話所有服務都連不到。所以:


    • 容器設 restart: unless-stopped
    • 設定檔要備份(Caddy 和 Traefik 的是純文字,進 Git 最好)
    • 記住直接用 IPort 存取的方法,代理掛了才有後路
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-24 11:30 , Processed in 0.077815 second(s), 26 queries .

    快速回覆 返回頂部 返回列表