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_ignorearp_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'

练习#

  1. 将配置改为单播模式,观察tcpdump中是否仍出现224.0.0.18多播。
  2. 故意将备节点auth_pass改错,观察日志中认证失败提示并记录现象。
  3. 启用track_script后停掉应用端口,验证优先级降低与VIP切换是否生效。