Passer au contenu principal
À partir de la passerelle 0.15.9, les clients peuvent envoyer sur gRPC en plus de REST et SMPP, et récupérer leurs accusés de livraison depuis un flux durable au lieu de faire tourner un webhook. Le côté client est décrit sous API gRPC ; cette page est celle de l’opérateur.
gRPC est désactivé tant que vous ne le configurez pas. Une mise à niveau vers 0.15.9 ne change rien de visible pour un client : sans port gRPC, la passerelle répond à chaque appel gRPC UNAVAILABLE (GRPC_DISABLED), et l’API REST se comporte exactement comme avant.

L’activer

Définissez le port dans le fichier d’environnement et redémarrez :
Ou laissez l’installateur l’écrire, sur une nouvelle installation ou une installation existante :
update n’écrit le port que si vous passez --grpc ou --grpc-port ; sans eux, une valeur existante est affichée et laissée telle quelle, et aucune n’est jamais ajoutée.
Ne donnez jamais à gRPC le port de gestion (9000) ni le port REST. L’installateur refuse un port gRPC qui est déjà le port SMPP, HTTP ou de gestion de l’installation.
Avec --firewall, l’installateur n’ouvre le port gRPC que s’il est lié à autre chose que loopback.

Le vérifier

liste fireflo.v1.AuthService, fireflo.v1.SendService et fireflo.v1.ReceiptService (avec la réflexion activée). /ops/health porte un bloc grpc — enabled, host, port tel que lié, tls, les sessions actives sur ce nœud, les streams ouverts, et un bloc receipts pour le flux.

Derrière un proxy

gRPC a besoin de HTTP/2 de bout en bout. Un proxy_pass HTTP/1.1 ne le transporte pas. Avec nginx :
Sans les deux timeouts, nginx ferme un flux Subscribe silencieux au bout de 60 secondes.

Dites à la passerelle que le proxy est là

Derrière un proxy, chaque appel arrive depuis l’adresse du proxy. Tant que la passerelle ne fait pas confiance au X-Forwarded-For du proxy, chaque session est liée au proxy, chaque vérification d’adresse autorisée voit le proxy, et chaque login refusé est enregistré avec l’adresse du proxy — donc fail2ban bannit le proxy, et tous les clients derrière lui.
Les deux sont des réglages de plateforme et s’appliquent à l’appel suivant. La passerelle journalise un avertissement une fois lorsqu’elle voit un X-Forwarded-For venant d’une adresse privée à laquelle elle ne fait pas confiance — le signe que ce réglage manque.

TLS sur le port lui-même

Le listener parle HTTP/2 en clair (h2c) par défaut, pour un proxy qui termine TLS. Pour que la passerelle parle TLS elle-même, ajoutez au fichier d’environnement :
Health rapporte alors grpc.tls: true, et les clients se connectent avec TLS au lieu de -plaintext.

Logins refusés et fail2ban

gRPC n’a besoin d’aucune jail propre. Un login gRPC refusé est écrit dans le même auth-failed.log que SMPP et REST, en nommant le listener et le port :
Une session expirée ne bannit jamais. Les sessions vivent dans la mémoire de la passerelle, donc un redémarrage les fait toutes expirer, et chaque client qui se reconnecte est refusé une fois (reason=sessionExpired) avant de refaire Login. Le filtre fourni ignore cette raison ; un appel sans aucun jeton est missingCredential, et il est compté. fireflo-install update rafraîchit le filtre installé de la passerelle quand celui de la version diffère, puis recharge fail2ban. Voir Bloquer les clients abusifs.

Limites

Il n’y a pas de plafond de débit gRPC séparé, délibérément : un tel plafond doublerait ce qu’un compte a le droit d’envoyer. Les listeners SMPP gardent le leur (conf.maxRate.*), comme avant.

Le flux d’accusés

Un message envoyé par un login HTTP — sur gRPC ou REST — qui demande des accusés sans dlr_url voit ses accusés mis en file pour ce login, jusqu’à ce que le client les acquitte. Un dlr_url l’emporte toujours. Avec le flux activé, REST accepte aussi dlr=yes sans dlr-url ; avec le flux désactivé, c’est toujours un 400. Tous sont des réglages de plateforme, lus à chaud. L’emplacement de la file suit le stockage des accusés. Sur un nœud unique avec le stockage par défaut, elle est conservée sur le disque de ce nœud, à côté du stockage des accusés. Là où les accusés sont conservés dans PostgreSQL, le flux est aussi dans la base de données, partagé par tous les nœuds, donc un client peut lire sur n’importe quel nœud. Un nœud qui s’arrête proprement rend ses baux en s’arrêtant ; ceux d’un nœud qui meurt sont libérés par les nœuds survivants, ou expirent après le bail.
Un login qui demande des accusés et ne lit jamais son flux le remplit jusqu’au plafond. Surveillez grpc.receipts.logins_capped dans health et fireflo_grpc_receipts_oldest_age_seconds ; un client au plafond a cessé de lire, pas cessé d’envoyer.

Plateformes

Depuis la passerelle 0.15.10, une plateforme qui provisionne des comptes avec le jeton de gestion de la passerelle (OMNI, par exemple) peut utiliser le port gRPC sans le mot de passe d’aucun compte : PlatformLogin est signé avec le jeton de gestion exactement comme les requêtes de l’API de gestion, et la session obtenue envoie au nom des comptes dont le ref commence par le ref de la session (un préfixe terminé par /, comme omni:<install>/<tenant>/) — et lit leurs accusés de réception —, et d’aucun autre. Rien d’autre à activer que le port gRPC et le jeton de gestion déjà configuré ; sans le jeton, PlatformLogin répond UNAVAILABLE (MANAGEMENT_DISABLED). Les règles du jeton de gestion s’appliquent comme sur l’API de gestion : FIREFLO_MANAGEMENT_ALLOWED_IPS si vous la définissez, et TLS — sur le port ou sur un proxy de confiance — sauf si la plateforme se connecte en loopback. Les envois comptent dans le plafond de débit de chaque compte ; il n’y a pas de limite par plateforme. Une signature invalide, périmée ou rejouée est un refus surface=grpc bannissable qui nomme platform:<ref>, et grpc.sessions_platform dans health indique combien de sessions de plateforme un nœud détient. La capacité est grpc_platform.

Métriques

Les jauges sont rafraîchies toutes les 10 secondes. Les SendStream ouverts et les requêtes qu’ils détiennent sont dans le bloc grpc de health.

Quand quelque chose ne va pas

FIREFLO_GRPC_PORT n’est pas défini dans l’environnement avec lequel la passerelle démarre réellement, ou la passerelle n’a pas été redémarrée depuis. grpc.enabled dans health dit lequel des deux.
smsg.grpc.proxy.forwarding est désactivé, ou hops ne correspond pas au nombre de proxys. Corrigez-le avant que fail2ban compte dix refus venant du proxy et le bannisse.
Quelque chose sur le chemin parle HTTP/1.1 — un proxy_pass au lieu de grpc_pass, ou un load balancer sans HTTP/2 vers le back-end. Ou bien le client utilise TLS contre le listener en clair, ou l’inverse.
Il demande des accusés sans dlr_url et ne les lit pas, ou les lit sans les acquitter. grpc.receipts dans health liste les logins les plus chargés ; redelivered_total qui grimpe avec acked_total plat correspond au second cas.

Voir aussi

API gRPC

Ce que voient vos clients.

Bloquer les clients abusifs

L’enregistrement des logins refusés, et les raisons qui ne bannissent jamais.