gRPC está desactivado salvo que lo configures. Actualizar a 0.15.9 no cambia nada que un cliente
pueda ver: sin un puerto gRPC la pasarela responde a cada llamada gRPC
UNAVAILABLE
(GRPC_DISABLED), y la API REST se comporta exactamente igual que antes.Activarla
Establece el puerto en el archivo de entorno y reinicia:update escribe el puerto solo cuando pasas --grpc o --grpc-port; sin ellos, un valor existente
se muestra y se deja como está, y nunca se añade uno.
Con
--firewall, el instalador abre el puerto gRPC solo cuando está ligado a algo distinto de
loopback.
Comprobarlo
fireflo.v1.AuthService, fireflo.v1.SendService y fireflo.v1.ReceiptService (con la
reflexión activada). /ops/health lleva un bloque grpc: enabled, host, port tal como quedó
ligado, tls, las sessions vivas en este nodo, los streams abiertos, y un bloque receipts para
el feed.
Detrás de un proxy
gRPC necesita HTTP/2 de extremo a extremo. Unproxy_pass HTTP/1.1 no lo transporta. Con nginx:
Subscribe inactivo a los 60 segundos.
Dile a la pasarela que el proxy está ahí
Ambos son ajustes de plataforma y se aplican a la siguiente llamada. La pasarela registra un aviso una
sola vez cuando ve
X-Forwarded-For desde una dirección privada en la que no confía: la señal de que
falta esto.
TLS en el propio puerto
El listener habla HTTP/2 sin cifrar (h2c) por defecto, para un proxy que termina TLS. Para que la propia pasarela hable TLS, añade al archivo de entorno:grpc.tls: true, y los clientes se conectan con TLS en lugar de -plaintext.
Logins rechazados y fail2ban
gRPC no necesita un jail propio. Un login gRPC rechazado se escribe en el mismoauth-failed.log que
SMPP y REST, indicando el listener y el puerto:
reason=sessionExpired)
antes de volver a iniciar sesión. El filtro incluido ignora ese motivo; una llamada sin ningún token es
missingCredential, y sí se cuenta. fireflo-install update actualiza el filtro de una pasarela
instalada cuando el de la release es distinto, y luego recarga fail2ban. Consulta
Bloquear clientes abusivos.
Límites
No hay un límite de tasa gRPC separado, deliberadamente: uno propio duplicaría lo que se
permite a una cuenta. Los listeners SMPP mantienen el suyo (
conf.maxRate.*), como antes.
El feed de acuses
Un mensaje enviado por un login HTTP (por gRPC o REST) que pide acuses sindlr_url tiene sus
acuses encolados para ese login, hasta que el cliente los confirme. Un dlr_url siempre gana. Con el
feed activado, REST también acepta dlr=yes sin dlr-url; con él desactivado, sigue siendo un 400.
Todos son ajustes de plataforma, leídos en vivo.
Dónde vive la cola depende del almacén de acuses. En un solo nodo con el almacén por defecto, se
guarda en el disco de ese nodo, junto al almacén de acuses. Donde los
acuses se guardan en PostgreSQL, el feed también está en la base de datos, compartido por todos los
nodos, así que un cliente puede leer en cualquier nodo. Un nodo que se detiene de forma ordenada
devuelve sus leases al detenerse; los de uno que muere los liberan los nodos supervivientes, o caducan
tras el lease.
Plataformas
Desde el gateway 0.15.10 una plataforma que aprovisiona cuentas con el token de gestión del gateway (OMNI, por ejemplo) puede usar el puerto gRPC sin la contraseña de ninguna cuenta:PlatformLogin se
firma con el token de gestión igual que las peticiones de la API de gestión, y la sesión que devuelve
envía como las cuentas cuyo ref empieza por el ref de la sesión (un prefijo que termina en /,
como omni:<install>/<tenant>/) —y lee sus recibos de entrega—, y
como ninguna otra. No hay nada más que activar aparte del puerto gRPC y el token de gestión que ya
tiene; sin el token, PlatformLogin responde UNAVAILABLE (MANAGEMENT_DISABLED). Se aplican las
reglas del token de gestión, como en la API de gestión: FIREFLO_MANAGEMENT_ALLOWED_IPS si lo
define, y TLS —en el puerto o en un proxy de confianza— salvo que la plataforma se conecte por
loopback. Los envíos cuentan contra el límite de velocidad de cada cuenta; no hay límite por
plataforma. Una firma incorrecta, caducada o repetida es un rechazo surface=grpc sancionable que
nombra platform:<ref>, y grpc.sessions_platform en health muestra cuántas sesiones de plataforma
tiene un nodo. La capacidad es grpc_platform.
Métricas
Los gauges se actualizan cada 10 segundos. Los
SendStream abiertos y las peticiones retenidas en
ellos están en el bloque grpc de health.
Cuando algo va mal
Cada login rechazado, y cada sesión, muestra la dirección del proxy
Cada login rechazado, y cada sesión, muestra la dirección del proxy
smsg.grpc.proxy.forwarding está desactivado, o hops no coincide con el número de proxies.
Corrígelo antes de que fail2ban cuente diez rechazos desde el proxy y lo banee.Las llamadas fallan en el transporte antes de que la pasarela responda
Las llamadas fallan en el transporte antes de que la pasarela responda
Algo en el camino habla HTTP/1.1: un
proxy_pass en lugar de grpc_pass, o un balanceador de carga
sin HTTP/2 hacia el back end. O el cliente usa TLS contra el listener sin cifrar, o al revés.El feed de un cliente no para de crecer
El feed de un cliente no para de crecer
Pide acuses sin
dlr_url y no los lee, o los lee sin confirmarlos. grpc.receipts en health lista
los logins con más profundidad; redelivered_total subiendo con acked_total plano es el segundo caso.Relacionado
API gRPC
Lo que ven tus clientes.
Bloquear clientes abusivos
El registro de logins rechazados, y los motivos que nunca banean.