ToFoIn v 1. Reserva de puertas de enlace y cambio entre canales externos en FreeBSD

Anotación


En un artículo anterior, se consideró la organización de la redundancia para las puertas de enlace LAN. Como solución, se propuso un script que en ese momento solucionó el problema, pero tenía varios inconvenientes. Después de un tiempo, resultó eliminar estas deficiencias, reescribir parcialmente el código y obtener algo aceptable en la salida. Ahora podemos decir que las secuencias de comandos se prueban lo suficiente como para ser llamadas estables. Para simplificar la comprensión de todo el sistema, los puntos principales para configurar servicios secundarios (en términos del tema del artículo) se duplicarán parcialmente a continuación. La razón es simple: durante este tiempo las reglas de ipfw también fueron modificadas, dns se fue a vivir en AD en Samba4 con un bind-frontend y registros actualizados de forma segura desde isc-dhcpd usando kerberos, así como servidores dns secundarios como bind en las puertas de enlace, CARP configurada ... En general, se ha vuelto mucho más interesante, pero a continuación encontrará más información sobre qué y cómo funciona. Todo lo que se puede dar con referencias a la fuente se diseñará de tal manera que no produzca esencia. Lo que se tomó de otros lugares, pero que ya no está disponible, se dará aquí con comentarios relevantes.

Introduccion


Por lo tanto, hay dos formas de aumentar la inmunidad al ruido del canal de comunicación con el mundo exterior por parte del consumidor: copia de seguridad de la puerta de enlace y reserva del punto de conexión. En otras palabras, en el primer caso, se configura una segunda puerta de enlace, que se activará si falla la primera, en el segundo caso, se organizará un canal de Internet de respaldo en caso de problemas con el principal, y cuanto más se crucen, mejor, obviamente. Si CARP resuelve la primera tarea para FreeBSD, la segunda, después de organizar el segundo canal externo, puede, de nuevo, resolverse de varias maneras. Como mínimo, puede organizar el equilibrio del tráfico o cambiar entre canales. Debido a la gran diferencia en el ancho de banda de los canales externos, la primera opción no me convenía , por lo que el principal culpable de la publicación fue escrito: ToFoIn , un conjunto de scripts de bash que tiene como objetivo resolver problemas de diagnóstico y cambiar a un canal externo que funcione. Después del refinamiento, se puede aplicar a n puertas de enlace ym canales. La situación es débil, donde n y m son más de 2, pero los siguientes scripts deberían funcionar con valores grandes de n y m, porque Lógicamente, el límite no está establecido. En general, sospecho que usando estos scripts es posible resolver una gama bastante amplia de tareas, dependiendo del estado de la conexión, limitada, tal vez, solo por imaginación.


Aproximadamente, una topología de red de este tipo supone en la forma más simple el uso de un conjunto de scripts ToFoIn. Por supuesto, los scripts deben funcionar en el caso de un solo enrutador, pero en este caso, tendrá que cambiar el módulo Daemon fuertemente para eliminar la dependencia de la secuencia de acciones en el estado CARP, que simplemente estará ausente en el sistema. La reserva adicional de estos y otros nodos depende solo del grado de importancia de los servicios correspondientes.

Metas y objetivos


El objetivo del proyecto, como antes, es crear un paquete de software universal y fácilmente escalable enfocado en identificar problemas en conexiones externas e internas y cambiar automáticamente a conexiones viables. En términos generales, la lógica es la siguiente:

  • Hay n "enrutadores" con m canales externos en cada uno. Además, todos los "enrutadores" están en una jerarquía estricta y están conectados entre sí mediante CARP en todas las interfaces necesarias.
  • Un agente trabaja independientemente en cada máquina, cuya tarea se basa en el estado CARP actual de su máquina:
    • Si es una copia de seguridad: detecte y configure la máquina en un enrutador que actualmente es el maestro;
    • Si es maestro: verifique el estado de las conexiones en el momento actual y, si es necesario, cambie entre canales externos.

Solución


La red interna tiene CARP, que proporciona puertas de enlace de respaldo y le permite no cambiar la configuración de otros dispositivos de red en la red interna al cambiar de canal.

Dhcpd funciona en modo primario - secundario y, en general, no importa qué otras funciones juegue su máquina: la conexión entre dhcpd se produce en la red interna, que los enrutadores siempre observan.

El enlace maestro se elimina en AD, que está oculto en la red local, mientras que los servidores de enlace secundario trabajan en los enrutadores de la puerta de enlace en igualdad de condiciones.

Las reglas de ipfw difieren dependiendo de qué canal se considera el canal principal en un momento dado y son reiniciadas por el módulo Daemon cuando se cambian los roles.

Finalmente sobre los propios guiones. Ahora los archivos se encuentran en los directorios apropiados, funcionan desde su usuario y tienen un script de inicio en rc.d. Sudo resuelve las tareas que requieren acceso a la raíz. Existe un script de instalación que tiene en cuenta la posible presencia de una versión instalada, así como un archivo de configuración bastante detallado. Los módulos son los mismos con cambios menores, algunos casi no cambiaron en funcionalidad:

Daemon , como su nombre lo indica, es el proceso principal que ejecuta la prueba y cambia los módulos en un temporizador, y también monitorea CARP.
Probador : aún prueba las comunicaciones externas con el comando ping. (si se está ejecutando, considera que la máquina tiene CARP en el estado Maestro)
Juez : en función de los resultados de la prueba, determina qué canal externo funciona y si la conmutación es necesaria, realiza la conmutación (si está en funcionamiento, considera que la máquina tiene CARP en el estado Maestro).
Scout es un nuevo módulo. Se inicia cuando CARP está en estado de copia de seguridad. Es necesario determinar cuál de los enrutadores restantes es actualmente el principal.
Registrador : responsable del registro de eventos. Es necesario para que la información sobre eventos no se duplique y la revista sea más fácil de leer.
Watchdog : se ejecuta según el cronograma de crontab. Determina la "congelación" de todos los módulos y (siempre que sea posible) intenta resolver los problemas que han surgido. Es decir clavar a todos, simplemente poner.

Además de los scripts en sí, vale la pena considerar algunos archivos más importantes:

Tofoin.conf : un único archivo de configuración.
Tofoin.log : un único archivo de registro de eventos.
Result_ <número de canal interno> es el archivo de trabajo, los resultados de la prueba se agregan aquí, creados en / tmp junto a .pid y otros archivos de trabajo.

Con gusto puedo responder las preguntas sobre el funcionamiento de los módulos, explicando las soluciones en los comentarios.

Parte técnica


Equipo


En comparación con el tiempo anterior, las puertas de enlace se trasladaron a P4, recibieron 1536 Mb de RAM y tres discos duros de 40 Gb (espejo + repuesto). Las tarjetas de red siguen siendo PCI, las PSU son normales, naturalmente en presencia de un UPS.
El aumento de la capacidad está asociado con el hierro liberado y la actualización excesivamente tediosa de la fuente, pero principalmente la primera. Sistema operativo FreeBSD 11.1, FS zfs.

Configuración de componentes del sistema


Más detalles
El núcleo se compila con dichos parámetros adicionales (también se puede configurar algo en el cargador, pero es mejor así):

options IPFIREWALL # ipfw firewall options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=50 options IPFIREWALL_NAT options LIBALIAS options DUMMYNET options HZ=1000 options ROUTETABLES=4 options KSTACK_PAGES=4 options KVA_PAGES=512 device carp 

Configuración /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 

Configuración /etc/rc.conf en la primera máquina (la configuración CARP es de gran interés):
 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" 

Leyenda:
eth0, eth1, eth2 - adaptadores físicos
vlan666, vlan777, vlan888 - adaptadores de LAN virtuales,
vlan222 y vlan555: adaptadores para la comunicación redundante entre tarjetas de red externas (puede que ya no sean necesarias, se utilizaron activamente antes)
vlan111 - el canal externo principal
vlan444 - canal externo de respaldo
vlan333 - telefonía
Configuración /etc/rc.conf en la segunda máquina (la configuración CARP es de gran interés, se eliminan algunas de las líneas duplicadas):
 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" 

Algunas reglas que resultan útiles al configurar ipfw (nat) son:
Para permitir el tráfico de CARP:
 /sbin/ipfw -q add allow carp from any to any 

Nat "nuclear":
 /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 

Uso de tablas de enrutamiento específicas con adaptadores específicos:
 /sbin/ipfw -q add setfib 0 all from any to any via vlan666 

En general, podría escribir un artículo separado sobre la configuración de ipfw que utilicé, pero este es otro momento.

Software de terceros


Más detalles
Dado que existe la necesidad de trabajar simultáneamente con dos o más canales externos, para esto es conveniente tener varias tablas de enrutamiento, una para cada canal. Y sería bueno si estas tablas se crearan en el inicio. El script rc.d setfib te ayudará. La lógica utilizada en ToFoIn supone que el nombre del archivo (setfib1, setfib2, etc.) coincide con el número de la tabla en la que un solo script agrega una ruta predeterminada. La tabla por defecto tiene el número "0".
Los servidores DNS con Bind en el rol principal funcionan en modo secundario, el principal es samba4 + bind, oculto en la red local. La configuración del enlace secundario se revela maravillosamente en el libro de Cricket Lee y Paul Albitz "DNS and BIND". No recuerdo ningún requisito especial que tenga en cuenta el uso de samba4 para servidores secundarios, y no los menciono en el archivo de configuración. A menos que, para diferentes canales de Internet, es posible que deba crear 2 archivos diferentes, que luego serán copiados por el script ToFoIn en el lugar desde el cual se leerá el enlace. Esto se debe al hecho de que al especificar las direcciones de los servidores DNS de ambos proveedores en el mismo archivo, teniendo en cuenta que bind funciona con una sola tabla de enrutamiento, surge un problema con respecto a la resolución de direcciones de servidores ascendentes que son inaccesibles en un momento determinado.
Failover isc-dhcpd. Dhcpd no es esencial para ToFoIn, además, su ausencia no afectará a los scripts en absoluto, sin embargo, como me parece, es bastante lógico colocar servidores dhcp en las puertas de enlace y luego surge la pregunta de conmutación por error. Y aquí, en comparación con la última vez, se volvió más interesante ... Además de la configuración necesaria para la conmutación por error, que describí la última vez (el comienzo de la sección "preestablecida" dentro del menú desplegable).
También necesitará un script para actualizar de manera segura los registros dns en AD usando samba4. El servidor samba4 en sí solo debe instalarse. La configuración y el lanzamiento no son obligatorios, solo estamos interesados ​​en las herramientas de administración que vienen con el kit. Aquellos que lo deseen pueden encontrar otra información en la sección "DHCP con actualizaciones dinámicas de DNS" en .
Parece aterrador, pero funciona.
En esto con la configuración del software de terceros ha terminado.

Un poco sobre ToFoIn


Todo el texto del proyecto junto con el script de instalación está disponible en gitlab .

En conclusión, se considera un ejemplo de parámetros del archivo de configuración ToFoIn:
El número de enrutadores utilizados en el sistema:
 RNUMBER=2 

Cuando use subredes adicionales, debe establecer una ruta predeterminada cuando el enrutador se convierta en el primario. Aquí puede especificar el número del archivo setfib correspondiente que se reiniciará. En este ejemplo, setfib2:
 ADDITLAN=2 

Nombre del adaptador interno:
 INT_IF=vlan666 

Todas las demás interfaces en las que los enrutadores están conectados a través de CARP. Necesario para controlar y mantener el mismo estado de todas las interfaces:
 ALL_IF="vlan111 vlan333 vlan444 vlan666 vlan777 vlan888" 

vhid que se usó al configurar CARP:
 CARP_VHID=1 

Las direcciones IP en la red interna de otros enrutadores en orden de importancia, si es necesario, entonces simplemente se usan ASERV_IP_2, ASERV_IP_3, etc.
 ASERV_IP_1=192.168.0.2 

Número de canales de conexión externos:
 CNUMBER=2 

Configuraciones para el canal de conexión externo principal:
Nombre del adaptador:
 EXT_0_IF=vlan111 

Número de tabla de enrutamiento:
 RTABLE_0=0 

Puerta de enlace predeterminada:
 DEFAULT_GATEWAY=2.2.2.1 

Configuraciones para el canal de conexión externa de respaldo:
Nombre del adaptador:
 EXT_1_IF=vlan444 

Número de tabla de enrutamiento:
 RTABLE_1=1 

No se requiere una puerta de enlace predeterminada, porque para todas las tablas de enrutamiento, excepto la principal, se usa el script rc.d setfib <número de tabla> que, como asume la lógica, debe coincidir con el número de la tabla.
Parámetros del módulo de prueba:
El número de direcciones a verificar:
 TNUMBER=2 

Direcciones de las máquinas por las cuales se envían las solicitudes de ping. Es mejor usar el nombre de dominio en el primer caso, y solo después de eso la dirección IP:
 PTARGET_0=ya.ru PTARGET_1=8.8.8.8 

El número de paquetes de ping enviados por destino:
 PNUMBER=2 

Configuración del módulo de jueces
El número de pruebas exitosas del canal principal antes de volver a él. El tiempo de retorno al canal principal después de la reanudación de su funcionamiento se calcula aproximadamente mediante la fórmula: (WNUMBER + 1) * JUDGEPERIOD segundos.
 WNUMBER=3 

Configuración del módulo de registrador
Estos 2 parámetros indican con qué frecuencia el registrador registrará eventos recurrentes. Después de grabar el evento, la próxima vez que se informe el número de intentos de LOGFREQ1, entonces LOGFREQ2 es el número de intentos. Solo se tienen en cuenta los eventos seguidos.
 LOGFREQ1=5 LOGFREQ2=20 

Temporizadores de inicio del módulo en segundos
El período de lanzamiento del módulo Tester. Tiene sentido confiar en el tiempo de intentos fallidos de probar todos los objetivos.
 TESTERPERIOD=240 

El período de lanzamiento del módulo Juez. No instale menos de TESTERPERIOD.
 JUDGEPERIOD=300 

El período de lanzamiento del módulo Scout.
 SCOUTPERIOD=360 

El período de espera antes de verificar los temporizadores de inicio de los módulos Tester y Judge. Es lógico establecer menos o igual que el valor de TESTERPERIOD.
 SENSITIVITY=60 

El tiempo después del cual un módulo de trabajo se considera colgado. Utilizado por el módulo Watchdog.
 TESTERLIMIT=40 JUDGELIMIT=30 LOGGERLIMIT=20 SCOUTLIMIT=120 WATCHDOGLIMIT=150 

Rutas a archivos y directorios
Ruta al script ipfw.
 FIRESCRIPT=/etc/firewall.sh 

Configuración de ipfw. Si la configuración de ipfw no se mueve a un archivo separado, FIRESCRIPT = FIRESETDEF.
 FIRESETDEF=/etc/firewall/config 

Ruta a la configuración de ipfw para el canal externo principal:
 FIRESET_0=/etc/firewall/config_0 

La ruta a la configuración de ipfw para el canal externo de respaldo, si es necesario, puede continuar más FIRESET_2, etc.
 FIRESET_1=/etc/firewall/config_1 

Rutas para enlazar configuraciones
 BINDSETDEF=/usr/local/etc/namedb/named.conf 

Configuración de enlace para el canal externo principal:
 BINDSET_0=/usr/local/etc/namedb/named.conf.0 

Configuración de enlace para el canal externo de respaldo, si es necesario, puede continuar más BINDSET_2, etc.
 BINDSET_1=/usr/local/etc/namedb/named.conf.1 

Rutas a todos los ejecutables de 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 

Registro de eventos Este archivo NO se crea en la instalación ahora:
 LOGFILE=/var/log/tofoin.log 

Los archivos y directorios temporales se crean cuando se inician los módulos correspondientes, algunos se eliminan cuando se detienen:
 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 


Resumen


Resultó ser un conjunto de scripts totalmente funcional y confiable que se adapta bien a la tarea de cambiar al canal de trabajo en el caso de 2 enrutadores con 2 canales de comunicación externos.

Planes


Mis planes para este proyecto se relacionan, quizás, con la reescritura de bash a pure sh para eliminar el software innecesario en el servidor. Por otro lado, ahora todo funciona increíblemente y realmente no tengo ganas de interferir en este proceso, además, cambiar a sh está plagado de construcciones de lenguaje más terribles necesarias para lograr el mismo resultado.
Por lo demás, probablemente, valdría la pena considerar la mejor implementación de los módulos de prueba.

Referencias


Artículo anterior
Página del proyecto ToFoIn en gitlab

Source: https://habr.com/ru/post/es421857/


All Articles