CARP: duas máquinas pensam que são o mestre, mas apenas em uma interface

2

Eu tenho duas máquinas, cada uma configurada de forma idêntica como um firewall / balanceador de carga para um site ocupado. Eu os configurei com CARP e pfsync nas interfaces internas e externas. A interface interna está se comportando como esperado (primário listado como MASTER e secundário listado como BACKUP)

Em ambas as máquinas, as interfaces de rede são as seguintes:

  • em0 - Interface externa
  • bge0 - interface interna
  • bge1 - conexão cruzada entre as duas máquinas
  • carp0 - Interface externa compartilhada para CARP
  • carp1 - Interface interna compartilhada para CARP

Eu reescrevi os endereços IP e os endereços MAC abaixo. As redes são as seguintes:

  • 10.0.1.0/24 - Rede externa
  • 10.0.2.0/24 - Rede interna
  • 10.0.3.0/24 - Rede cruzada

Aqui está a saída do ifconfig no primário:

em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
    ether [SNIP]
    inet 10.0.1.10 netmask 0xffffff00 broadcast 10.0.1.255
    media: Ethernet 100baseTX <full-duplex>
    status: active
bge0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
    ether [SNIP]
    inet 10.0.2.10 netmask 0xffffff00 broadcast 10.0.2.255
    media: Ethernet 1000baseT <full-duplex>
    status: active
bge1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
    ether [SNIP]
    inet 10.0.3.10 netmask 0xffffff00 broadcast 10.0.3.255
    media: Ethernet 1000baseT <full-duplex>
    status: active
lo0: flags=80c9<UP,LOOPBACK,RUNNING,NOARP,MULTICAST> metric 0 mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4 
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33152
pfsync0: flags=0<> metric 0 mtu 1460
    pfsync: syncdev: bge1 syncpeer: 10.0.3.11 maxupd: 128
carp0: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
    inet 10.0.1.5 netmask 0xffffff00 
    carp: MASTER vhid 1 advbase 1 advskew 0
carp1: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
    inet 10.0.2.5 netmask 0xffffff00 
    carp: MASTER vhid 2 advbase 1 advskew 0

E aqui está o trecho do /etc/rc.conf do primário:

defaultrouter="10.0.1.1"
network_interfaces="em0 bge0 bge1 lo0 pfsync0"
cloned_interfaces="carp0 carp1"
ifconfig_em0="inet 10.0.1.10 netmask 255.255.255.0 media 100BaseTX mediaopt full-duplex"
ifconfig_bge0="inet 10.0.2.10 netmask 255.255.255.0 media 1000BaseTX mediaopt full-duplex"
ifconfig_bge1="inet 10.0.3.10 netmask 255.255.255.0 media 1000BaseTX mediaopt full-duplex"
ifconfig_carp0="vhid 1 pass [SNIP] 10.0.1.5/24"
ifconfig_carp1="vhid 2 pass [SNIP] 10.0.2.5/24"
pfsync_enable="YES"
pfsync_syncdev="bge1"
pfsync_syncpeer="10.0.3.11"

E aqui está a saída no secundário:

em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
    ether [SNIP]
    inet 10.0.1.11 netmask 0xffffff00 broadcast 10.0.1.255
    media: Ethernet 100baseTX <full-duplex>
    status: active
bge0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
    ether [SNIP]
    inet 10.0.2.11 netmask 0xffffff00 broadcast 10.0.2.255
    media: Ethernet 1000baseT <full-duplex>
    status: active
bge1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
    ether [SNIP]
    inet 10.0.3.11 netmask 0xffffff00 broadcast 10.0.3.255
    media: Ethernet 1000baseT <full-duplex>
    status: active
lo0: flags=80c9<UP,LOOPBACK,RUNNING,NOARP,MULTICAST> metric 0 mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4 
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33152
pfsync0: flags=0<> metric 0 mtu 1460
    pfsync: syncdev: bge1 syncpeer: 10.0.3.10 maxupd: 128
carp0: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
    inet 10.0.1.5 netmask 0xffffff00 
    carp: MASTER vhid 1 advbase 1 advskew 20
carp1: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
    inet 10.0.2.5 netmask 0xffffff00 
    carp: BACKUP vhid 2 advbase 1 advskew 20

E aqui está o trecho do /etc/rc.conf do secundário:

defaultrouter="10.0.1.1"
network_interfaces="em0 bge0 bge1 lo0 pfsync0"
cloned_interfaces="carp0 carp1"
ifconfig_em0="inet 10.0.1.11 netmask 255.255.255.0 media 100BaseTX mediaopt full-duplex"
ifconfig_bge0="inet 10.0.2.11 netmask 255.255.255.0 media 1000BaseTX mediaopt full-duplex"
ifconfig_bge1="inet 10.0.3.11 netmask 255.255.255.0 media 1000BaseTX mediaopt full-duplex"
ifconfig_carp0="vhid 1 pass [SNIP] advskew 20 10.0.1.5/24"
ifconfig_carp1="vhid 2 pass [SNIP] advskew 20 10.0.2.5/24"
pfsync_enable="YES"
pfsync_syncdev="bge1"
pfsync_syncpeer="10.0.3.10"

O que eu não entendo é que o status de carpa em carp0 é MASTER em ambas as máquinas quando o status em carp1 é como deveria ser (MASTER no primário e BACKUP no secundário). o que estou perdendo? Onde devo procurar por pistas?

    
por Conor McDermottroe 21.04.2010 / 20:48

2 respostas

5

As máquinas conseguem pingar umas nas outras pela interface externa? Você por acaso tem outro vhid 1 em sua rede externa?

    
por 21.04.2010 / 21:57
1

Parece que o advskew no principal está dizendo que (0 | primário) deve ser MASTER versus (20 | secundário) deve ser BACKUP. Implicando (?) A falta de comunicação entre as duas interfaces carp0.

Você já deve ter verificado estes, mas alguns procedimentos gerais de diagnóstico no OpenBSD.

  1. Arquivos de configuração
  2. Verifique se o protocolo Carp é permitido dentro e fora das duas máquinas
  3. Verifique se o protocolo pfsync é permitido dentro e fora das duas máquinas

Como parece que você está usando o FreeBSD (ou seja, não usando o OpenBSD ), espero que minha resposta esteja clara o suficiente para você ajustar e tornar útil.

-

1. Arquivos de configuração

Você tem configurações de net.inet.carp semelhantes às abaixo?

Arquivo: /etc/sysctl.conf

net.inet.carp.allow=1
net.inet.carp.preempt=1
net.inet.carp.log=1

Uma interface CARP funciona, enquanto a outra não parece indicar que as configurações corretas do sistema foram feitas. Não faz mal confirmar, às vezes fazemos as alterações com uma configuração de linha de comando e esquecemos de definir nas configurações do sistema.

  • net.inet.carp.allow aceita pacotes CARP entrantes ou não. O padrão é sim e não está em /etc/sysctl.conf
  • net.inet.carp.preempt Permitir que hosts dentro do grupo precedam o mestre. Define o failover de todas as interfaces CARP na falha de uma interface. Desativado por padrão.
  • net.inet.carp.log Registre pacotes CARP inválidos.
  • net.inet.carp.arpbalance Carrega o tráfego do saldo entre os hosts do grupo. O padrão está desativado.

2. Protocolo da Carpa

Os pacotes de carpa precisam ser recebidos para que o firewall decida se precisa se tornar MASTER / BACKUP

Revisite sua configuração de firewall para garantir que proto carp seja passado e expirado nas duas interfaces físicas da carpa.

Por exemplo:

pass quick on { em0 bge0 } proto carp keep state (no-sync)

Você pode confirmar adicionando o block log no início do seu conjunto de regras do firewall, e então usando o tcpdump na interface pflog0 para confirmar se os pacotes de carpas estão sendo permitidos ou não.

2. protocolo pfsync

Uma verificação adicional, que os pacotes pfsync são permitidos através dos firewalls, para garantir que os estados do firewall sejam compartilhados entre os dois hosts.

pass quick on bge1 proto pfsync keep state (no-sync)
    
por 07.07.2010 / 04:28

Tags