gateway.yaml que la puerta de enlace lee al iniciar, consulte la referencia de configuración.
Una implementación de producción sigue cuatro pasos en orden, y las secciones a continuación coinciden con ellos. Los dos primeros son donde usted toma decisiones; los dos segundos son material de referencia para consultar una vez que esté en funcionamiento.
- Configurar su proveedor de identidad: registre el cliente OAuth y verifique las notas específicas de cada IdP para Okta, Entra y Google
- Implementar la puerta de enlace: construya una imagen de contenedor fijada y ejecútela en Kubernetes, Cloud Run o su propia plataforma. Esta sección también cubre decisiones sobre costo, omisión, múltiples puertas de enlace y sin servidor
- Configurar operaciones: registros, sondeos de salud, comportamiento de interrupciones, rotación de secretos y actualizaciones. Referencia para cuando esté conectando monitoreo y runbooks
- Revisar la postura de seguridad: qué datos fluyen hacia dónde, el modelo de amenaza y respuestas de cumplimiento. Referencia para una revisión de seguridad
Implemente en su red privada. Claude Code solo se conecta a una puerta de enlace cuya dirección es privada. Esta es una protección de seguridad, porque una puerta de enlace de confianza puede enviar configuraciones que ejecuten comandos en máquinas de desarrolladores. Coloque la puerta de enlace detrás de un equilibrador de carga interno o VPN y asígnele un nombre de host que se resuelva solo en direcciones IP privadas.
Configuración del proveedor de identidad
Registre una aplicación web confidencial de OAuth/OpenID Connect (OIDC) con un único URI de redirección,https://<gateway>/oauth/callback, y asígnela a los usuarios o grupos que deben tener acceso a la puerta de enlace.
Cualquier IdP compatible con OIDC funciona: Okta, Microsoft Entra ID, Google Workspace, Keycloak, Dex, PingFederate y otros. El IdP debe cumplir tres requisitos:
- Sirve
/.well-known/openid-configuration, sobre HTTPS en producción; la puerta de enlace acepta un emisorhttp://, y un emisor de loopback además requiereCLAUDE_GATEWAY_ALLOW_LOOPBACK=1 - Admite el flujo de código de autorización. PKCE (Proof Key for Code Exchange) está activado de forma predeterminada; desactívelo con
oidc.use_pkce: falsepara IdPs que no lo admitan - Devuelve
emaily opcionalmentegroupsen el id_token, o los sirve desde el punto final de userinfo conoidc.userinfo_fallback: true
oidc.ca_cert_pem.
Algunos proveedores manejan las reclamaciones de correo electrónico y grupo de manera diferente:
- Okta: el servidor de autorización de la organización en
https://example.okta.comdevuelve un id_token delgado que omiteemailygroups, así que establezcaoidc.userinfo_fallback: truesiempre que lo use comoissuer. Un servidor de autorización personalizado comohttps://example.okta.com/oauth2/defaultque incluyeemaily opcionalmentegroupsen el id_token los emite directamente y no necesita fallback. Okta emitegroupssolo cuando se solicita el alcancegroupsenoidc.scopesy el filtro de reclamación de grupos de la aplicación lo permite;userinfo_fallbackno puede llenar una reclamación que el IdP no fue solicitado. - Microsoft Entra ID:
issuer=https://login.microsoftonline.com/<tenant-id>/v2.0. Entra emite IDs de objeto de grupo en lugar de nombres, así que use los GUIDs enmanaged.policies.match.groups, o use App Roles para nombres legibles por humanos. Si su inquilino emite roles bajorolesen lugar degroups, establezcaoidc.groups_claim: roles. - Google Workspace:
issuer=https://accounts.google.com. El id_token de Google no lleva grupos. Para usarallowed_groupsbasado en grupos omanaged.policiescon Google como IdP, configureoidc.google_groups, que busca los grupos de cada usuario a través de la API de directorio del SDK de administración usando una cuenta de servicio con delegación en todo el dominio. Sin él, useoidc.allowed_email_domainspara control de membresía ymanaged.policies.match.email_domainpara asignación de políticas. Google también ignora el alcance estándaroffline_access. Para tokens de actualización, establezcaoidc.scopes: [openid, profile, email]yoidc.extra_auth_params: { access_type: offline, prompt: consent }.
Implementación
La puerta de enlace es un único binario de Linux. Se escala horizontalmente porque las réplicas son sin estado y Postgres es la capa de coordinación compartida. Ejecútela como ejecuta servicios sin estado en su entorno. El resto de esta sección establece lo que la imagen necesita, con notas breves para Kubernetes y Cloud Run. La puerta de enlace está diseñada para ejecutarse dentro de su red, porque contiene su credencial ascendente y actúa como el único punto de salida para la inferencia. Puede ejecutarse en cualquier lugar donde sus desarrolladores y su IdP puedan alcanzar sobre HTTPS; trátela como cualquier otro servicio que contiene una credencial de producción. Algunas decisiones dan forma a la implementación más allá de dónde se ejecuta:- Costo: no hay licencia separada ni tarifa por asiento para la puerta de enlace; es parte del binario
claude. Paga por inferencia a través de su compromiso existente en la nube o con Anthropic, más el cálculo para el contenedor y su recopilador de telemetría. - Derivación: la puerta de enlace no impone que la única ruta a un modelo pase por ella. Un desarrollador con su propia credencial aún puede llamar al proveedor directamente, así que cerrar ese camino es una decisión de política de red, por ejemplo bloqueando la salida a
api.anthropic.comexcepto desde la puerta de enlace. Bloquear esa salida también rompe la verificación de seguridad de dominio de WebFetch, que llama aapi.anthropic.comdesde la máquina de cada desarrollador; establezcaskipWebFetchPreflight: trueen la política administrada para deshabilitarlo. - Múltiples puertas de enlace: cada puerta de enlace es una implementación separada con su propia configuración. El CLI almacena su huella digital de confianza y credenciales por nombre de host de puerta de enlace, así que diferentes equipos pueden conectarse a diferentes puertas de enlace sin conflicto. Para servir múltiples emisores OIDC, ejecute instancias separadas.
- Sin servidor: Cloud Run funciona; establezca
min-instances: 1para evitar descubrimiento OIDC frío. Lambda y Cloud Functions no, porque la puerta de enlace es un servidor HTTP de larga duración.
listen.trusted_proxies en los rangos de origen del proxy para que la puerta de enlace lea las IPs del cliente desde X-Forwarded-For. La puerta de enlace honra el encabezado solo cuando el par TCP es confiable; el ejemplo trabajado de Google Cloud tiene valores concretos por topología. Sin proxies confiables, cada solicitud parece provenir de la IP del proxy, lo que colapsa los límites de velocidad por IP en un cubo compartido y registra la IP del proxy en eventos de auditoría.
Imagen de contenedor
Construya su propia imagen alrededor del binario nativoclaude de la versión estándar de Claude Code:
- Descargue la compilación de Linux para la arquitectura de su imagen desde una versión fija; consulte Instalar una versión específica para la URL de descarga.
- Verifíquelo contra el
manifest.jsonfirmado con GPG de la versión como se describe en Integridad binaria y firma de código. - Cópielo en el contexto de compilación.
- Una imagen basada en glibc: las únicas dependencias dinámicas de la compilación de glibc son las bibliotecas de glibc. Las imágenes basadas en Musl necesitan la compilación
linux-x64-muslolinux-arm64-muslmás paquetes adicionales; consulte Configuración de Alpine Linux. - Un directorio de estado escribible: la puerta de enlace se ejecuta como cualquier usuario, pero las imágenes mínimas no tienen inicio escribible. Establezca
CLAUDE_CONFIG_DIRen una ruta escribible como/tmp/.claude. - El comando del contenedor:
claude gateway --config /etc/claude/gateway.yaml, con el archivo de configuración montado de solo lectura y secretos suministrados como variables de entorno; la puerta de enlace escucha enlisten.port, predeterminado8080.
Kubernetes
Ejecute la puerta de enlace como una Deployment, como cualquier servicio sin estado:- Monte la configuración desde un ConfigMap y secretos desde un Secret; haga referencia a secretos en el YAML a través de
${file:/path/to/secret}o como variables de entorno - Termine TLS en el Ingress y establezca
listen.public_urlen el nombre de host de Ingress - Apunte la sonda de preparación a
GET /readyzy la sonda de vivacidad aGET /healthz
Identidad de carga de trabajoPrefiera la identidad de carga de trabajo de la plataforma sobre claves estáticas: IRSA en EKS para Bedrock, Workload Identity en GKE para Agent Platform, e identidad de carga de trabajo en AKS para Foundry. Establezca
auth: {} en el bloque ascendente, o use_azure_ad: true para Foundry, y la puerta de enlace recoge la identidad del pod a través de la cadena de credenciales predeterminada de ese proveedor. Para un emparejamiento entre nubes, como un ascendente de Bedrock en GKE, establezca credenciales explícitas en el bloque auth del ascendente en su lugar. La referencia de upstreams tiene detalles de configuración por plataforma.Cloud Run
Configure el servicio de la siguiente manera:- Deje
listen.porten su predeterminado de8080, que coincide con elPORTpredeterminado de Cloud Run, o establezcaport: ${PORT} - Establezca
public_urlen el origen externamente alcanzable. Para producción esto es normalmente el nombre de host de un equilibrador de carga interno, porque/loginrechaza direcciones públicas y la URL*.run.appse resuelve a una, así que la URL de Cloud Run sola funciona solo para una prueba de humocurlo navegador. La excepción es una red donde*.run.appse resuelve privadamente a través de Private Service Connect y una zona privada de Cloud DNS; en esa topología la URL de Cloud Run es unpublic_urlválido. El ejemplo trabajado de Google Cloud cubre ambos. - Monte la configuración como un volumen secreto
- Establezca
min-instances: 1para evitar un descubrimiento OIDC frío en la primera solicitud
Para un ejemplo completo trabajado en Google Cloud, cubriendo Cloud Run o GKE, Cloud SQL y Secret Manager, consulte Implementar en Google Cloud.
Enviar la URL de la puerta de enlace a máquinas de desarrolladores
Una vez que la puerta de enlace está sirviendo, envíeforceLoginMethod y forceLoginGatewayUrl a la máquina de cada desarrollador a través de configuraciones administradas, a través de MDM o escribiendo directamente el managed-settings.json específico del sistema operativo. Sin esto, /login muestra el selector de cuenta estándar sin opción de puerta de enlace. Consulte Configuraciones administradas del lado del cliente para las rutas de archivo.
Operaciones
Una vez que la puerta de enlace está sirviendo tráfico, la operación día a día es leer sus registros, sondear su salud y rotar sus secretos en su horario. Las subsecciones cubren cada una, más lo que Postgres contiene y cómo se comportan las actualizaciones y reversiones.Registros
La puerta de enlace escribe dos flujos a stderr, ambos amigables con JSON:- Eventos de auditoría: JSON de una sola línea por evento relevante para la seguridad. Canalice stderr a su agregador de registros. Los eventos emitidos incluyen
config.load,session.mint,session.refresh,device.authorize,device.verify,auth.denied,access.denied,inference,managed.serve,spend.blockedyadmin.denied. Los campos varían según el evento:- Los eventos de acuñación y actualización exitosos llevan
sub,email,client_ipy el resultado - Los eventos de denegación llevan la razón, ruta e IP del cliente, ya que no existe identidad en la denegación
inferenceregistra qué ascendente sirvió la solicitud y el estado de respuestaadmin.deniedregistra un intento de autenticación de API de administrador rechazado con la razón (invalid_keyono_credentials), IP del cliente, método y ruta, sin el material de clave presentado
- Los eventos de acuñación y actualización exitosos llevan
- Registros operacionales: líneas legibles por humanos con prefijo
[gateway]para arranque, advertencias y errores ascendentes. La variable de entornoCLAUDE_GATEWAY_LOG_LEVELcontrola la verbosidad y aceptainfo,warnoerror, coninfocomo predeterminado. No afecta los eventos de auditoría, que siempre se emiten.
Salud
La puerta de enlace sirveGET /healthz como una sonda de vivacidad y GET /readyz como una sonda de preparación; /readyz verifica que el almacén sea alcanzable. Ambas están exentas de access_control.allow_cidrs, así que los sondeos siguen funcionando en un oyente bloqueado.
El documento de descubrimiento de OAuth en /.well-known/oauth-authorization-server también devuelve 200 solo después de que se cargue la configuración, descubrimiento OIDC, construcción de cliente ascendente y migración de Postgres tengan éxito, así que funciona como una verificación de arranque de extremo a extremo.
Una puerta de enlace en ejecución también sirve una descripción de las rutas y formas de solicitud que acepta en <public_url>/protocol, coincidida con la versión que está ejecutando. El contenido no es estable entre versiones.
Comportamiento de interrupciones
Si Postgres se cae, la puerta de enlace en sí sigue sirviendo desarrolladores con sesión iniciada y los nuevos inicios de sesión fallan. Si los desarrolladores realmente siguen trabajando depende de cómo su orquestador maneja la preparación:- Sesiones existentes: los tokens portadores se validan localmente con el secreto JWT, las actualizaciones de sesión no tocan el almacén, y el proceso de puerta de enlace aún puede servir inferencia
- Nuevos inicios de sesión: fallan hasta que Postgres se recupere, porque el flujo de dispositivo y sus contadores de límite de velocidad viven en Postgres
- Cumplimiento de límite de gasto: falla abierto de forma predeterminada durante la interrupción, así que la inferencia aún fluye; cámbielo a falla cerrada si preferiría bloquear que ejecutar sin medidor
- Preparación:
/readyzreporta no listo durante la interrupción, así que los orquestadores que cierren tráfico en preparación eliminan cada réplica de rotación a la vez. En esa topología todo el tráfico, incluida la inferencia que la puerta de enlace podría servir, falla en el equilibrador de carga hasta que Postgres se recupere. La sonda de vivacidad en/healthzsigue pasando, así que las réplicas no se reinician. Apunte la sonda de preparación a/healthzen su lugar si preferiría que los desarrolladores con sesión iniciada sigan trabajando a través de una interrupción de almacén; el costo es que los nuevos inicios de sesión fallan contra una réplica que aún reporta lista.
ttl_hours, y los nuevos inicios de sesión y actualizaciones fallan. Establezca un ttl_hours más largo si su IdP tiene ventanas de mantenimiento frecuentes.
Rotación de secreto JWT
Rote el secreto de firma en tres pasos para que las sesiones existentes permanezcan válidas:- Genere un nuevo secreto. Antepóngalo a la matriz
session.jwt_secret. - Despliegue la implementación. Los nuevos tokens firman con el nuevo secreto; los tokens antiguos aún se verifican.
- Después de
ttl_hoursmás un margen, elimine el secreto antiguo y despliegue nuevamente.
ttl_hours.
Postgres
La puerta de enlace contiene cinco tablas, todas creadas por sus migraciones de tiempo de arranque:| Tabla | Contenidos | Retención |
|---|---|---|
kv | Concesiones de dispositivo (TTL de 10 minutos) y contadores de límite de velocidad | TTL por fila |
spend | Contadores de gasto de período a la fecha por principal, en centavos | admin.spend_retention_months, predeterminado 13 |
spend_limits | Límites de gasto configurados | Hasta eliminado a través de la API |
admin_audit | Rastro de mutación de API de administrador | admin.audit_retention_days, predeterminado 365 |
principal_emails | Correo electrónico de último visto de cada principal, nombre para mostrar y grupos de IdP. Contiene PII. | admin.identity_retention_days desde última actividad, predeterminado 90 |
kv pasadas su TTL, y un barrido cada hora impone las ventanas de retención en las tablas de gasto, así que nada crece sin límite. Sin límites de gasto configurados, solo se escribe kv. Si su política de seguridad prohíbe DDL del rol de aplicación, pre-cree estas tablas y _migrations con un rol de administrador y otorgue al rol de aplicación SELECT, INSERT, UPDATE, DELETE en cada una.
Con límites de gasto en uso, una base de datos perdida significa pérdida de seguimiento de gasto y límites, no solo re-inicios de sesión de desarrolladores, así que ejecute copias de seguridad regulares. Para borrar un desarrollador que se fue inmediatamente en lugar de esperar en retención, ejecute DELETE FROM principal_emails WHERE principal = '<sub>' directamente; eso elimina la única tabla que contiene su correo electrónico, nombre y grupos. Las filas spend y admin_audit hacen referencia solo al sub OIDC seudónimo.
Actualizaciones
Las réplicas son sin estado, así que un reinicio rodante es seguro en cualquier momento. La puerta de enlace ejecuta migraciones de esquema al arrancar, lo que significa que implementar el nuevo binario auto-migra la base de datos. Si el rol de base de datos no puede ejecutar DDL, pre-cree el esquema, incluida la tabla_migrations sembrada a la versión actual; de lo contrario el arranque falla intentando CREATE TABLE.
Las migraciones son solo anexo, así que revertir a un binario anterior que conoce menos migraciones es seguro; ignora las filas adicionales. La reversión también re-valida el YAML contra el esquema del binario más antiguo, así que una configuración que adoptó una clave introducida por la versión más nueva falla al arrancar en la más antigua. Elimine la nueva clave antes de revertir.
Porque fija la versión de la puerta de enlace en su propia imagen, las correcciones en nuevas versiones de Claude Code, incluidas las correcciones de seguridad, llegan a su implementación solo cuando actualiza el pin y redeploy. Incluya la puerta de enlace en el mismo ciclo de parches que usa para otros servicios que contienen credenciales de producción.
Seguridad
Esta sección responde las preguntas que una revisión de seguridad hace: qué datos fluyen a través de la puerta de enlace y hacia dónde van, qué ataques defiende el diseño, y qué respuestas pertenecen en un cuestionario de cumplimiento.Flujo de datos
| Datos | Ruta | Enviado a Anthropic por la puerta de enlace |
|---|---|---|
| Inferencia (indicaciones, finalizaciones) | CLI → puerta de enlace → su ascendente | Solo si la API de Anthropic es un ascendente configurado |
| Telemetría (métricas OTLP, más registros y trazas opcionales) | CLI → puerta de enlace → su recopilador | Nunca |
| Identidad (correo electrónico, grupos, sub) | IdP → puerta de enlace → JWT → CLI; el CLI lo marca en exportaciones OTLP | Nunca |
| Configuraciones administradas | Su YAML de puerta de enlace → CLI | Nunca |
| Registro de auditoría | Stderr de puerta de enlace → su agregador | Nunca |
Resumen del modelo de amenaza
La puerta de enlace se sienta dentro de su perímetro de red, pero las máquinas portátiles de desarrolladores individuales no se tratan como confiables. El diseño cuenta para esto de tres maneras:- Los desarrolladores sostienen JWTs de corta duración en lugar de claves ascendentes sin procesar. La pierna CLI-a-puerta de enlace usa la concesión de dispositivo RFC 8628, y el intercambio de código de autorización de la puerta de enlace con el IdP ejecuta PKCE en la configuración predeterminada, así que un código de autorización de IdP interceptado es inútil.
- La página de verificación de dispositivo impone POST del mismo origen y un límite de velocidad por IP por RFC 8628 §5.1. Consulte Resistencia de fuerza bruta de código de usuario.
- Las solicitudes salientes pasan por una protección de falsificación de solicitud del lado del servidor (SSRF) que resuelve DNS, bloquea direcciones de enlace local y metadatos en la nube más loopback de forma predeterminada, y fija la conexión a la IP resuelta, así que URLs influenciadas por el operador como el IdP y destinos OTLP no pueden ser redirigidas a puntos finales de metadatos en la nube. Los rangos privados RFC 1918 se permiten deliberadamente, porque los IdPs y recopiladores OTLP comúnmente viven en IPs privadas. Para desarrollo local contra un IdP de loopback o recopilador, establezca
CLAUDE_GATEWAY_ALLOW_LOOPBACK=1en el entorno de la puerta de enlace; déjelo sin establecer en producción.
- Un host de puerta de enlace comprometido: el host tanto contiene la credencial ascendente como distribuye configuraciones administradas a cada desarrollador conectado, así que el control sobre la configuración de la puerta de enlace es comparable al control sobre su MDM. El diálogo de aprobación única del CLI para configuraciones capaces de shell limita cambios silenciosos pero no reemplaza la seguridad del host.
- Un proveedor OIDC malicioso: el proveedor firma los id_tokens que la puerta de enlace confía, así que puede afirmar cualquier identidad. Verificar y asegurar su IdP es su responsabilidad.
Resistencia de fuerza bruta de código de usuario
Eluser_code que un desarrollador escribe en la página de verificación /device son 8 caracteres extraídos de un alfabeto de 20 caracteres, que produce 20⁸ o aproximadamente 2.56×10¹⁰ combinaciones, y expira después de 10 minutos.
La puerta de enlace aplica límites de velocidad por IP en los puntos finales de concesión de dispositivo, configurables a través de rate_limits. Aumente los límites si muchos desarrolladores inician sesión desde una única dirección NAT corporativa compartida. Los límites se aplican solo al flujo de inicio de sesión, no a la inferencia.
Postura de cumplimiento
- Residencia de datos: el plano de datos propio de la puerta de enlace no envía nada a Anthropic a menos que la API de Anthropic sea un ascendente configurado; cuando lo es, su acuerdo de manejo de datos existente se aplica a la ruta de inferencia. Telemetría, auditoría, identidad y configuraciones van solo a los destinos que configura.
- Tráfico de proceso de host: el proceso de host es el CLI de Claude Code, que puede enviar análisis de inicio y verificaciones de actualización a Anthropic. Para implementaciones de salida estricta, establezca
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1en el entorno del contenedor de la puerta de enlace. - Análisis del cliente: el CLI deshabilita su propio análisis de uso mientras está conectado a una puerta de enlace, y el informe de errores está desactivado de forma predeterminada en superficies de API de terceros.
- Máquinas cliente: los CLIs de desarrolladores aún envían verificaciones de nombre de host de WebFetch y verificaciones de versión a Anthropic a menos que
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1yskipWebFetchPreflight: trueestén establecidos. Consulte uso de datos. - Calificaciones de encuesta: la credencial de puerta de enlace deshabilita el sumidero de calificación vinculado a Anthropic, así que las calificaciones no se envían a Anthropic.
- Compartir transcripción: elegir Sí en el indicador de compartir transcripción de una encuesta escribe un archivo local bajo
~/.claude/feedback-bundles/en lugar de cargar a Anthropic. - Actualizaciones del cliente: las verificaciones de actualización son separadas del tráfico de puerta de enlace. Fije versiones a través de su propia distribución y establezca
DISABLE_UPDATESsi las máquinas portátiles no deben obtener versiones.DISABLE_AUTOUPDATERdetiene solo actualizaciones de fondo mientrasclaude updateaún funciona. - TLS: sirva
public_urlsobre HTTPS en producción, ya sea desde el oyente propio de la puerta de enlace a través delisten.tlso desde un ingress que termina TLS frente a réplicas HTTP simples conlisten.public_urlestablecido. La puerta de enlace no rechaza HTTP simple. El IdP debe servir HTTPS en producción, y Postgres admite?sslmode=require. EstablezcaStrict-Transport-Securityen su ingress. - Divulgación de vulnerabilidad: siga Reportar problemas de seguridad
Solución de problemas
Para preguntas y comentarios, use soporte de Claude Code, o abra un problema en el repositorio de GitHub de Claude Code. Al reportar un problema, incluya:- Problema de puerta de enlace: el stderr de la puerta de enlace para la ventana relevante, su
gateway.yamlcon secretos redactados, la versión de la puerta de enlace, mostrada en la página de inicio en/y en el encabezado de respuestax-cc-gateway-versionen/managed/settings, y qué cambió recientemente - Problema de inicio de sesión: el desarrollador ejecuta
claude --debug-file ./claude-debug.txt, reproduce, y envía ese archivo más el registro de auditoría de la puerta de enlace para la misma ventana - Problema de inferencia: el modelo solicitado, los ascendentes configurados, y el registro de auditoría de la puerta de enlace para la solicitud, que registra qué ascendente la sirvió y el estado de respuesta
| Síntoma | Causa | Solución |
|---|---|---|
El /login de un desarrollador muestra el selector de cuenta estándar en lugar de la pantalla Cloud gateway | forceLoginMethod o forceLoginGatewayUrl no está establecido en configuraciones administradas en esa máquina | Implemente el archivo de configuraciones administradas en el dispositivo; /login lee la URL de la puerta de enlace desde allí |
El inicio muestra Gateway login is configured in managed settings, but this Claude Code build does not include Cloud gateway support. | La compilación de Claude Code instalada es anterior al soporte de puerta de enlace | Haga que el desarrollador actualice Claude Code a una versión que incluya soporte de puerta de enlace en la nube |
CLI /login: Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip> | El nombre de host de la puerta de enlace se resuelve a al menos una dirección IP pública. Claude Code verifica cada dirección resuelta y requiere que cada una sea privada. Una causa común es un nombre de pila dual donde una familia se resuelve a una dirección pública, incluidos los equilibradores de carga de pila dual internos de AWS, que devuelven direcciones AAAA de rango público | Haga que el nombre de la puerta de enlace se resuelva solo a direcciones privadas en máquinas de desarrolladores. Para un nombre de pila dual, suelte el registro de rango público o sirva un nombre DNS solo interno separado. Consulte el requisito previo de red privada. |
CLI /login: Gateway login requires a direct connection and does not support connecting through an HTTP proxy | Un HTTPS_PROXY o HTTP_PROXY se aplica al host de la puerta de enlace y el nombre de host del proxy se resuelve a una dirección pública. Un proxy cuyo host se resuelve solo a direcciones privadas está permitido y no desencadena este error | Agregue el host de la puerta de enlace a NO_PROXY en la máquina del desarrollador para que la conexión sea directa, o use un proxy cuyo nombre de host se resuelva a direcciones privadas |
CLI /login: Could not resolve gateway host <host> | La máquina no puede resolver el nombre DNS interno de la puerta de enlace, típicamente porque no está en la red corporativa | Haga que el desarrollador se conecte a su red o VPN, luego reintente /login |
El arranque sale con un error de validación de configuración nombrando store.postgres_url | No hay Postgres configurado; la puerta de enlace requiere Postgres | Establezca store.postgres_url. Para desarrollo local, use un contenedor desechable: docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres. |
El arranque sale: requires the native binary | Ejecutando bajo Node en lugar del binario nativo | Instale Claude Code con uno de los métodos de instalación independiente |
El arranque sale con un error de descubrimiento OIDC después de config.load | oidc.issuer no alcanzable, o cadena TLS no confiable | Verifique que el emisor sea alcanzable desde el pod y sirva /.well-known/openid-configuration. Establezca ca_cert_pem para PKI privada. |
| El arranque sale con un error de permiso de Postgres | El rol de aplicación carece de CREATE TABLE | Pre-cree el esquema con un rol de administrador y otorgue DML al rol de aplicación, o otorgue DDL temporalmente para arranques que apliquen nuevas migraciones |
/oauth/callback muestra “Sign-in could not be completed” | Dominio de correo electrónico rechazado, validación de id_token falló, o email_verified es explícitamente false, que la puerta de enlace siempre rechaza sin anulación | Verifique allowed_email_domains y que el IdP devuelva una reclamación email verificada. Para email_verified: false, corrija la verificación del lado del IdP. Si su IdP emite correo electrónico bajo un nombre de reclamación diferente, establezca oidc.email_claim. |
Registro: token exchange failed: id_token missing email claim | El IdP no está incluyendo email en el id_token de forma predeterminada. Este rechazo se dispara solo cuando allowed_email_domains está establecido; sin él, un correo electrónico faltante acuña una sesión sin correo electrónico | Configure el IdP para emitir email en el id_token. Okta: agregue email a las reclamaciones de token de ID de un servidor de autorización personalizado. Entra: agregue email como una reclamación opcional en el registro de aplicación. PingFederate: habilite una Política de OpenID Connect que emita email. Si el IdP sirve email desde el punto final de userinfo pero no lo incluirá en el id_token, como el servidor de autorización de la organización de Okta, establezca oidc.userinfo_fallback: true. |
Cada solicitud de Bedrock devuelve 502; el registro muestra Could not load credentials from any providers | En EC2, el límite de salto predeterminado de IMDSv2 de 1 bloquea la solicitud de metadatos de instancia desde dentro del contenedor. El arranque y /readyz pasan de todas formas porque el SDK de AWS resuelve credenciales de instancia en la primera solicitud, no en la construcción del cliente | Aumente el límite de salto con aws ec2 modify-instance-metadata-options --instance-id <id> --http-put-response-hop-limit 2, o establézcalo en la plantilla de lanzamiento. El cambio se aplica a cada contenedor en la instancia. Prefiera roles de tarea de ECS donde estén disponibles, que leen credenciales desde el punto final de credenciales del contenedor de ECS y evitan el cambio por completo, o aplique el cambio en una instancia de puerta de enlace dedicada para limitar la exposición. |
| Error de IdP: unknown or unsupported scope | El IdP rechaza alcances que no reconoce | Establezca oidc.scopes exactamente a la lista que su IdP acepta; debe incluir openid. El predeterminado es openid profile email offline_access. |
Las sesiones no se renuevan silenciosamente después de establecer oidc.scopes | offline_access fue eliminado de la anulación | Agregue offline_access de vuelta si su IdP lo admite. Sin un token de actualización, los desarrolladores vuelven a ejecutar el inicio de sesión del navegador cada session.ttl_hours. |
| El navegador muestra “This request came from another site and was blocked” | POST de formulario entre sitios, bloqueado como protección CSRF. Esperado para páginas incrustadas o proxied | Abra el enlace de verificación directamente |
| Chrome bloquea el botón Aprobar con “Refused to send form data … violates … Content Security Policy directive: form-action”, pero la misma página funciona en Safari o Firefox | Chrome impone form-action contra toda la cadena de redirección. Su IdP redirige hacia adelante a un segundo host que no está en la lista blanca. | Agregue cada origen adicional en la cadena de redirección a oidc.form_action_origins. Abra Chrome DevTools → Consola en la página Aprobar para ver qué origen fue bloqueado. |
| El inicio de sesión se completa en el IdP pero la devolución de llamada falla, con un error de CSP en Chrome o “this sign-in link has expired” en Safari | El IdP devolvió el código a través de response_mode=form_post, que lo auto-envía entre orígenes a través de POST a /oauth/callback. Chrome bloquea eso bajo una CSP estricta; Safari permite el envío pero la devolución de llamada lee solo la cadena de consulta. | Asegúrese de que su IdP honre response_mode=query, que la puerta de enlace solicita explícitamente para que la devolución de llamada sea una redirección simple |
| El inicio de sesión funciona localmente pero falla detrás de un ALB | public_url no establecido, así que el IdP obtiene el origen interno http:// como redirect_uri | Establezca listen.public_url al origen externo https:// |
| El desarrollador ve el indicador de confianza repetidamente | El certificado TLS está rotando por réplica o por solicitud | Use un certificado estable en el ingress, o termine TLS una vez y ejecute réplicas sobre HTTP simple internamente |
CLI /login: “Could not verify the gateway’s TLS certificate” o SELF_SIGNED_CERT_IN_CHAIN | La cadena TLS de la puerta de enlace está firmada por una CA privada no en el almacén de confianza del host CLI | Claude Code lee el almacén de confianza del SO de forma predeterminada en el binario nativo y en Node 22.15 o posterior; CLAUDE_CODE_CERT_STORE controla este comportamiento. Si la CA está instalada en el almacén de confianza del SO, asegúrese de que los desarrolladores estén en un tiempo de ejecución actual. De lo contrario, establezca NODE_EXTRA_CA_CERTS al PEM del certificado de CA antes de lanzar. El indicador de huella digital de primera conexión aún se aplica. |
Relacionado
- Descripción general de la puerta de enlace de aplicaciones Claude: inicio rápido y conexión de desarrolladores
- Referencia de configuración: cada opción de
gateway.yaml