r/selfhosted🔥 67
💬 16

【要注意】Caddy v2.11でHostヘッダーの転送仕様がサイレント変更!既存のHTTPSバックエンドに影響あり

Do_TheEvolution
約21時間前

ディスカッション (15件)

0
Do_TheEvolutionOP👍 67
約21時間前

以下のプルリクエストおよびドキュメントで公開されている通り、Caddy v2.11(2026年2月リリース)からHostヘッダーのデフォルト動作が変更されています。

この変更はバックエンドがHTTPSの場合にのみ適用されます。

何が変わったのか?

従来、CaddyはクライアントからのオリジナルのHostヘッダー(例: whatever.example.com)をそのままアップストリームに転送していました。

しかし、最新バージョンではCaddyfileで指定したアップストリームのホスト名とポート(例: server-blue:443)が強制的にHostヘッダーとして設定されるようになりました。

以前の構成例

これまでHTTPSバックエンドに対しては、以下のように設定するのが一般的でした(証明書検証をスキップする場合など)。

whatever.{$MY_DOMAIN} {
    reverse_proxy https://server-blue:443 {
        transport http {
            tls
            tls_insecure_skip_verify
        }
    }
}

対策:以前の動作に戻すには

以前と同じ動作(オリジナルのHostヘッダーを維持)をさせたい場合は、明示的に header_up Host {host} を追加する必要があります。

whatever.{$MY_DOMAIN} {
    reverse_proxy https://server-blue:443 {
        header_up Host {host}
        transport http {
            tls
            tls_insecure_skip_verify
        }
    }
}

Caddyをアップデートする際は、この挙動変更によってリバースプロキシ先でエラーが起きないか確認するようにしましょう。

1
asimovs-auditor
👍1約21時間前

この投稿やプロジェクトでAIがどう使われたかを知りたいなら、このコメントへの返信を展開してみて。

2
autogyrophilia
👍24約21時間前

一方で、こういうTLS設定はかなり特殊だし、全く一般的じゃない。普通はHTTPに頼るか、内部CAを使うものだからね。もう一方で、この変更のやり方は最悪だ。せめて指定された名前がIPアドレスじゃなくてドメインの時にだけ動作するようにして、TLS検証を無効化しないようにするべきでしょ。

3
buttplugs4life4me
👍9約20時間前

「セキュリティ」のためにHTTPSでしか公開してないWebサービスがいくつかあって、リバースプロキシがすごく面倒になるんだよね。ある書籍管理のUIなんかもそうだ。OPNsenseのデフォルトも自己署名証明書だし。

内部CAをデプロイして頑張ることもできるけど、HTTPSエンドポイントをそのまま使ってCaddy経由で転送して、ドメイン名を統一しちゃうほうが楽なことが多いよ。

4
fixitchris
約18時間前

どっちの指摘もその通りだね。特に「ひどい変更」ってところ。リバースプロキシのデフォルト設定が変わる最悪のケースって、まさにこういうやつだよ。リクエストはアップストリームまで届くのに、Hostヘッダーがvhostと一致しなくてルーティングや認証が静かに壊れるっていう。UniFiコントローラー、Proxmox VE、OPNsense、vCenterなんかは全部バックエンドで自己署名証明書によるHTTPSを強制してくるから、先週全部こっそり動かなくなって大変だったよ。2.11に原因があるって特定するまでかなり時間かかったし。リリースノートに一言書いておいてくれれば、数時間のロスが防げたのにな。

5
FckngModest
👍7約21時間前

素人にもわかるように、典型的なシナリオで何が変わるのか教えてくれない?あと、どのアプリが壊れる可能性があるのかも。例えば、Caddyfileを変えなかったらImmichやPaperlessは動かなくなるの?

6
Do_TheEvolution
👍15約21時間前

Caddyでの通常のリバースプロキシ設定はこんな感じだね。

photos.example.com {
  reverse_proxy immich_server:2283
}

これは何の問題もない。バックエンドのImmichのWebサーバー側がHTTPSやTLS暗号化なしで応答しているからね。ほとんどのサービスはこうなってるよ。開発者だって、デプロイ時にリバースプロキシでHTTPS化する人が多いってわかってるから、自分たちでわざわざ面倒なことをしたくないんだよ。

ただ、セキュリティのためにHTTPSでしか公開しないって決めてるWebサーバーもある。そういうのは独自の証明書やTLSを使っていて、設定には少し手間がかかる。Caddyfileに数行追加して、「これはHTTPSで通信するから、Webサーバー側の証明書が正しくなくても気にしなくていいよ(Caddy自体の証明書が正しければ問題ないから)」って教えてやる必要があるんだ。OPの投稿にあるような設定だね。見た目は少しゴチャゴチャしてて冗長だけど、問題はないよ。

というわけで、自分のCaddyfileを見て tls_insecure_skip_verify なんて記述がどこにもないなら、今まで対応する必要がなかったってことだし、これからも何もする必要はないよ。

ちなみに自分はCrafty(Minecraft)とWireguard-easyだけはHTTPSオンリーだから、それらには header_up Host {host} を追加する必要があったな。

7
FckngModest
👍3約20時間前

自分のサービスの一部はこんな感じで設定してるよ。

transport http {
  tls_insecure_skip_verify
}

ただ、DNSチャレンジでLet's Encryptの正規証明書を使ってるし、HTTPS化もできてるから、この設定が本当に必要なのか自信がないんだよね。NPMからCaddyへの移行をClaudeに手伝ってもらった時、彼が勝手に追加したんだ。

8
Do_TheEvolution
👍4約20時間前

一度削除してCaddyをリロードして、動くかどうか試してみればいいよ。動かなくなったら、そのサービスはHTTPSでしか応答していないってことだね。

理解しておくべきなのは、これはあくまでCaddyとコンテンツを持つWebサーバー(アップストリーム)間の通信の話だってこと。CaddyとHTTPS証明書の話をするときは、普通はエンドユーザー(スマホでネットを見てるおばあちゃんとか)がURLにアクセスして、Caddyまで安全にHTTPSで到達して、そのあとCaddyがWebサーバーと安全に通信するかどうか、という部分を指すからね。

9
Lachee
👍2約20時間前

これってレイヤー4のルーティングやSNIに影響するの?

10
Do_TheEvolution
👍2約20時間前

そうは思わないな。

11
scoobybejesus
👍3約19時間前

最近UniFiコントローラーでこれをやる必要があったけど、原因を突き止めるのが面倒だったよ。

12
revereddesecration
👍1約19時間前

バックエンドで強制的にHTTPSにするサービスってどれのこと?自分が使ってるやつにはないな。

13
Lab-O-Matic
👍1約18時間前

教えてくれてありがと。

14
elasticvertigo
👍1約18時間前

たぶんそれが理由でLinkstackが読み込めなかったんだな。投稿者さんサンクス。