Annotation
Dans un article précédent, l'organisation de la redondance des passerelles LAN a été envisagée. Comme solution, un script a été proposé qui à l'époque résolvait le problème, mais présentait un certain nombre d'inconvénients. Après un certain temps, il s'est avéré éliminer ces lacunes, réécrire partiellement le code et obtenir quelque chose d'acceptable à la sortie. Maintenant, nous pouvons dire que les scripts sont suffisamment testés pour être appelés stables. Pour simplifier la compréhension de l'ensemble du système, les principaux points de mise en place des services secondaires (en termes de sujet de l'article) seront partiellement reproduits ci-dessous. La raison est simple - pendant ce temps, les règles ipfw ont également été retravaillées, dns est allé vivre dans AD sur Samba4 avec un bind-frontend et des enregistrements mis à jour en toute sécurité depuis isc-dhcpd en utilisant kerberos, ainsi que des serveurs DNS secondaires comme bind sur les passerelles, CARP configuré ... En général, il est devenu beaucoup plus intéressant, mais en savoir plus sur quoi et comment cela fonctionne est ci-dessous. Tout ce qui peut être donné avec des références à la source sera conçu de manière à ne pas produire d'essence. Ce qui a été pris ailleurs, mais qui n'est plus disponible, sera donné ici avec les commentaires pertinents.
Présentation
Ainsi, il existe deux manières d'augmenter l'immunité au bruit du canal de communication avec le monde extérieur de la part du consommateur: sauvegarde de la passerelle et réservation du point de connexion. En d'autres termes, dans le premier cas, une deuxième passerelle est mise en place, qui sera activée si la première échoue, dans le second cas, un canal Internet de secours sera organisé en cas de problème avec le principal, et plus ils traversent, mieux c'est, évidemment. Si
CARP résout la première tâche pour FreeBSD, alors la seconde, après avoir organisé le deuxième canal externe, peut, encore une fois, être résolue de plusieurs manières. Au minimum, vous pouvez organiser l'équilibrage du trafic ou la commutation entre les canaux. En raison de la grande différence dans la bande passante des canaux externes, la première option ne me
convenait pas, donc le principal coupable de la publication a été écrit:
ToFoIn - un ensemble de scripts bash qui vise à résoudre les problèmes de diagnostic et à passer à un canal externe fonctionnel. Après raffinement, il peut être appliqué à n passerelles et m canaux. La situation est faible, où n et m sont supérieurs à 2, mais les scripts ci-dessous devraient fonctionner jusqu'à de grandes valeurs de n et m, car Logiquement, la limite n'est pas fixée. En général, je soupçonne qu'en utilisant ces scripts, il est possible de résoudre un éventail assez large de tâches, selon l'état de la connexion, limité, peut-être, uniquement par l'imagination.

Une telle topologie réseau suppose approximativement sous la forme la plus simple l'utilisation d'un ensemble de scripts ToFoIn. Bien sûr, les scripts devraient fonctionner dans le cas d'un seul routeur, mais dans ce cas, vous devrez changer le module Daemon pour supprimer la dépendance de la séquence d'actions sur l'état CARP, qui sera simplement absent dans le système. La réservation ultérieure de ces nœuds et d'autres ne dépend que du degré d'importance des services correspondants.
Buts et objectifs
L'objectif du projet, comme précédemment, est de créer un progiciel universel et facilement évolutif axé sur l'identification des problèmes dans les connexions externes et internes et le passage automatique à des connexions exploitables. En termes généraux, la logique est la suivante:
- Il y a n «routeurs» avec m canaux externes sur chacun. De plus, tous les n «routeurs» sont dans une hiérarchie stricte et sont connectés les uns aux autres en utilisant CARP sur toutes les interfaces nécessaires.
- Un agent travaille indépendamment sur chaque machine, dont la tâche est basée sur le statut CARP actuel de sa machine:
- Si sauvegarde - détectez et configurez la machine sur un routeur qui est actuellement le maître;
- Si maître - vérifiez l'état des connexions au moment actuel et, si nécessaire, basculez entre les canaux externes.
Solution
Le réseau interne dispose de CARP, qui fournit des passerelles de sauvegarde et vous permet de ne pas modifier les paramètres des autres périphériques réseau sur le réseau interne lors du changement de canal.
Dhcpd fonctionne en mode primaire-secondaire et, en général, peu importe les autres rôles joués par sa machine - la connexion entre dhcpd se produit sur le réseau interne, que les routeurs regardent toujours.
La liaison principale est supprimée dans AD, qui est masquée dans le réseau local, tandis que les serveurs de liaison secondaires travaillent sur les routeurs de la passerelle sur un pied d'égalité.
Les règles ipfw diffèrent selon le canal considéré comme le canal principal à un moment donné et sont redémarrées par le module Daemon lors du changement de rôle.
Enfin sur les scripts eux-mêmes. Maintenant, les fichiers sont situés dans les répertoires appropriés, fonctionnent à partir de leur utilisateur et ont un script de démarrage dans rc.d. Les tâches qui nécessitent un accès root sont résolues par sudo. Il existe un script d'installation qui prend en compte la présence éventuelle d'une version installée, ainsi qu'un fichier de paramètres assez détaillé. Les modules sont les mêmes avec des changements mineurs, certains n'ont presque pas changé de fonctionnalité:
Le démon - comme son nom l'indique - est le processus principal qui exécute les modules de test et de commutation sur une minuterie, et surveille également CARP.
Testeur - teste toujours les communications externes à l'aide de la commande ping. (s'il est en marche, il considère que la machine a CARP à l'état maître)
Juge - sur la base des résultats du test, détermine quel canal externe fonctionne et si la commutation est nécessaire, effectue la commutation (s'il est en cours d'exécution, il considère que la machine a CARP à l'état maître).
Scout est un nouveau module. Il démarre lorsque CARP est en état de sauvegarde. Il est nécessaire de déterminer lequel des routeurs restants est actuellement le principal.
Logger - responsable de la journalisation des événements. Il est nécessaire pour que les informations sur les événements ne soient pas dupliquées et que le magazine soit plus facile à lire.
Watchdog - fonctionne selon le calendrier de crontab. Il détermine les «gels» de tous les modules et (dans la mesure du possible) essaie de résoudre les problèmes qui se sont posés. C'est-à-dire clouer tout le monde, tout simplement.
En plus des scripts eux-mêmes, il convient de considérer certains fichiers plus importants:
Tofoin.conf - un seul fichier de paramètres.
Tofoin.log - un seul fichier journal des événements.
Result_ <numéro de canal interne> est le fichier de travail, les résultats des tests sont ajoutés ici, créés dans / tmp à côté de .pid et d'autres fichiers de travail.
Je peux volontiers répondre aux questions concernant le fonctionnement des modules, en expliquant les solutions dans les commentaires.
Partie technique
Équipement
Par rapport à la période précédente, les passerelles sont passées à P4, ont reçu 1536 Mo de RAM et trois disques durs de 40 Go (miroir + disque de rechange). Les cartes réseau sont toujours PCI, les PSU sont normales, naturellement en présence d'un onduleur.
L'augmentation de la capacité est associée au fer libéré et à la mise à jour trop fastidieuse de la source, mais surtout la première. OS FreeBSD 11.1, FS zfs.
Paramètres des composants du système
Plus de détailsLe noyau est compilé avec de tels paramètres supplémentaires (quelque chose peut également être défini dans le chargeur, mais c'est mieux de cette façon):
options IPFIREWALL
Paramètres /boot/loader.conf:
geom_mirror_load="YES" zfs_load="YES" kern.geom.label.gptid.enable="0" vm.kmem_size="1024M" vm.kmem_size_max="1024M" vfs.zfs.arc_max="512M" vfs.zfs.vdev.cache.size="30M" vfs.zfs.prefetch_disable=1 kern.vty=vt
Paramètres /etc/rc.conf sur la première machine (la configuration CARP est d'un intérêt majeur):
ifconfig_eth0="up" vlans_eth0="vlan111 vlan222" create_args_vlan111="vlan 111" create_args_vlan222="vlan 222" ifconfig_eth1="up" vlans_eth1="vlan333 vlan444 vlan555" create_args_vlan333="vlan 333" create_args_vlan444="vlan 444" create_args_vlan555="vlan 555" ifconfig_eth2="up" vlans_eth2="vlan666 vlan777 vlan888" create_args_vlan666="vlan 666" create_args_vlan777="vlan 777" create_args_vlan888="vlan 888" ifconfig_vlan666="inet 192.168.0.1/24" ifconfig_vlan666_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.0.5/32" ifconfig_vlan777="inet 192.168.1.1/24" ifconfig_vlan777_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.1.5/32" ifconfig_vlan888="inet 192.168.2.1/24" ifconfig_vlan888_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.2.5/32" ifconfig_vlan111="inet 192.168.3.1/30" ifconfig_vlan111_alias0="vhid 1 advskew 100 pass MyPassword alias 1.1.1.2/24" ifconfig_vlan222="inet 192.168.4.1/30" ifconfig_vlan333="inet 192.168.5.1/30" ifconfig_vlan333_alias0="vhid 1 advskew 100 pass MyPassword alias 2.2.2.2/30" ifconfig_vlan444="inet 192.168.6.1/30" ifconfig_vlan444_alias0="vhid 1 advskew 100 pass MyPassword alias 3.3.3.2/30" ifconfig_vlan555="inet 192.168.7.1/30" defaultrouter="1.1.1.1" setfib1_enable="YES" setfib1_defaultrouter="3.3.3.1" setfib2_enable="YES" setfib2_defaultrouter="2.2.2.1" zfs_enable="YES" named_enable="YES" dhcpd_enable="YES" firewall_enable="YES" firewall_logging="YES" firewall_script="/etc/firewall.sh" gateway_enable="YES" tofoin_enable="YES"
Légende:
eth0, eth1, eth2 - adaptateurs physiques
vlan666, vlan777, vlan888 - adaptateurs LAN virtuels,
vlan222 et vlan555 - adaptateurs pour la communication redondante entre les cartes réseau externes (ils peuvent ne plus être nécessaires, ils ont été activement utilisés plus tôt)
vlan111 - le canal externe principal
vlan444 - canal externe de sauvegarde
vlan333 - téléphonieParamètres /etc/rc.conf sur la deuxième machine (la configuration CARP est d'un intérêt majeur, certaines des lignes en double sont supprimées):
ifconfig_vlan666="inet 192.168.0.2/24" ifconfig_vlan666_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.0.5/32" ifconfig_vlan777="inet 192.168.1.2/24" ifconfig_vlan777_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.1.5/32" ifconfig_vlan888="inet 192.168.2.2/24" ifconfig_vlan888_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.2.5/32" ifconfig_vlan111="inet 192.168.3.2/30" ifconfig_vlan111_alias0="vhid 1 advskew 0 pass MyPassword alias 1.1.1.2/24" ifconfig_vlan222="inet 192.168.4.2/30" ifconfig_vlan333="inet 192.168.5.2/30" ifconfig_vlan333_alias0="vhid 1 advskew 0 pass MyPassword alias 2.2.2.2/30" ifconfig_vlan444="inet 192.168.6.2/30" ifconfig_vlan444_alias0="vhid 1 advskew 0 pass MyPassword alias 3.3.3.2/30" ifconfig_vlan555="inet 192.168.7.2/30" defaultrouter="1.1.1.1" setfib1_enable="YES" setfib1_defaultrouter="3.3.3.1" setfib2_enable="YES" setfib2_defaultrouter="2.2.2.1"
Certaines règles utiles lors de la configuration d'ipfw (nat) sont:
Pour autoriser le trafic CARP:
/sbin/ipfw -q add allow carp from any to any
Nat "Nucléaire":
/sbin/ipfw -q nat 1 config log ip vlan111 reset same_ports deny_in unreg_only /sbin/ipfw -q add nat 1 ip from any to any in
Utilisation de tables de routage spécifiques avec des adaptateurs spécifiques:
/sbin/ipfw -q add setfib 0 all from any to any via vlan666
En général, je pourrais écrire un article séparé sur les paramètres ipfw que j'ai utilisés, mais c'est une autre fois.
Logiciels tiers
Plus de détailsComme il est nécessaire de travailler simultanément avec deux canaux externes ou plus, il est pratique d'avoir plusieurs tables de routage, une pour chaque canal. Et ce serait bien si ces tables étaient créées au démarrage elles-mêmes. Le script rc.d setfib vous aidera. La logique utilisée dans ToFoIn suppose que le nom de fichier (setfib1, setfib2, etc.) correspond au numéro de la table dans laquelle un seul script ajoute une route par défaut. Par défaut, la table porte le numéro "0".
Les serveurs DNS avec Bind dans le rôle principal fonctionnent en mode secondaire, le principal est samba4 + bind, caché dans le réseau local. La configuration de la liaison secondaire est magnifiquement révélée dans le livre "DNS and BIND" de Cricket Lee et Paul Albitz. Je ne me souviens pas d'exigences particulières qui prennent en compte l'utilisation de samba4 pour les serveurs secondaires, et je ne les mentionne pas dans le fichier de paramètres. Sauf si, pour différents canaux Internet, vous devrez peut-être créer 2 fichiers différents, qui seront ensuite copiés par le script ToFoIn à l'endroit où bind les lira. Cela est dû au fait que lors de la spécification des adresses des serveurs DNS des deux fournisseurs dans le même fichier, compte tenu du fait que la liaison fonctionne avec une seule table de routage, un problème se pose concernant la résolution des adresses des serveurs en amont qui sont inaccessibles à un certain moment.
Basculement isc-dhcpd. Dhcpd n'est pas essentiel pour ToFoIn, de plus, son absence n'affectera pas du tout les scripts, cependant, comme il me semble, il est tout à fait logique de placer des serveurs dhcp sur des passerelles et la question de basculement se pose toujours. Et ici, par rapport à la dernière fois, c'est devenu plus intéressant ... En plus des réglages nécessaires au basculement, que j'ai décrits la
dernière fois (début de la section "preset" dans le menu déroulant).
Vous aurez également besoin d'un script pour mettre à jour en toute sécurité les enregistrements DNS dans AD à l'aide de samba4. Le serveur samba4 lui-même devrait juste être installé. La configuration et le lancement ne sont pas nécessaires, nous ne sommes intéressés que par les outils de gestion fournis avec le kit. Ceux qui le souhaitent peuvent trouver d'autres informations dans la section "DHCP avec mises
à jour DNS dynamiques"
sur .
Ça a l'air effrayant, mais ça marche.
À ce sujet, la configuration du logiciel tiers est terminée.
Un peu sur ToFoIn
Tout le texte du projet ainsi que le script d'installation sont disponibles sur
gitlab .
En conclusion, un exemple de paramètres du fichier de paramètres ToFoIn est considéré:Le nombre de routeurs utilisés dans le système:
RNUMBER=2
Lorsque vous utilisez des sous-réseaux supplémentaires, vous devez définir un itinéraire par défaut lorsque le routeur devient le principal. Ici, vous pouvez spécifier le numéro du fichier setfib correspondant qui sera redémarré. Dans cet exemple, setfib2:
ADDITLAN=2
Nom de l'adaptateur interne:
INT_IF=vlan666
Toutes les autres interfaces sur lesquelles les routeurs sont connectés via CARP. Obligatoire pour contrôler et maintenir le même état de toutes les interfaces:
ALL_IF="vlan111 vlan333 vlan444 vlan666 vlan777 vlan888"
vhid utilisé lors de la configuration de CARP:
CARP_VHID=1
Les adresses IP dans le réseau interne des autres routeurs par ordre d'importance, si nécessaire, puis ASERV_IP_2, ASERV_IP_3, etc. sont simplement utilisées.
ASERV_IP_1=192.168.0.2
Nombre de canaux de connexion externes:
CNUMBER=2
Paramètres du canal de connexion externe principal:
Nom de l'adaptateur:
EXT_0_IF=vlan111
Numéro de table de routage:
RTABLE_0=0
Passerelle par défaut:
DEFAULT_GATEWAY=2.2.2.1
Paramètres du canal de connexion externe de sauvegarde:
Nom de l'adaptateur:
EXT_1_IF=vlan444
Numéro de table de routage:
RTABLE_1=1
Une passerelle par défaut n'est pas requise, car pour toutes les tables de routage, à l'exception de la table principale, le script rc.d setfib <numéro de table> est utilisé, ce qui, comme la logique le suppose, doit correspondre au numéro de table.
Paramètres du module de testeur:
Le nombre d'adresses à vérifier:
TNUMBER=2
Adresses des machines par lesquelles les requêtes ping sont envoyées. Il est préférable d'utiliser le nom de domaine dans le premier cas, et seulement après cela l'adresse IP:
PTARGET_0=ya.ru PTARGET_1=8.8.8.8
Le nombre de paquets ping envoyés par cible:
PNUMBER=2
Paramètres du module de juge
Le nombre de tests réussis de la chaîne principale avant d'y revenir. Le temps de retour vers le canal principal après la reprise de son fonctionnement est approximativement calculé par la formule: (WNUMBER + 1) * SECOND JUGEPERIOD secondes.
WNUMBER=3
Paramètres du module d'enregistreur
Ces 2 paramètres indiquent la fréquence à laquelle l'enregistreur enregistrera les événements récurrents. Après l'enregistrement de l'événement, la prochaine fois que LOGFREQ1 indique le nombre de tentatives, LOGFREQ2 correspond au nombre de tentatives. Seuls les événements consécutifs sont pris en compte.
LOGFREQ1=5 LOGFREQ2=20
Minuteries de démarrage du module en quelques secondes
La période de lancement du module Tester. Il est logique de s'appuyer sur le temps des tentatives infructueuses pour tester toutes les cibles.
TESTERPERIOD=240
La période de lancement du module Juge. N'installez pas moins de TESTERPERIOD.
JUDGEPERIOD=300
La période de lancement du module Scout.
SCOUTPERIOD=360
La période d'attente avant de vérifier les temporisateurs de démarrage des modules Testeur et Juge. Il est logique de définir une valeur inférieure ou égale à la valeur de TESTERPERIOD.
SENSITIVITY=60
Délai après lequel un module de travail est considéré comme suspendu. Utilisé par le module Watchdog.
TESTERLIMIT=40 JUDGELIMIT=30 LOGGERLIMIT=20 SCOUTLIMIT=120 WATCHDOGLIMIT=150
Chemins d'accès aux fichiers et répertoires
Chemin vers le script ipfw.
FIRESCRIPT=/etc/firewall.sh
Paramètres IPFW. Si les paramètres ipfw ne sont pas déplacés vers un fichier séparé, alors FIRESCRIPT = FIRESETDEF.
FIRESETDEF=/etc/firewall/config
Chemin d'accès aux paramètres ipfw pour le canal externe principal:
FIRESET_0=/etc/firewall/config_0
Le chemin d'accès aux paramètres ipfw pour le canal externe de sauvegarde, si nécessaire, vous pouvez continuer FIRESET_2, etc.:
FIRESET_1=/etc/firewall/config_1
Chemins pour lier les paramètres
BINDSETDEF=/usr/local/etc/namedb/named.conf
Paramètres de liaison pour le canal externe principal:
BINDSET_0=/usr/local/etc/namedb/named.conf.0
Liez les paramètres du canal externe de sauvegarde, si nécessaire, vous pouvez continuer BINDSET_2, etc.:
BINDSET_1=/usr/local/etc/namedb/named.conf.1
Chemins d'accès à tous les exécutables ToFoIn:
DAEMON=/local/sbin/tofoin/daemon.sh TESTER=/usr/local/sbin/tofoin/tester.sh JUDGE=/usr/local/sbin/tofoin/judge.sh LOGGER=/usr/local/sbin/tofoin/logger.sh SCOUT=/usr/local/sbin/tofoin/scout.sh WATCHDOG=/usr/local/sbin/tofoin/watchdog.sh
Journal des événements. Ce fichier n'est PAS créé à l'installation maintenant:
LOGFILE=/var/log/tofoin.log
Les fichiers et répertoires temporaires sont créés au démarrage des modules correspondants, certains sont supprimés à l'arrêt:
DIR_TMP=/tmp/tofoin DIR_PID=/var/run/tofoin JUDGEMETER=/tmp/tofoin/judgemeter PREVSTATE=/tmp/tofoin/prevstate SCOUTGATE=/tmp/tofoin/scoutgate LOGTMP=/tmp/tofoin/logger.tmp LOGMETER=/tmp/tofoin/logmeter DAEMON_PID=/var/run/tofoin/daemon.pid TESTER_PID=/var/run/tofoin SCOUT_PID=/var/run/tofoin/scout.pid JUDGE_PID=/var/run/tofoin/judge.pid LOGGER_PID=/var/run/tofoin/logger.pid WATCHDOG_PID=/var/run/tofoin_watchdog.pid
Résumé
Il s'est avéré être un ensemble de scripts entièrement fonctionnel et fiable qui répond bien à la tâche de basculer vers le canal de travail dans le cas de 2 routeurs avec 2 canaux de communication externes.
Plans
Mes plans pour ce projet concernent, peut-être, la réécriture de bash en pure sh pour se débarrasser des logiciels inutiles sur le serveur. D'un autre côté, maintenant tout fonctionne à merveille et je n'ai vraiment pas envie d'interférer dans ce processus, en plus, passer à sh est lourd de constructions de langage plus terribles nécessaires pour obtenir le même résultat.
Pour le reste, probablement, il vaudrait la peine d'envisager la meilleure implémentation des modules de test.
Références:
←
Article précédent→
Page du projet ToFoIn sur gitlab