CARP:两台机器都认为自己是主机器,但只在一个接口上

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"

我不明白的是,carp0 上的 carp 状态在两台机器上都是 MASTER,而 carp1 上的状态应该是 MASTER(主服务器上为 MASTER,辅助服务器上为 BACKUP)。我遗漏了什么?我应该在哪里寻找线索?

答案1

机器是否能够通过外部接口互相 ping 通?您的外部网络上是否有另一个 vhid 1?

答案2

看起来像广告倾斜基本的意思是 (0|primary) 应该是 MASTER,而 (20|secondary) 应该是 BACKUP。这是否意味着两个 carp0 接口之间缺乏通信。

您可能已经检查过这些,但是 OpenBSD 上有一些常规诊断程序。

  1. 配置文件
  2. 验证两台机器是否允许使用 Carp 协议
  3. 验证两台机器是否允许使用 pfsync 协议

看起来你正在使用 FreeBSD(即不使用OpenBSD)我希望我的回答足够清楚,以便您进行调整并使其有用。

--

1.配置文件

您是否有与以下类似的 net.inet.carp 设置?

文件:/etc/sysctl.conf

网.inet.carp.允许=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 协议

防火墙需要接收 Carp 数据包来判断它是否需要成为主/备份

重新检查您的防火墙配置,以确保其proto carp在两个 Carp 物理接口上均可进出。

例如:

快速传递 { em0 bge0 } proto carp 保持状态(不同步)

您可以通过在防火墙规则集开头添加 block log all 来确认,然后在 pflog0 接口上使用 tcpdump 来确认是否允许 carp 数据包通过。

2. pfsync 协议

还要进行额外的检查,即允许 pfsync 数据包通过防火墙,以确保两个主机之间共享防火墙状态。

在 bge1 proto pfsync 上快速传递保持状态(不同步)

相关内容