鲤鱼:两台机器认为他们是主人,但只在一个界面

我有两台机器,每台机器的configuration与繁忙网站的防火墙/负载平衡器相同。 我已经用CARP和pfsync在内部和外部接口上设置了它们。 内部接口的行为如预期(主要列为MASTER,次要列为BACKUP)

在这两台机器上,networking接口如下所示:

  • em0 – 外部接口
  • bge0 – 内部接口
  • bge1 – 两台机器之间的交叉连接
  • carp0 – CARP的共享外部接口
  • carp1 – CARP的共享内部接口

我已经重写了下面的IP地址和MAC地址。 networking如下:

  • 10.0.1.0/24 – 外部networking
  • 10.0.2.0/24 – 内部networking
  • 10.0.3.0/24 – 交叉networking

以下是主要的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" 

我不明白的是,当carp1上的状态应该是这样的时候,两个机器上的carp0上的carp状态是MASTER(MASTER在主设备上,而在备用设备上是BACKUP)。 我错过了什么? 我应该在哪里寻找线索?

机器能够通过外部接口互相ping通吗? 你有没有机会在你的外部networking上有另一个vhid 1?

看起来主要advskew是说(0 | primary)应该是MASTER与(20 | secondary)应该是BACKUP。 牵连(?)两个carp0接口之间缺乏通信。

您可能已经检查了这些,但在OpenBSD上进行了一些常规的诊断程序。

  1. configuration文件
  2. validation鲤鱼协议允许进出两台机器
  3. validation两台机器是否允许进出pfsync协议

看起来你使用的是FreeBSD(即不使用OpenBSD ),我希望我的回答足够清楚,以便你调整和使用。

1.configuration文件

你有net.inet.carp设置类似于下面?

文件:/etc/sysctl.conf

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

一个CARP接口工作,而另一个似乎并没有表明已经做出正确的系统configuration。 确认无损,有时候我们用命令行设置进行更改,忘记在系统configuration中设置。

  • net.inet.carp.allow接受传入的CARP包或不。 默认是yes,而不是在/etc/sysctl.conf中
  • net.inet.carp.preempt允许组内的主机抢占主机。 在一个接口故障时,设置所有CARP接口的故障转移。 默认情况下禁用。
  • net.inet.carp.loglogging不好的CARP数据包。
  • net.inet.carp.arpbalance跨组主机负载均衡stream量。 默认是禁用的。

2.鲤鱼协议

鲤鱼包需要收到防火墙判断是否需要变成MASTER / BACKUP

重新访问你的防火墙configuration,确保proto carp在两个鲤鱼物理接口proto carp入和传出。

例如:

快速通过{em0 bge0}原始鲤鱼保持状态(不同步)

您可以通过在防火墙规则集的开头添加阻止日志来确认,然后在pflog0接口上使用tcpdump来确认鲤鱼包是否被允许通过。

2. pfsync协议

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

通过bge1 proto pfsync保持状态(不同步)