说明:目标是在台湾原生IP节点常掉线的情况下,保证服务可达性。
准备:至少3台台湾节点(不同ISP/机房)、1台外网边缘负载机(可在国外或稳定机房)、域名与支持API的DNS服务(如Cloudflare、DNSPod)。
工具:安装 haproxy、keepalived(若能同网段使用虚拟IP)、wireguard(建立稳定隧道)、curl、jq、systemd。
核心思路:多层冗余(链路与应用)。
- 边缘负载(HAProxy)做TCP/HTTP代理与健康检测。
- 各台湾节点为后端,配置为主/备与权重。
- DNS使用低TTL + 健康检查作为第二层切换。
- 若需要SYN/源IP保留,使用WireGuard隧道回传流量并在边缘做SNAT。
安装:Ubuntu/Debian
- apt update && apt install -y haproxy
示例配置片段(/etc/haproxy/haproxy.cfg)核心部分:
- frontend ft_tcp
- bind *:443
- default_backend bk_tw
- backend bk_tw
- mode tcp
- option tcp-check
- server tw1 1.2.3.4:443 check fall 3 rise 2
- server tw2 5.6.7.8:443 check fall 3 rise 2 backup
说明:将不稳定节点设为backup或降低权重;tcp-check可定制脚本检测HTTP/HTTPS返回状态。
原理:HAProxy做被动+主动检查,外加脚本在节点健康异常时调整DNS或haproxy后端。
示例健康脚本(/usr/local/bin/check_tw.sh):
- #!/bin/bash
- curl -s --max-time 4 https://127.0.0.1:8443/health || exit 1
- exit 0
设置 systemd timer 或 cron 每分钟执行;异常时脚本通过API修改 DNS 或写入 haproxy 后端权重并 systemctl reload haproxy。
步骤:在DNS提供商设置A记录多个IP,TTL设为60或更低;启用API以便脚本能删除/添加记录。
自动化:当边缘检测到全部台湾节点均不通时,脚本调用DNS API将流量导向备用机房IP或提示人工介入。
注意:DNS切换并非瞬时,低TTL与并行HAProxy减少依赖DNS。
场景:必须回传流量到台湾出口以保留台湾源IP。
步骤摘要:在每台台湾节点配置WireGuard客户端连接到边缘WG服务器,边缘将来自公网的目标IP包通过WG隧道发回台湾节点出口并做SNAT。
关键iptables命令示例(边缘机):
- iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443
- iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
Q:节点短时掉线,HA/备份策略如何优先级设置以减少抖动?
A:优先:设置主节点权重高、保留多个backup,health check的fall/ rise值调大(例如 fall 5 rise 3),避免对短时抖动敏感;同时让脚本仅在持续超时(如连续3次失败且总时长>30s)才触发DNS改动。
Q:部署后如何验证冗余生效并可切换?
A:测试步骤:1) 人为down掉主节点(iptables -I INPUT -p tcp --dport 443 -j DROP),观察HAProxy是否切换到backup;2) 模拟网络中断查看DNS脚本是否触发并能在60s内切换;3) 使用远端机器持续curl并记录响应时间与丢包,确保无长时间中断。
Q:长期运维时需要注意哪些问题?
A:注意事项:1) 日志与报警(Prometheus+Alertmanager或邮件报警)必须到位;2) 不同ISP节点避免同一机房单点故障;3) 不要频繁调整DNS TTL或滥用DNS切换以免被下游缓存和影响;4) 保持健康脚本与haproxy配置简单可靠,优先自动化回滚策略。