Назад | Перейти на главную страницу

CARP: две машины думают, что они главные, но только на одном интерфейсе

У меня есть две машины, каждая из которых настроена идентично как брандмауэр / балансировщик нагрузки для загруженного веб-сайта. Я установил их с помощью CARP и pfsync как на внутреннем, так и на внешнем интерфейсах. Внутренний интерфейс работает должным образом (первичный указан как MASTER, а вторичный - как BACKUP)

На обеих машинах сетевые интерфейсы следующие:

Я переписал IP-адреса и MAC-адреса ниже. Сети следующие:

Вот результат ifconfig на первичном сервере:

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

А вот отрывок из файла /etc/rc.conf из первичного файла:

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"

А вот вывод на вторичном сервере:

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

А вот отрывок из вторичного файла /etc/rc.conf:

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"

Я не понимаю, что статус carp на carp0 - MASTER на обеих машинах, когда статус carp1 такой, каким должен быть (MASTER на первичном и BACKUP на вторичном). Что мне не хватает? Где мне искать подсказки?

Могут ли машины связываться друг с другом через внешний интерфейс? У вас случайно есть еще один vhid 1 во внешней сети?

Похоже на advskew на первичный говорит, что (0 | первичный) должен быть ГЛАВНЫМ, а (20 | вторичный) должен быть РЕЗЕРВНЫМ. Подразумевая (?) Отсутствие связи между двумя интерфейсами carp0.

Возможно, вы уже проверили эти, но некоторые общие процедуры диагностики OpenBSD.

  1. Файлы конфигурации
  2. Убедитесь, что протокол Carp разрешен входить и выходить из двух машин
  3. Убедитесь, что протокол pfsync разрешен на двух машинах и из них.

Похоже, вы используете FreeBSD (т.е.не использую OpenBSD) Надеюсь, мой ответ достаточно ясен, чтобы вы могли его исправить и сделать полезным.

-

1. Файлы конфигурации

У вас есть настройки net.inet.carp, аналогичные приведенным ниже?

Файл: /etc/sysctl.conf

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

Один интерфейс CARP работает, а другой, похоже, не указывает на то, что были выполнены правильные конфигурации системы. Не помешает подтвердить, иногда мы вносим изменения с настройкой командной строки и забываем установить конфигурацию системы.

  • net.inet.carp.allow принимать входящие пакеты CARP или нет. По умолчанию да, а не в /etc/sysctl.conf
  • net.inet.carp.preempt Разрешить хостам в группе вытеснять мастер. Устанавливает аварийное переключение всех интерфейсов CARP при выходе из строя одного интерфейса. По умолчанию отключено.
  • net.inet.carp.log Записывать неверные пакеты CARP.
  • net.inet.carp.arpbalance Распределение нагрузки трафика между хостами группы. По умолчанию отключено.

2. Карповый протокол

Необходимо получать пакеты Carp, чтобы межсетевой экран определил, нужно ли ему стать МАСТЕРОМ / РЕЗЕРВНЫМ

Еще раз проверьте конфигурацию брандмауэра, чтобы убедиться, что proto carp проходит через оба физических интерфейса Carp.

Например:

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

Вы можете подтвердить, добавив журнал блоков в начале вашего набора правил брандмауэра, а затем используя tcpdump в интерфейсе pflog0, чтобы подтвердить, разрешены ли carp-пакеты или нет.

2. протокол pfsync

Дополнительная проверка того, что пакеты pfsync разрешены через брандмауэры, чтобы убедиться, что состояния брандмауэра совместно используются двумя хостами.

pass quick on bge1 proto pfsync keep state (no-sync)