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 :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.
Avec
--firewall, l’installateur n’ouvre le port gRPC que s’il est lié à autre chose que loopback.
Le vérifier
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. Unproxy_pass HTTP/1.1 ne le transporte pas. Avec
nginx :
Subscribe silencieux au bout de 60 secondes.
Dites à la passerelle que le proxy est là
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 :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êmeauth-failed.log
que SMPP et REST, en nommant le listener et le port :
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 sansdlr_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.
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
Chaque login refusé, et chaque session, montre l'adresse du proxy
Chaque login refusé, et chaque session, montre l'adresse du proxy
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.Les appels échouent au niveau du transport avant que la passerelle réponde
Les appels échouent au niveau du transport avant que la passerelle réponde
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.Le flux d'un client ne cesse de grossir
Le flux d'un client ne cesse de grossir
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.