SystÚme de gestion de configuration réseau de filtrage Qrator

SystÚme de gestion de configuration réseau de filtrage Qrator

TL; DR: Description de l'architecture client-serveur de notre systĂšme de gestion de configuration rĂ©seau interne, QControl. Il est basĂ© sur un protocole de transport Ă  deux couches qui fonctionne avec des messages compressĂ©s au format gzip sans dĂ©compression entre les points de terminaison. Les routeurs et points de terminaison distribuĂ©s reçoivent des mises Ă  jour de configuration, et le protocole lui-mĂȘme permet l'installation de relais intermĂ©diaires localisĂ©s. Le systĂšme est construit sur le principe sauvegarde diffĂ©rentielle (« rĂ©cent-stable », expliquĂ© ci-dessous) et utilise le langage de requĂȘte JMESpath ainsi que le moteur de crĂ©ation de modĂšles Jinja pour restituer les fichiers de configuration.

Qrator Labs exploite un rĂ©seau d'attĂ©nuation des attaques distribuĂ© Ă  l'Ă©chelle mondiale. Notre rĂ©seau fonctionne selon le principe anycast et les sous-rĂ©seaux sont annoncĂ©s via BGP. Étant un rĂ©seau Anycast BGP physiquement situĂ© dans plusieurs rĂ©gions de la Terre, nous pouvons traiter et filtrer le trafic illĂ©gitime plus prĂšs du cƓur de l'Internet - les opĂ©rateurs de niveau 1.

D’un autre cĂŽtĂ©, ĂȘtre un rĂ©seau gĂ©ographiquement distribuĂ© n’est pas facile. La communication entre les points de prĂ©sence du rĂ©seau est essentielle pour que le fournisseur de services de sĂ©curitĂ© dispose d'une configuration cohĂ©rente de tous les nƓuds du rĂ©seau, et les mette Ă  jour en temps opportun. Par consĂ©quent, afin de fournir le niveau de service de base le plus Ă©levĂ© possible au consommateur, nous devions trouver un moyen de synchroniser de maniĂšre fiable les donnĂ©es de configuration sur tous les continents.

Au commencement était la Parole. Il est rapidement devenu un protocole de communication nécessitant une mise à jour.


La pierre angulaire de l'existence de QControl, et en mĂȘme temps la principale raison pour laquelle on consacre beaucoup de temps et de ressources Ă  la construction de ce type de protocole, est la nĂ©cessitĂ© d'obtenir une source unique de configuration faisant autoritĂ© et, finalement, de synchroniser nos points de prĂ©sence. avec ça. Le stockage lui-mĂȘme n’était qu’une des nombreuses exigences lors du dĂ©veloppement de QControl. De plus, nous avions Ă©galement besoin d'intĂ©grations avec les services existants et planifiĂ©s aux points de prĂ©sence (POP), de mĂ©thodes intelligentes (et personnalisables) pour la validation des donnĂ©es, ainsi que de contrĂŽle d'accĂšs. En plus de cela, nous voulions Ă©galement contrĂŽler un tel systĂšme Ă  l'aide de commandes plutĂŽt que de modifier des fichiers. Avant QControl, les donnĂ©es Ă©taient envoyĂ©es aux points de prĂ©sence presque manuellement. Si l’un des points de prĂ©sence n’était pas disponible et que nous oubliions de le mettre Ă  jour par la suite, la configuration se retrouverait dĂ©synchronisĂ©e et nous perdrions du temps Ă  le remettre en marche.

En conséquence, nous avons proposé le schéma suivant :
SystÚme de gestion de configuration réseau de filtrage Qrator
Le serveur de configuration est responsable de la validation et du stockage des donnĂ©es ; le routeur dispose de plusieurs points de terminaison qui reçoivent et diffusent les mises Ă  jour de configuration des clients et des Ă©quipes d'assistance vers le serveur, et du serveur vers les points de prĂ©sence.

La qualité de la connexion Internet varie encore considérablement à travers le monde - pour illustrer ce point, regardons un simple MTR de Prague, en République tchÚque, à Singapour et Hong Kong.

SystÚme de gestion de configuration réseau de filtrage Qrator
MTR de Prague Ă  Singapour

SystÚme de gestion de configuration réseau de filtrage Qrator
MĂȘme chose Ă  Hong Kong

Une latence Ă©levĂ©e signifie une vitesse plus faible. De plus, il y a une perte de paquets. La largeur des canaux ne compense pas ce problĂšme, qui doit toujours ĂȘtre pris en compte lors de la construction de systĂšmes dĂ©centralisĂ©s.

La configuration complĂšte d'un point de prĂ©sence reprĂ©sente une quantitĂ© importante de donnĂ©es qui doivent ĂȘtre envoyĂ©es Ă  de nombreux destinataires via des connexions peu fiables. Heureusement, mĂȘme si la configuration change constamment, elle se produit par petits incrĂ©ments.

Conception récente et stable

On peut dire que construire un rĂ©seau distribuĂ© basĂ© sur le principe des mises Ă  jour incrĂ©mentielles est une solution assez Ă©vidente. Mais il y a beaucoup de problĂšmes avec les diffĂ©rences. Nous devons sauvegarder toutes les diffĂ©rences entre les points de rĂ©fĂ©rence, et Ă©galement pouvoir les renvoyer au cas oĂč quelqu'un aurait manquĂ© une partie des donnĂ©es. Chaque destination doit les appliquer dans un ordre strictement spĂ©cifiĂ©. Typiquement, dans le cas de plusieurs destinations, une telle opĂ©ration peut prendre beaucoup de temps. Le destinataire doit Ă©galement pouvoir demander les piĂšces manquantes et, bien entendu, la partie centrale doit rĂ©pondre correctement Ă  une telle demande, en envoyant uniquement les donnĂ©es manquantes.

En consĂ©quence, nous sommes arrivĂ©s Ă  une solution plutĂŽt intĂ©ressante - nous n'avons qu'une seule couche de rĂ©fĂ©rence, fixe, appelons-la stable, et une seule diffĂ©rence pour elle - rĂ©cente. Chaque rĂ©cent est basĂ© sur le dernier stable gĂ©nĂ©rĂ© et suffit Ă  reconstruire les donnĂ©es de configuration. DĂšs que le nouveau et rĂ©cent arrive Ă  destination, l’ancien n’est plus nĂ©cessaire.

Il ne reste plus qu'à envoyer de temps en temps une nouvelle configuration stable, par exemple parce que la récente est devenue trop volumineuse. Ce qui est également important ici, c'est que nous envoyons toutes ces mises à jour en mode diffusion/multidiffusion, sans nous soucier des destinataires individuels et de leur capacité à rassembler des éléments de données. Une fois que nous sommes sûrs que tout le monde a la bonne écurie, nous envoyons uniquement les nouvelles et récentes. Vaut-il la peine de préciser que cela fonctionne ? Travaux. Stable est mis en cache sur le serveur de configuration et les destinataires, récent est créé selon les besoins.

Architecture du transport Ă  deux niveaux

Pourquoi avons-nous construit notre transport sur deux niveaux ? La réponse est assez simple : nous voulions dissocier le routage de la logique de haut niveau, en nous inspirant du modÚle OSI avec ses couches transport et application. Nous avons utilisé Thrift pour le rÎle de protocole de transport et le format de sérialisation msgpack pour le format de haut niveau des messages de contrÎle. C'est pourquoi le routeur (exécutant la multidiffusion/diffusion/relais) ne regarde pas à l'intérieur de msgpack, ne décompresse ni ne regroupe le contenu et transfÚre uniquement les données.

Thrift (de l'anglais - « thrift », prononcé [Ξrift]) est un langage de description d'interface utilisé pour définir et créer des services pour différents langages de programmation. Il s'agit d'un framework pour les appels de procédures distantes (RPC). Combine un pipeline logiciel avec un moteur de génération de code pour développer des services qui fonctionnent plus ou moins efficacement et facilement entre les langages.

Nous avons choisi le framework Thrift en raison du RPC et de la prise en charge de nombreux langages. Comme d'habitude, les parties faciles Ă©taient le client et le serveur. Cependant, le routeur s'est avĂ©rĂ© ĂȘtre un problĂšme difficile Ă  rĂ©soudre, en partie Ă  cause de l'absence de solution prĂȘte Ă  l'emploi au cours de notre dĂ©veloppement.

SystÚme de gestion de configuration réseau de filtrage QratorIl existe d'autres options, comme protobuf / gRPC, cependant, lorsque nous avons démarré notre projet, gRPC était assez nouveau et nous n'avons pas osé l'adopter.

Bien sĂ»r, nous pourrions (et en fait aurions dĂ») construire notre propre vĂ©lo. Il serait plus facile de crĂ©er un protocole rĂ©pondant Ă  nos besoins car l'architecture client-serveur est relativement simple Ă  mettre en Ɠuvre par rapport Ă  la construction d'un routeur sur Thrift. D’une maniĂšre ou d’une autre, il existe un biais traditionnel en faveur des protocoles auto-Ă©crits et des implĂ©mentations de bibliothĂšques populaires (pour cause) ; en outre, lors des discussions, la question revient toujours : « Comment allons-nous porter cela dans d’autres langages ? » Nous avons donc immĂ©diatement rejetĂ© l'idĂ©e du vĂ©lo.

Msgpack est similaire à JSON, mais plus rapide et plus petit. Il s'agit d'un format de sérialisation de données binaires qui permet d'échanger des données entre plusieurs langues.

Au premier niveau, nous avons Thrift avec le minimum d'informations nécessaire au routeur pour transmettre le message. Au deuxiÚme niveau se trouvent les structures msgpack packagées.

Nous avons choisi msgpack car il est plus rapide et plus compact que JSON. Mais plus important encore, il prend en charge les types de donnĂ©es personnalisĂ©s, ce qui nous permet d'utiliser des fonctionnalitĂ©s intĂ©ressantes telles que la transmission de binaires bruts ou d'objets spĂ©ciaux indiquant l'absence de donnĂ©es, ce qui Ă©tait important pour notre schĂ©ma « rĂ©cent-stable Â».

Chemin JMES
JMESPath est un langage de requĂȘte JSON.
C'est exactement à quoi ressemble la description que nous obtenons de la documentation officielle de JMESPath, mais en fait, elle fait bien plus que cela. JMESPath vous permet de rechercher et de filtrer des sous-arbres dans une structure arborescente arbitraire et d'appliquer des modifications aux données à la volée. Il vous permet également d'ajouter des filtres spéciaux et des procédures de transformation de données. Bien sûr, cela nécessite un effort cérébral pour comprendre.

Jinja
Pour certains consommateurs, nous devons transformer la configuration en fichier. Nous utilisons donc un moteur de modÚles et Jinja est le choix évident. Avec son aide, nous générons un fichier de configuration à partir du modÚle et des données reçues à destination.

Pour gĂ©nĂ©rer un fichier de configuration, nous avons besoin d'une requĂȘte JMESPath, d'un modĂšle pour l'emplacement du fichier dans le FS et d'un modĂšle pour la configuration elle-mĂȘme. C'est Ă©galement une bonne idĂ©e Ă  ce stade de clarifier les autorisations des fichiers. Tout cela a Ă©tĂ© combinĂ© avec succĂšs dans un seul fichier - avant le dĂ©but du modĂšle de configuration, nous avons mis un en-tĂȘte au format YAML qui dĂ©crit le reste.

Par exemple:

---
selector: "[@][?@.fft._meta.version == `42`] | items([0].fft_config || `{}`)"
destination_filename: "fft/{{ match[0] }}.json"
file_mode: 0644
reload_daemons: [fft]
...
{{ dict(match[1]) | json(indent=2, sort_keys=True) }}

Afin de créer un fichier de configuration pour un nouveau service, nous ajoutons uniquement un nouveau fichier modÚle. Aucune modification du code source ou du logiciel sur les points de présence n'est requise.

Qu’est-ce qui a changĂ© depuis la mise en ligne de QControl ? La premiĂšre et la plus importante chose est la livraison cohĂ©rente et fiable des mises Ă  jour de configuration Ă  tous les nƓuds du rĂ©seau. La seconde est de recevoir un outil puissant pour vĂ©rifier la configuration et y apporter des modifications par notre Ă©quipe d'assistance, ainsi que par les consommateurs du service.

Nous avons pu faire tout cela en utilisant le schéma de mise à jour stable et récente pour simplifier la communication entre le serveur de configuration et les destinataires de la configuration. Utilisation d'un protocole à deux couches pour prendre en charge une méthode de routage des données indépendante du contenu. Intégration réussie d'un moteur de génération de configuration basé sur Jinja dans un réseau de filtrage distribué. Ce systÚme prend en charge un large éventail de méthodes de configuration pour nos périphériques distribués et hétérogÚnes.

Merci pour votre aide dans la rédaction du matériel. VolanDamrod, sérénité, Non.

version anglaise Publier.

Source: habr.com

Achetez un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Achetez un hĂ©bergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster