12.8.2 VRRP通信安全与认证策略
安全目标与威胁模型#
VRRP通信安全的核心目标是防止伪造主节点、重放劫持与跨网段注入,确保虚拟IP的唯一性与切换的可信性。常见威胁包括同网段恶意节点伪造VRRP广告、ARP欺骗干扰VIP、广播域内嗅探导致认证泄露等。
原理草图(VRRP安全边界):
认证机制与配置要点#
- 使用VRRP认证:优先选择PASS认证(简单口令),避免无认证模式。设置足够复杂的口令,避免明文复用。
- 保持一致性:主备节点的
virtual_router_id、认证方式与密码必须完全一致,避免异常切换。 - 限制接口:在
vrrp_instance中显式指定interface,避免在不必要的网卡上发送VRRP报文。 - 合理优先级:主备优先级应有明显梯度,结合
nopreempt控制抢占策略,减少恶意或误配置引发的抢占。
安装与准备(两节点均执行)
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y keepalived
# RHEL/CentOS
sudo yum install -y keepalived
Keepalived配置示例(PASS认证 + 单播)
文件路径:/etc/keepalived/keepalived.conf
主节点:
global_defs {
router_id KA_MASTER
enable_script_security
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass "S3cure@2024"
}
unicast_src_ip 10.0.0.11
unicast_peer {
10.0.0.12
}
virtual_ipaddress {
10.0.0.100/24 dev eth0 label eth0:1
}
}
备节点:
global_defs {
router_id KA_BACKUP
enable_script_security
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass "S3cure@2024"
}
unicast_src_ip 10.0.0.12
unicast_peer {
10.0.0.11
}
virtual_ipaddress {
10.0.0.100/24 dev eth0 label eth0:1
}
nopreempt
}
启动与验证
sudo systemctl enable --now keepalived
sudo systemctl status keepalived -l
# 验证VIP是否在主节点
ip -br addr show dev eth0 | grep 10.0.0.100
# 检查VRRP报文(主备上均可)
sudo tcpdump -ni eth0 'ip proto 112 or host 224.0.0.18'
命令解释
- ip proto 112:匹配VRRP协议。
- 224.0.0.18:VRRP多播地址(单播模式则看对端IP)。
网络隔离与访问控制#
- 二层隔离:将VRRP节点置于独立VLAN或隔离广播域,降低被嗅探或注入的风险。
- ACL/防火墙:在交换机/防火墙层限制224.0.0.18多播与VRRP协议(IP协议号112)仅在主备之间允许。
- ARP安全:启用交换机的ARP检测或静态ARP绑定,配合内核参数防止ARP欺骗(如
arp_ignore、arp_announce调优)。
内核ARP加固示例
# 临时生效
sudo sysctl -w net.ipv4.conf.all.arp_ignore=1
sudo sysctl -w net.ipv4.conf.all.arp_announce=2
sudo sysctl -w net.ipv4.conf.eth0.arp_ignore=1
sudo sysctl -w net.ipv4.conf.eth0.arp_announce=2
# 持久化
cat <<'EOF' | sudo tee /etc/sysctl.d/99-keepalived-arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.eth0.arp_announce=2
EOF
sudo sysctl --system
防火墙示例(仅允许主备之间VRRP)
# 以firewalld为例,允许对端IP的VRRP协议
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" protocol value="112" source address="10.0.0.12" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" protocol value="112" source address="10.0.0.11" accept'
sudo firewall-cmd --reload
密钥管理与变更流程#
- 口令更新:制定定期更换VRRP认证口令的周期,并在低峰期滚动更新。
- 配置分发:通过配置管理工具进行一致性发布,避免手工变更导致主备认证不一致。
- 最小可见性:限制配置文件权限与可读范围,防止认证信息泄露。
权限与审计基础设置
sudo chown root:root /etc/keepalived/keepalived.conf
sudo chmod 600 /etc/keepalived/keepalived.conf
# 变更前后进行校验
sudo sha256sum /etc/keepalived/keepalived.conf
滚动更新口令流程示例
1. 先在备节点更新auth_pass并重启。
2. 确认主节点仍保持MASTER。
3. 更新主节点auth_pass并重启。
# 备节点更新后
sudo systemctl restart keepalived
sudo journalctl -u keepalived -n 50 --no-pager
监控与审计#
- 日志审计:开启Keepalived日志,关注状态切换、认证失败与协议异常。
- 告警策略:对频繁切换、优先级异常波动、VRRP报文丢失等设置告警。
- 流量基线:建立VRRP报文基线,异常峰值可能意味着注入或扫描行为。
日志与状态检查
# 查看状态切换、认证异常
sudo journalctl -u keepalived -n 200 --no-pager | egrep -i 'VRRP|auth|state|transition'
# 查看当前VIP所在节点
ip -br addr | grep 10.0.0.100
运行时加固建议#
- 单播模式:在有条件的场景采用单播VRRP,减少多播被劫持的风险。
- 禁用不必要协议:关闭不使用的多播路由与旁路转发,降低攻击面。
- 联合校验:结合LVS/应用健康检查,避免单纯依赖VRRP认证导致的“假主”问题。
单播模式与健康检查结合示例
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass "S3cure@2024"
}
unicast_src_ip 10.0.0.11
unicast_peer { 10.0.0.12 }
track_script {
chk_app
}
virtual_ipaddress {
10.0.0.100/24 dev eth0 label eth0:1
}
}
vrrp_script chk_app {
script "/usr/local/bin/check_app.sh"
interval 2
weight -20
}
/usr/local/bin/check_app.sh:
#!/usr/bin/env bash
# 检测应用端口存活,失败则降低优先级触发切换
nc -z 127.0.0.1 8080
sudo chmod +x /usr/local/bin/check_app.sh
sudo systemctl restart keepalived
排错清单(示例)#
# 1. VRRP是否被防火墙阻断
sudo tcpdump -ni eth0 'ip proto 112'
# 2. 主备认证是否一致
grep -R "auth_" /etc/keepalived/keepalived.conf
# 3. VIP是否重复/漂移失败
ip -br addr | grep 10.0.0.100
# 4. 日志中是否有“received lower prio advert”
sudo journalctl -u keepalived -n 200 --no-pager | egrep -i 'prio|auth|state'
练习#
- 将配置改为单播模式,观察
tcpdump中是否仍出现224.0.0.18多播。 - 故意将备节点
auth_pass改错,观察日志中认证失败提示并记录现象。 - 启用
track_script后停掉应用端口,验证优先级降低与VIP切换是否生效。