Lazy loaded image
alpine 使用 haproxy 和 keepalived 提供高可用网络
Words 1569Read Time 4 min
2025-9-29
2025-11-10
date
related_level
slug
type
relate_date
summary
status
tags
category
last_updated
Nov 10, 2025 10:02 PM
是否已更新
orginal_page
是否推荐
  • 需要有至少两台物理服务器才能实现高可用
网络配置
  • 假设两台路由器内网 lan 口地址分别为 192.168.1.1192.168.1.2,在虚拟地址 192.168.1.3 上提供负载均衡
  • 如果为 NAT 网络,外网 wan 口地址则分别为 192.168.0.2/24192.168.0.3/24
(可选)Alpine 系统网络优化
  • cat /proc/$(pgrep haproxy)/limits | grep "Max open files”
  • vim /etc/sysctl.d/loadbalancer.conf
    • sysctl -p /etc/sysctl.d/loadbalancer.conf
    安装 haproxy, keepalived
    • apk update && apk add haproxy keepalived
    • apk add fail2ban
      • 可选,提供防御
    配置 keepalived
    • mkdir -p /etc/keepalived
    • touch /etc/keepalived/keepalived.conf
    全局定义 global_defs
    • vim /etc/keepalived/keepalived.conf
      • router_id 当前 keepalived 实例路由标识,可以改成主机名
      • VRRP 协议优化
        • vrrp_skip_check_adv_addr 跳过对 VRRP 通告报文源地址的检查
        • vrrp_strict 启用严格模式,强制遵循 VRRP 协议规范
        • vrrp_garp_interval 0 设置免费 ARP(Gratuitous ARP)报文发送间隔
          • 默认值为 0,表示仅在切换为主节点时发送一次 GARP 消息
        • vrrp_gna_interval 0 设置 IPv6 邻居通告(Gratuitous NA)间隔
          • 默认值为 0,表示仅在切换为主节点时发送一次 GNA 消息
      • 剩余主要涉及邮件通知和 SMTP 服务设置,可以忽略
    旁路由(单臂路由)的配置样例
    • vim /etc/keepalived/keepalived.conf
      • 网络组 haproxy-vip 绑定 eth0 接口
        • virtual_router_id 51 局域网内唯一虚拟路由ID,不同接口可以重复
        • state <STATE> 区分主备
          • # MASTER on lb-1, BACKUP on lb-2
        • priority <PRIORITY> 定义优先级
          • # 200 on lb-1, 100 on lb-2
        • virtual_ipaddress 对局域网设备展示的虚拟 IP 地址
        • track_script 使用检测脚本 chk_haproxy
        • authentication 认证方式,可选 PASS 或 AH
          • PASS 安全性较弱,无法防止中间人攻击
            • 超过8字符会截断
          • IPsec 的 Authentication Header (AH) 协议对整个 VRRP 报文(包括负载内容)进行完整性校验和身份验证
            • 不加密数据,但生成哈希值防止篡改
            • 需要设备支持含 AH 头的 VRRP 报文
      • 检测脚本 chk_haproxy,用以实现某个检测功能
        • interval 2, timeout 1 每间隔 2 秒检测 haproxy 进程,超时 1 s 算失败
        • rise 1 连续成功 1 次视为健康
        • fall 2 连续成功 2 次视为不健康
          • 失败时根据 weight -20 调整优先级数值使其掉至备份
      对称双网关(内部网关 + 外部路由)的配置样例
      • vim /etc/keepalived/keepalived.conf
        • VRRP 同步组 G1 确保内部网络组 I1 和外部网络组 E1 同步切换
        • 内部网络组 I1 绑定 br-lan 接口
          • virtual_router_id 51 局域网内唯一虚拟路由ID,不同接口可以重复
          • state backup, priority 101 初始状态均为备份
            • 对称,priority 更高的成为 master
          • advert_int 1 VRRP 通告间隔为 1s
          • nopreempt 禁止抢占,即使优先级更高也不抢回 Master 状态
          • virtual_ipaddress 对内部设备展示的虚拟 IP 地址
          • authentication 认证方式,可选 PASS 或 AH
            • PASS 安全性较弱,无法防止中间人攻击
              • 超过8字符会截断
            • IPsec 的 Authentication Header (AH) 协议对整个 VRRP 报文(包括负载内容)进行完整性校验和身份验证
              • 不加密数据,但生成哈希值防止篡改
              • 需要设备支持含 AH 头的 VRRP 报文
        • 外部网络组 E1 绑定 eth0.2 接口
          • virtual_routes 定义虚拟路由
            • 通知该路由成为 master 时,流量通过 eth0.2 的网关 192.168.0.1 转发
          • 其余与内部网络组 I1 类似
        配置 haproxy
        • 默认已创建 haproxy 用户组和用户
          • cat /etc/passwd | grep haproxy
          • cat /etc/group | grep haproxy
        • mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
        vim /etc/haproxy/haproxy.cfg
        • 全局配置及默认配置
          • nbthread 根据设备核心数进行调整
        haproxy 添加对应前后端
        • 参数解释
          • mode tcp 支持传输层(第4层)流量透传
            • SSL 由对应服务器自行处理
          • balance first 按服务器在配置文件中定义的顺序选择第一个可用的服务器
            • 其他常用负载均衡算法
              • roundrobin:轮询分发,适合无状态服务
              • leastconn:选择连接数最少的服务器,适合长连接场景
              • source:基于客户端 IP 哈希,适合需要会话保持的场景
          • inter 10s:每 10 秒执行一次健康检查
          • downinter 5s:当服务器标记为 DOWN 后,每 5 秒重试检查
          • option tcp-check, server op-1 192.168.1.1:443 check
            • op-1 服务器执行健康检查,方式为 tcp-check
        (可选)添加监控页面查看统计数据
        • 自行修改密码
        • haproxy -c -f /etc/haproxy/haproxy.cfg
          • 检查配置语法
        启动 keepalived 和 haproxy
        • rc-update add keepalived default
        • rc-update add haproxy default
        • rc-status default
        • rc-service haproxy start
        • rc-service keepalived start
        上一篇
        OpenSSL 使用 s_client 进行 TLS 测试
        下一篇
        为 headscale 部署私有 derp 服务器

        Comments
        Loading...