結論:egressの名前解決とheadersの用途を分けて管理する

Claude Code v2.1.277では、Claude apps gatewayの唯一のegressがforward proxyである場合にCLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1を使えるようになりました。これにより、outbound requestはhostnameをproxyへ渡し、Gatewayが宛先をローカル解決しない経路を設計できます。またupstreamへ送る任意のheaders: mapも追加されましたが、static headerへsecretを直書きしてよいという意味ではありません。

読者の課題は、proxyを置いた後もDNS、header、TLS、upstreamのどこで外部へ出るかを説明できないことです。まず送信経路を図にし、名前解決を誰が行うか、headersを誰が付与・閲覧するか、失敗時に止めるかを分けてください。

根拠はClaude Code v2.1.277公式リリースとClaude apps gateway configuration公式文書です。gatewayが通過させるrequest・responseの条件はgateway compatibility公式文書、Gateway導入の全体像はClaude apps gateway公式overviewを正本にします。既存のGatewayの公開範囲制限はCIDRとinternal network、OTLP転送はcollectorと保持が中心で、本稿はforward proxyのegress boundaryとupstream headersへ限定します。

直接接続・forward proxy・Gatewayを比較する

経路名前解決先に決める境界
Gatewayが直接egressGatewayまたは基盤側宛先allowlist、DNS、TLS、secret
forward proxyが唯一のegressproxyへhostnameを渡すproxyのallowlist、認証、log、停止条件
upstream headersを付与経路とは別のmetadata値、閲覧者、転送先、secret化
proxy障害解決できても送信不可fail-closed、通知、再試行上限

CLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1は、forward proxyが本当に唯一の外向き経路であることを前提にします。別のDNS経路、debug用のcurl、health check、コンテナ内のdirect routeが残っていれば、環境変数だけで境界は閉じません。network policy、route table、security group、host firewallを別レイヤーで確認し、proxy logのhostnameとGateway logのrequest idを対応付けます。

安全に設計する8手順

  1. 外向き先を列挙する。Anthropic API、cloud provider、IdP、OTLP collector、health check、packageや更新経路を分けます。
  2. 唯一のegressを証明する。Gateway container、host、sidecar、管理用shellにdirect routeや別proxyがないか確認します。
  3. 名前解決者を固定する。Gatewayで解決するのか、forward proxyへhostnameを渡すのかをdiagramと設定台帳に記録します。
  4. 変数のscopeを限定する。CLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1を検証環境から適用し、起動時に期待した経路になったかreadbackします。
  5. headersを分類する。routing、tenant、trace、認証補助など目的ごとに分け、providerへ転送する値とproxyだけが使う値を区別します。
  6. secretを外出しする。gateway.yamlへtokenやclient secretを直書きせず、公式configが示す環境変数・file reference・secret managerの経路で注入します。
  7. 通過条件をテストする。request header、body field、response key、streaming event、tool-use IDがproxyで欠落・改変しないことを確認します。
  8. 停止と監査を試す。proxy拒否、DNS失敗、TLS失敗、header不備、upstream timeoutで、fail-openせず通知とrequest idを残せるか確認します。

static headersは便利ですが、すべてのupstreamへ無条件に同じ値を送るとtenant混同や意図しない情報共有につながります。header名、値のsource、対象upstream、ログでのマスキング、変更ownerを表にし、認証に使う値はsecretの有効期限とrotationを別台帳で管理します。proxyがheaderを追加する場合とGatewayが追加する場合を同時に採用すると、どちらが正本か分からなくなるため、まず一つの責任点へ寄せます。

Claude apps gatewayのconfigは起動時にschema検証され、unknown keyや必須sectionの欠落はboot errorになります。これは安全の証拠ではなく、入力ミスを早く見つける仕組みです。listen、oidc、session、store、upstreamsなどの正規設定と、proxy関連の環境変数・header mapを同じcommitでレビューし、credentialの値そのものはcommitへ入れないようにします。

企業導入でのfail-closed境界

proxyが停止した時、Gatewayを起動し続けるか、推論受付を止めるかは業務によって異なります。認証、監査、費用制御、外部送信をproxyへ依存しているなら、到達不能なのに処理を続けるfallbackは説明が難しくなります。read-onlyのhealth checkと本番inferenceを分け、proxyのallowlistにないhostnameは明示的に拒否し、拒否理由とrequest idだけを監査へ残します。

upstream headersの変更では、値の漏えいだけでなく、cache key、rate limit、tenant routing、support調査への影響を確認します。headerにcustomer nameや個人情報を入れず、必要ならopaqueな識別子へ変換します。proxy log、Gateway log、upstream logの三つで同じ値が見える範囲を確認し、保持期間と閲覧権限を揃えます。

gateway compatibility文書が示す通り、Claude Codeの新機能は未認識のfieldやstreaming eventを使うことがあります。proxyが「知らないfieldを削る」設計だと、Auto modeのserver checksや将来の機能が壊れます。許可するpass-throughをversion付きで管理し、更新時はrequest・responseのgolden testを行います。単に200を返すだけでなく、tool call、長いstream、エラー、再試行を含むreadbackを合格条件にしてください。

チェックリスト

  • v2.1.277の正式な変数名を確認した
  • forward proxyが唯一のegressか証明した
  • Gatewayとproxyの名前解決責任を固定した
  • headersの目的・対象upstream・ownerを記録した
  • secretをconfig本文へ直書きしていない
  • request・response・streamingのpass-throughを検証した
  • proxy停止時のfail-open/closedを決めた
  • logのmasking、保持、request id照合を確認した

よくある質問

環境変数を設定すればdirect egressは必ず消えますか?

いいえ。これはGatewayの解決経路を設計するための設定です。hostやcontainerのroute、sidecar、debug経路など別の外向き経路をnetwork側でも閉じます。

headers mapへAPI keyを書いてよいですか?

直書きを前提にしないでください。config公式文書のsecret expansionやsecret managerを使い、値の閲覧・rotation・log maskingを確認します。

proxyが200を返せば互換性は十分ですか?

不十分です。request field、response key、streaming、tool-use ID、Auto mode関連fieldが通過するか、代表ケースとエラーケースで検証します。

公式情報

次の一歩

proxy、Gateway、provider、監査の責任が分かれていて、外向き経路を一枚で説明できない場合は、設定追加より先に境界を棚卸しします。Miraigentの無料診断で、egress、headers、secret、停止責任を60秒から確認できます。