Anotação
Em um artigo anterior, a organização da redundância para gateways da LAN foi considerada. Como solução, foi proposto um script que naquele momento solucionava o problema, mas apresentava várias desvantagens. Depois de algum tempo, acabou eliminando essas deficiências, reescrevendo parcialmente o código e obtendo algo aceitável na saída. Agora podemos dizer que os scripts foram testados o suficiente para serem chamados de estáveis. Para simplificar o entendimento de todo o sistema, os principais pontos para a configuração de serviços secundários (em termos do tópico do artigo) serão parcialmente duplicados abaixo. O motivo é simples - durante esse período, as regras do ipfw também foram reformuladas, o dns passou a viver no AD no Samba4 com um frontend de ligação e registros atualizados com segurança do isc-dhcpd usando kerberos, bem como servidores DNS secundários, como o bind nos gateways, CARP configurado ... Em geral, tornou-se muito mais interessante, mas mais sobre o que e como ele funciona está abaixo. Tudo o que pode ser dado com referências à fonte será projetado de maneira a não produzir essência. O que foi retirado de outros lugares, mas que não está mais disponível, será fornecido aqui com comentários relevantes.
1. Introdução
Portanto, existem duas maneiras de aumentar a imunidade a ruídos do canal de comunicação com o mundo externo por parte do consumidor: backup do gateway e reserva do ponto de conexão. Em outras palavras, no primeiro caso, é configurado um segundo gateway, que será ativado se o primeiro falhar; no segundo caso, um canal de Internet de backup será organizado em caso de problemas com o principal, e quanto mais eles cruzarem, melhor, obviamente. Se o
CARP resolver a primeira tarefa do FreeBSD, a segunda, depois de organizar o segundo canal externo, poderá, novamente, ser resolvida de várias maneiras. No mínimo, você pode organizar o balanceamento de tráfego ou alternar entre canais. Devido à grande diferença na largura de banda dos canais externos, a primeira opção não me
agradou ; portanto, o principal culpado da publicação foi escrito:
ToFoIn - um conjunto de scripts bash que visa solucionar problemas de diagnóstico e mudar para um canal externo em funcionamento. Após o refinamento, pode ser aplicado a n gateways e m canais. A situação é fraca, onde n e m são maiores que 2, mas os scripts abaixo devem trabalhar com grandes valores de n e m, porque Logicamente, o limite não está definido. Em geral, suspeito que, usando esses scripts, é possível resolver uma ampla gama de tarefas, dependendo do status da conexão, limitada, talvez apenas pela imaginação.

Aproximadamente, essa topologia de rede assume da forma mais simples o uso de um conjunto de scripts ToFoIn. Obviamente, os scripts devem funcionar no caso de um único roteador, mas nesse caso, você precisará alterar fortemente o módulo Daemon para remover a dependência da sequência de ações no estado CARP, que simplesmente estará ausente no sistema. A reserva adicional desses e de outros nós depende apenas do grau de importância dos serviços correspondentes.
Metas e objetivos
O objetivo do projeto, como antes, é criar um pacote de software universal e facilmente escalável, focado na identificação de problemas em conexões externas e internas e na mudança automática para conexões viáveis. Em termos gerais, a lógica é a seguinte:
- Existem n "roteadores" com m canais externos em cada um. Além disso, todos os n "roteadores" estão em uma hierarquia estrita e são conectados entre si usando o CARP em todas as interfaces necessárias.
- Um agente trabalha independentemente em cada máquina, cuja tarefa é baseada no status atual do CARP de sua máquina:
- Se fizer backup - detecte e configure a máquina em um roteador que atualmente é o mestre;
- Se mestre - verifique o status das conexões no momento atual e, se necessário, alterne entre canais externos.
Solução
A rede interna possui o CARP, que fornece gateways de backup e permite que você não altere as configurações de outros dispositivos de rede na rede interna ao trocar de canal.
O dhcpd opera no modo primário - secundário e, em geral, não importa quais outros papéis sua máquina desempenha - a conexão entre o dhcpd ocorre na rede interna, para a qual os roteadores sempre olham.
A ligação mestre é removida no AD, que está oculto na rede local, enquanto os servidores de ligação secundária estão trabalhando nos roteadores de gateway em pé de igualdade.
As regras do ipfw diferem dependendo de qual canal é considerado o canal principal em um determinado momento e são reiniciadas pelo módulo Daemon ao alterar as funções.
Finalmente, sobre os próprios scripts. Agora, os arquivos estão localizados nos diretórios apropriados, funcionam com o usuário e têm um script de início no rc.d. Tarefas que requerem acesso root são resolvidas pelo sudo. Há um script de instalação que leva em consideração a possível presença de uma versão instalada, bem como um arquivo de configurações bastante detalhado. Os módulos são os mesmos com pequenas alterações, algumas quase não mudaram na funcionalidade:
Daemon - como o nome indica - é o processo principal que executa os módulos de teste e comutação em um timer e também monitora o CARP.
Testador - ainda testa comunicações externas usando o comando ping. (se estiver em execução, considera que a máquina possui CARP no estado mestre)
Juiz - com base nos resultados do teste, determina qual canal externo funciona e se a comutação é necessária, realiza a comutação (se estiver em execução, considera que a máquina possui CARP no estado Mestre).
Scout é um novo módulo. Inicia quando o CARP está no estado Backup. É necessário determinar qual dos roteadores restantes é atualmente o principal.
Logger - responsável pelo log de eventos. É necessário que as informações sobre os eventos não sejam duplicadas e a revista seja mais fácil de ler.
Watchdog - é executado dentro do cronograma do crontab. Ele determina os "congelamentos" de todos os módulos e (sempre que possível) tenta resolver os problemas que surgiram. I.e. pregue todo mundo, basta colocar.
Além dos próprios scripts, vale a pena considerar alguns arquivos mais importantes:
Tofoin.conf - um único arquivo de configurações.
Tofoin.log - um único arquivo de log de eventos.
Resultado_ <número interno do canal> é o arquivo de trabalho, os resultados do teste são adicionados aqui, criados em / tmp ao lado de .pid e outros arquivos de trabalho.
Posso responder com prazer as perguntas sobre o funcionamento dos módulos, explicando as soluções nos comentários.
Parte técnica
Equipamento
Comparado com o tempo anterior, os gateways passaram para o P4, receberam 1536 Mb de RAM e três HDs de 40 Gb (espelho + sobressalente). As placas de rede ainda são PCI, as PSUs são normais, naturalmente na presença de um no-break.
O aumento da capacidade está associado ao ferro liberado e a atualizações excessivamente entediantes da fonte, mas principalmente o primeiro. OS FreeBSD 11.1, FS zfs.
Configurações dos componentes do sistema
Mais detalhesO kernel é compilado com esses parâmetros adicionais (algo também pode ser definido no carregador, mas é melhor assim):
options IPFIREWALL
Configurações /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
Configurações /etc/rc.conf na primeira máquina (a configuração do CARP é do principal interesse):
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"
Legenda:
eth0, eth1, eth2 - adaptadores físicos
vlan666, vlan777, vlan888 - adaptadores de LAN virtual,
vlan222 e vlan555 - adaptadores para comunicação redundante entre placas de rede externas (elas podem não ser mais necessárias, eram ativamente usadas anteriormente)
vlan111 - o principal canal externo
vlan444 - canal externo de backup
vlan333 - telefoniaConfigurações /etc/rc.conf na segunda máquina (a configuração do CARP é do interesse principal, algumas das linhas duplicadas são removidas):
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"
Algumas regras que são úteis ao configurar o ipfw (nat) são:
Para permitir tráfego CARP:
/sbin/ipfw -q add allow carp from any to any
"Nuclear" nat:
/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
Usando tabelas de roteamento específicas com adaptadores específicos:
/sbin/ipfw -q add setfib 0 all from any to any via vlan666
Em geral, eu poderia escrever um artigo separado sobre as configurações do ipfw que usei, mas isso é outra hora.
Software de terceiros
Mais detalhesComo é necessário trabalhar simultaneamente com dois ou mais canais externos, é conveniente ter várias tabelas de roteamento, uma para cada canal. E seria bom se essas tabelas fossem criadas na própria inicialização. O script rc.d setfib ajudará. A lógica usada no ToFoIn assume que o nome do arquivo (setfib1, setfib2 etc.) corresponde ao número da tabela na qual um único script adiciona uma rota padrão. A tabela por padrão tem o número "0".
Os servidores DNS com o Bind na função principal funcionam no modo secundário, o principal é o samba4 + bind, oculto na rede local. A configuração da ligação secundária é muito bem revelada no livro "DNS e BIND" de Cricket Lee e Paul Albitz. Não lembro de nenhum requisito especial que leve em consideração o uso do samba4 para servidores secundários e não os mencionei no arquivo de configurações. A menos que, para diferentes canais da Internet, você precise criar 2 arquivos diferentes, que serão copiados pelo script ToFoIn para o local a partir do qual o próprio vínculo o lerá. Isso se deve ao fato de que, ao especificar os endereços dos servidores DNS de ambos os provedores no mesmo arquivo, levando em consideração que o bind funciona com apenas uma tabela de roteamento, surge um problema com relação à resolução de endereços de servidores upstream inacessíveis em um determinado momento.
Failover isc-dhcpd. Dhcpd não é essencial para o ToFoIn; além disso, sua ausência não afetará os scripts; no entanto, como me parece, é bastante lógico colocar servidores dhcp em gateways e a pergunta de failover ainda surge. E aqui, comparado à última vez, ficou mais interessante ... Além das configurações necessárias para o failover, que descrevi na
última vez (o início da seção "predefinida" dentro do menu suspenso).
Você também precisará de um script para atualizar com segurança os registros DNS no AD usando o samba4. O próprio servidor samba4 deve ser instalado. A instalação e o lançamento não são necessários, estamos interessados apenas nas ferramentas de gerenciamento que acompanham o kit. Quem desejar pode encontrar outras informações na seção "DHCP com atualizações dinâmicas de DNS"
em .
Parece assustador, mas funciona.
Neste com a configuração do software de terceiros está concluída.
Um pouco sobre ToFoIn
Todo o texto do projeto, juntamente com o script de instalação, está disponível no
gitlab .
Em conclusão, um exemplo de parâmetros do arquivo de configurações do ToFoIn é considerado:O número de roteadores usados no sistema:
RNUMBER=2
Ao usar sub-redes adicionais, você deve definir uma rota padrão quando o roteador se tornar o principal. Aqui você pode especificar o número do arquivo setfib correspondente que será reiniciado. Neste exemplo, setfib2:
ADDITLAN=2
Nome do adaptador interno:
INT_IF=vlan666
Todas as outras interfaces nas quais os roteadores estão conectados via CARP. Necessário para controlar e manter o mesmo estado de todas as interfaces:
ALL_IF="vlan111 vlan333 vlan444 vlan666 vlan777 vlan888"
O que foi usado ao configurar o CARP:
CARP_VHID=1
Os endereços IP na rede interna de outros roteadores em ordem de importância, se necessário, são usados simplesmente ASERV_IP_2, ASERV_IP_3, etc.
ASERV_IP_1=192.168.0.2
Número de canais de conexão externa:
CNUMBER=2
Configurações para o principal canal de conexão externa:
Nome do adaptador:
EXT_0_IF=vlan111
Número da tabela de roteamento:
RTABLE_0=0
Gateway padrão:
DEFAULT_GATEWAY=2.2.2.1
Configurações para o canal de conexão externa de backup:
Nome do adaptador:
EXT_1_IF=vlan444
Número da tabela de roteamento:
RTABLE_1=1
Um gateway padrão não é necessário, porque para todas as tabelas de roteamento, exceto a principal, é usado o script rc.d setfib <número da tabela>, que, como supõe a lógica, deve corresponder ao número da tabela.
Parâmetros do módulo testador:
O número de endereços a serem verificados:
TNUMBER=2
Endereços das máquinas pelas quais as solicitações de ping são enviadas. É melhor usar o nome de domínio no primeiro caso e somente depois o endereço IP:
PTARGET_0=ya.ru PTARGET_1=8.8.8.8
O número de pacotes de ping enviados por destino:
PNUMBER=2
Configurações do módulo de juiz
O número de testes bem-sucedidos do canal principal antes de retornar a ele. O tempo de retorno ao canal principal após o reinício de sua operação é calculado aproximadamente pela fórmula: (WNUMBER + 1) * JUDGEPERIOD segundos.
WNUMBER=3
Configurações do módulo de logger
Esses 2 parâmetros indicam com que frequência o Agente de Log registrará eventos recorrentes. Após registrar o evento, na próxima vez que o número de tentativas do LOGFREQ1 for relatado, LOGFREQ2 será o número de tentativas. Somente eventos consecutivos são levados em consideração.
LOGFREQ1=5 LOGFREQ2=20
Temporizadores de início do módulo em segundos
O período de lançamento do módulo Testador. Faz sentido confiar no tempo de tentativas fracassadas de testar todos os destinos.
TESTERPERIOD=240
O período de lançamento do módulo Juiz. Não instale menos que TESTERPERIOD.
JUDGEPERIOD=300
O período de lançamento do módulo Scout.
SCOUTPERIOD=360
O período de espera antes de verificar os cronômetros de início dos módulos Testador e Juiz. É lógico definir menor ou igual ao valor de TESTERPERIOD.
SENSITIVITY=60
O tempo após o qual um módulo de trabalho é considerado pendurado. Usado pelo módulo Watchdog.
TESTERLIMIT=40 JUDGELIMIT=30 LOGGERLIMIT=20 SCOUTLIMIT=120 WATCHDOGLIMIT=150
Caminhos para arquivos e diretórios
Caminho para o script ipfw.
FIRESCRIPT=/etc/firewall.sh
Configurações de Ipfw. Se as configurações do ipfw não forem movidas para um arquivo separado, então FIRESCRIPT = FIRESETDEF.
FIRESETDEF=/etc/firewall/config
Caminho para as configurações do ipfw para o canal externo principal:
FIRESET_0=/etc/firewall/config_0
O caminho para as configurações do ipfw para o canal externo de backup, se necessário, você pode continuar mais FIRESET_2, etc .:
FIRESET_1=/etc/firewall/config_1
Caminhos para vincular configurações
BINDSETDEF=/usr/local/etc/namedb/named.conf
Configurações de ligação para o canal externo principal:
BINDSET_0=/usr/local/etc/namedb/named.conf.0
Configurações de ligação para o canal externo de backup, se necessário, você pode continuar ainda mais BINDSET_2, etc .:
BINDSET_1=/usr/local/etc/namedb/named.conf.1
Caminhos para todos os executáveis do 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
Log de eventos. Este arquivo NÃO é criado na instalação agora:
LOGFILE=/var/log/tofoin.log
Arquivos e diretórios temporários são criados quando os módulos correspondentes são iniciados, alguns são excluídos quando parados:
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
Sumário
Acabou sendo um conjunto de scripts totalmente funcional e confiável que lida bem com a tarefa de mudar para o canal de trabalho no caso de 2 roteadores com 2 canais de comunicação externos.
Planos
Meus planos para este projeto dizem respeito, talvez, à reescrita do bash para o sh puro, para livrar-se de software desnecessário no servidor. Por outro lado, agora tudo funciona de maneira incrível e eu realmente não estou com vontade de interferir nesse processo. Além disso, mudar para sh é repleto de construções de linguagem mais terríveis necessárias para obter o mesmo resultado.
Quanto ao resto, provavelmente, valeria a pena considerar a melhor implementação dos módulos de teste.
Referências:
←
Artigo anterior→
Página do projeto ToFoIn no gitlab