Freebsd

CARP:兩台機器認為他們是主人,但只在一個介面上

  • July 7, 2010

我有兩台機器,每台都配置為繁忙網站的防火牆/負載平衡器。我已經在內部和外部介面上使用 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"

我不明白的是,當 carp1 上的狀態正常時,carp0 上的 carp 狀態在兩台機器上都是 MASTER(主伺服器上的 MASTER 和輔助伺服器上的 BACKUP)。我錯過了什麼?我應該去哪裡尋找線索?

機器是否能夠通過外部介面相互 ping 通?您的外部網路上是否還有另一個 vhid 1?

看起來主節點上的advskew(0|primary) 應該是 MASTER 而 (20|secondary) 應該是 BACKUP。暗示(?)兩個 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 數據包。預設是yes,而不是在/etc/sysctl.conf
  • net.inet.carp.preempt 允許組內的主機搶占主機。設置一個介面故障時所有 CARP 介面的故障轉移。預設禁用。
  • net.inet.carp.log 記錄壞的 CARP 數據包。
  • net.inet.carp.arpbalance 跨組主機負載均衡流量。預設為禁用。

2.鯉魚協議

需要接收鯉魚包讓防火牆判斷是否需要成為MASTER/BACKUP

重新訪問您的防火牆配置,以確保proto carp在兩個 carp 物理介面上傳入和傳出。

例如:

快速傳遞 { em0 bge0 } proto carp 保持狀態(不同步)

您可以通過在防火牆規則集的開頭添加 block log all 來確認,然後在 pflog0 介面上使用 tcpdump 來確認是否允許 carp 數據包通過。

2.pfsync協議

另一項檢查,即允許 pfsync 數據包通過防火牆,以確保在兩台主機之間共享防火牆狀態。

快速傳遞 bge1 proto pfsync 保持狀態(不同步)

引用自:https://serverfault.com/questions/134569