我目前有两个 pfSense 盒子,并按照文档配备了标准鲤鱼设置,效果非常好。
这里有两个部分的问题:
- 怎么可能?我偶然在同一网络上拥有两个 IP 的经历并不愉快。那么,鲤鱼 IP 和物理 IP 是如何如此和谐地共存的呢?
这引出了真正的问题
- pfSense 盒子是否应该只为
wan
&lan
和所有通信/路由/无论发生什么真实的sync
IP 地址和网卡?
即:我建议和wan
没有lan
ips,只有sync
nic有ip,会有一个carp wan ip和carp lan ip
答案1
它是如何工作的
carp 是一种协议,与 VRRP 非常相似,在多个主机之间共享 IP。
如果你在配置了 carp 的接口上运行 tcpdump,你将能够看到如下消息:
# tcpdump -vvni vlan1000 proto carp
tcpdump: listening on vlan1000, link-type EN10MB
19:34:59.688730 carp 1.2.3.4 > 224.0.0.18: CARPv2-advertise 36: vhid=1 advbase=10 advskew=5 demote=0 [tos 0x4] (ttl 255, id 25329, len 56)
tcpdump -vvni vlan42 proto carp
tcpdump: listening on vlan42, link-type EN10MB
19:35:56.610612 carp 10.42.42.5 > 224.0.0.18: CARPv2-advertise 36: vhid=42 advbase=10 advskew=5 demote=0 (DF) [tos 0x10] (ttl 255, id 13021, len 56)
Carp 成员会向多播地址发送消息,相互通告自己的存在。每个 Carp 组中只有一名成员会被选为主成员。
在主动-主动场景中,您仍然可以有两个或多个主机为同一个 carp 地址提供服务,假设 pf 状态在 carp 成员之间共享(pfsync)。
Carp 地址将根据您的 Carp VHID 解析为预测硬件地址:
# arp -na|grep 'carp.*permanent'
10.42.40.1 00:00:5e:00:01:0b carp11 permanent l
10.42.41.1 00:00:5e:00:01:08 carp8 permanent l
10.42.42.1 00:00:5e:00:01:2a carp42 permanent l
10.42.43.1 00:00:5e:00:01:07 carp7 permanent l
10.42.44.1 00:00:5e:00:01:04 carp4 permanent l
10.42.45.1 00:00:5e:00:01:03 carp3 permanent l
10.42.46.1 00:00:5e:00:01:0a carp10 permanent l
10.42.242.1 00:00:5e:00:01:02 carp2 permanent l
10.42.252.1 00:00:5e:00:01:64 carp100 permanent l
10.42.253.1 00:00:5e:00:01:05 carp5 permanent l
10.42.254.1 00:00:5e:00:01:06 carp6 permanent l
1.2.3.4 00:00:5e:00:01:01 carp1 permanent l
192.168.10.254 00:00:5e:00:01:0c carp12 permanent l
对于 VHID 1,我的 carp 地址会将其 mac 设置为00:00:5e:00:01:01
,对于 VHID 2 00:00:5e:00:01:02
,则设置为 ,... 依此类推。因此:无论哪个是您的 carp 主控,该网络中的客户端都不需要刷新其 ARP 缓存,它们将始终联系相同的硬件地址。
两台主机共享相同的 IP 通常是“不愉快的”原因,首先是因为:它们没有相同的 mac。根据谁回复了您的上一个 arp 请求,您可能会意外地从一个切换到另一个。此外,您的两个 pfSense 共享类似的配置,确保您的网络中具有相同的功能。而当错误地重新分配 IP 时,您通常会有两台完全不同的机器。
CARP 成员是否也应该拥有物理 IP
视情况而定。大多数情况下:不。我倾向于在管理或公共接口上设置一个,以确保我仍然可以访问备份主机(例如:监控、排除某些连接问题......),或者只是设置 pfSync。
使用 FreeBSD,您可能还会使用 hastd+ctld+ifstated 共享 HA LUN 设备。然后,我还会在主接口上设置一个物理 IP,因为无论谁是主设备,我都需要 hastd 来同步我的设备。