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"
我不明白的是,當 carp1 上的狀態正常時,carp0 上的 carp 狀態在兩台機器上都是 MASTER(主伺服器上的 MASTER 和輔助伺服器上的 BACKUP)。我錯過了什麼?我應該去哪裡尋找線索?
機器是否能夠通過外部介面相互 ping 通?您的外部網路上是否還有另一個 vhid 1?
看起來主節點上的advskew是說(0|primary) 應該是 MASTER 而 (20|secondary) 應該是 BACKUP。暗示(?)兩個 carp0 介面之間缺乏通信。
您可能已經檢查過這些,但是 OpenBSD 上的一些一般診斷程序。
- 配置文件
- 驗證允許 Carp 協議進出兩台機器
- 驗證 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 保持狀態(不同步)