![CARP:两台机器都认为自己是主机器,但只在一个接口上](https://linux22.com/image/511676/CARP%EF%BC%9A%E4%B8%A4%E5%8F%B0%E6%9C%BA%E5%99%A8%E9%83%BD%E8%AE%A4%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%98%AF%E4%B8%BB%E6%9C%BA%E5%99%A8%EF%BC%8C%E4%BD%86%E5%8F%AA%E5%9C%A8%E4%B8%80%E4%B8%AA%E6%8E%A5%E5%8F%A3%E4%B8%8A.png)
我有两台机器,每台都配置为繁忙网站的防火墙/负载平衡器。我在内部和外部接口上都设置了 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 上有一些常规诊断程序。
- 配置文件
- 验证两台机器是否允许使用 Carp 协议
- 验证两台机器是否允许使用 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 上快速传递保持状态(不同步)