CARP: две машины считают себя хозяевами, но только на одном интерфейсе
У меня есть две машины, каждая из которых одинаково настроена как брандмауэр / балансировщик нагрузки для загруженного веб-сайта. Я настроил их с помощью CARP и pfsync на внутреннем и внешнем интерфейсах. Внутренний интерфейс работает должным образом (первичный указан как MASTER, а вторичный - как BACKUP)
На обеих машинах сетевые интерфейсы выглядят следующим образом:
- em0 - внешний интерфейс
- bge0 - внутренний интерфейс
- bge1 - перекрестное соединение между обеими машинами
- carp0 - общий внешний интерфейс для CARP
- carp1 - общий внутренний интерфейс для CARP
Я переписал IP-адреса и MAC-адреса ниже. Сети следующие:
- 10.0.1.0/24 - Внешняя сеть
- 10.0.2.0/24 - Внутренняя сеть
- 10.0.3.0/24 - Сеть кроссоверов
Вот вывод из 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 на вторичном). Что мне не хватает? Где мне искать улики?
2 ответа
Могут ли машины пропинговать друг друга через внешний интерфейс? У вас случайно нет другого vhid 1 в вашей внешней сети?
Похоже, что advskew на первичном сервере говорит, что (0|primary) должно быть MASTER, а (20| вторичное) должно быть BACKUP. Указывает (?) На отсутствие связи между двумя интерфейсами carp0.
Возможно, вы уже проверили это, но некоторые общие диагностические процедуры в OpenBSD.
- Конфигурационные файлы
- Убедитесь, что протокол карпа разрешен на двух компьютерах
- Убедитесь, что протокол 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. Протокол карпа
Пакеты карпа должны быть получены для брандмауэра, чтобы решить, должен ли он стать MASTER/BACKUP
Пересмотрите конфигурацию брандмауэра, чтобы убедиться, что proto carp
передается на обоих физических интерфейсах карпа.
Например:
быстрое прохождение { em0 bge0 } proto carp keep state (без синхронизации)
Вы можете подтвердить это, добавив журнал блокировки всех в начале вашего набора правил брандмауэра, а затем с помощью tcpdump в интерфейсе pflog0, чтобы подтвердить, разрешены ли пакеты carp или нет.
2. протокол pfsync
Дополнительная проверка, что пакеты pfsync разрешены через брандмауэры, чтобы гарантировать, что состояния брандмауэра распределяются между двумя хостами.
Быстрая передача в bge1 proto pfsync keep state (без синхронизации)