第二故障转移通道
DHCPv4 故障转移(RFC 8156)让两台 DHCP 服务器组成主备或负载分担关系:除了承载大部分消息的主通道 647,协议还要建立第二条 TCP 连接,IANA 登记为 847(dhcp-failover2)。两条通道都只用于服务器之间,客户端从不使用它们,客户端仍然只认 67 与 68。关键在于双方必须持续交换绑定更新与地址池状态,否则切换后可能把同一地址发给两台机器。
基本信息
| 服务 | dhcp-failover2 |
|---|---|
| 协议 | TCP 847(UDP 同号注册) |
| 规范 | RFC 8156(DHCPv4 Failover) |
| 配套 | 647 为主故障转移通道 |
| 通信双方 | 仅 DHCP 服务器之间 |
| 登记机构 / 注册人 | Bernard Volz |
典型使用场景
- 双机热备 DHCP:主服务器宕机后备用服务器接管地址分配
- 负载分担模式:两台服务器各分走一段地址池并互相同步状态
- 防火墙开通:上线新 DHCP 服务器前,需在两台服务器之间放行 647 与 847
- 故障排查:备用服务器长期显示未通信时,检查 847 是否被安全策略拦截
- 审计核对:内网出现 847 监听时确认是否为自建 DHCP 服务而非异常组件
通道分工
| 端口 | 角色 | 承载内容 |
|---|---|---|
| 647 | 主故障转移通道 | 绑定更新等大部分故障转移消息 |
| 847 | 第二故障转移通道 | 次级状态同步与独立心跳 |
| 67 / 68 | 客户端通道 | 客户端地址请求与服务器应答 |
核对与放行
核对与放行
# 服务器侧确认监听(以 ISC DHCP 类实现为例)
ss -lntp | grep -E ':647|:847'
# 两台服务器之间放行(firewalld 示例)
firewall-cmd --permanent --add-port=647/tcp --add-port=847/tcp
firewall-cmd --reload
# 抓包验证心跳真的有来有回
sudo tcpdump -i eth0 -n 'tcp port 847' -c 10RFC 8156 定义的关系有两种:主备(primary/secondary)与负载分担(load balancing)。断链后服务器通常按配置继续服务以保可用性,代价是地址池状态可能分叉,所以监控重点是通道连通性告警,而不是只看两台服务器是否都活着。
故障转移状态机里有几个关键计时器:最大客户端提前时间(MCLT)决定服务器单方面接管地址池的时长,安全余量决定离线多久后自动进入通信中断状态。切换前先确认两侧这两个参数一致,否则备用服务器会在错误的时间点开始应答。