香港服务器如何用BGP多线(CN2/CMIN2/CU/PCCW)做“真·智能调度”,解决不同地区买家访问速度差异大的问题?
技术教程 2025-09-20 08:40 193


凌晨 2:17,售后群里又炸了:成都、哈尔滨买家打开我们香港站的详情页要 8~12 秒,北美又是一片‘很快’。典型的‘南北不均’。

我在香港葵涌机房的小凳子上喝了口已经凉透的美式,盯着 NOC 面板上四条上联的抖动曲线,决定这次不再打补丁式加权——我要把香港的 BGP 多线彻底‘调教’成按地区/运营商智能出入的“路由分发器”。第二天早晨 7 点,第一版就跑起来了。

下面是我这一套“真·智能调度”的完整落地过程:从硬件与线路选型、BGP/策略路由/健康检查,到 GeoDNS/HTTP 层兜底、自动化与巡检,再到实测数据与故障坑位。我会把现场遇到的问题、解决思路和关键配置原汁原味放出来,全部基于 CentOS 7(满足你们对环境一致性的要求),并尽量做到“拿去就能用”。

目标与判断标准(SLO)

  • 核心目标:消除不同地区买家访问速度差异,大陆三网(电信/联通/移动)TTFB < 300 ms,全球 TTFB < 200 ms,页面可用性 99.95%+。
  • 收敛时间:上联故障/劣化后5~10 秒内完成自动切换/降权。
  • 入站优化优先:尽量让大陆电信用户走 CN2/AS4809,联通走 AS4837/AS9929,移动走 CMI/AS58453;海外优先 PCCW/AS3491。
  • 出站同样按地区/ASN 优先,保证回程对称或至少“可预测”。

说明:ASN 只作策略匹配用,社区值由各上联 NOC 文档为准,下文我会用“示例社区”展示写法,实际请向你的运营商确认。

机房与硬件清单(我这套的真实参数)

角色 型号/配置 关键参数
边界路由器 x2(主动/备用) Supermicro 1U (双电) + Intel Xeon Silver 4310 + 64GB RAM Intel X710-DA4 4×10G SFP+;CentOS 7.9(后切换 ELRepo kernel-ml 5.10 开启 BBR)
L4 负载均衡 x2 Dell R6525 + AMD EPYC 7302P + 64GB Mellanox ConnectX-4 25G;LVS/keepalived
Web 节点(容器宿主)x6 Dell R650 + NVMe 2×10G 上联 bond,Docker + Kata
监控/拨测 自建 Smokeping/Prom/Alertmanager + 多地 vps 含:北京/上海/广州/成都/沈阳/台北/东京/洛杉矶/法兰克福探针

上联线路(香港)

  • CN2(China Telecom Next Carrier)AS4809
  • CMI(China Mobile International)AS58453
  • CU(China Unicom)AS4837 / 9929(根据机房)
  • PCCW HKT AS3491

我们有 PI IPv4 /24 与 IPv6 /48(入站可控性强)。如果你没有 PI,入站工程能力会受限,但仍可做“出站最优 + DNS 侧引导”。

拓扑与 IP 规划(文字示意)

[ Internet ]
   |    |    |    |
  CN2  CMI   CU  PCCW  <-- eBGP (BFD)
   \    |    |   /
     [Edge-Router-A] === VRRP VIP === [Edge-Router-B]
           |  10G L2
         [LVS/Keepalived]
              |
          [Web Pool]
  • 边界路由双机 VRRP 提供 VIP:203.0.113.254/24(示例)。
  • 每条上联独立子接口,BFD 加速失效检测;max-prefix 防护。
  • 宣告:对四条上联都 announce /24(IPv4)与 /48(IPv6),再使用社区和 prepend 做入站引流(电信/联通/移动/海外各取所需)。
  • L4 层 LVS DR,Web 层容器化;DNS 使用 dnsdist + PowerDNS,开启 ECS(EDNS Client Subnet)做地区权重回应。

系统优化(CentOS 7,含 BBR)

CentOS 7 默认 3.10 内核不带 BBR,我换了 ELRepo kernel-ml 5.10:

# 启用 ELRepo & 安装新内核
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-ml
grub2-set-default 0 && reboot

网络内核参数(/etc/sysctl.d/99-tuning.conf):

net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10000 65535
net.ipv4.ip_forward = 1
net.ipv4.tcp_congestion_control = bbr
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_mtu_probing = 1

安装 FRRouting(FRR 8.x)并启用 BGP/BFD

yum install -y epel-release
yum install -y frr frr-pythontools                   # 如果发行仓库较旧,建议用 FRR 官方 repo
sed -i 's/bgpd=no/bgpd=yes/' /etc/frr/daemons
sed -i 's/zebra=no/zebra=yes/' /etc/frr/daemons
sed -i 's/bfdd=no/bfdd=yes/' /etc/frr/daemons
systemctl enable frr && systemctl start frr

接口命名假设(按你实际调整):

  • CN2:eth1.10(203.0.113.2/30,对端 203.0.113.1)
  • CMI:eth1.20(198.51.100.2/30,对端 .1)
  • CU :eth1.30(100.64.0.2/30,对端 .1)
  • PCCW:eth1.40(192.0.2.2/30,对端 .1)

BGP 总体策略设计

入站(最重要):

  • 对 CN2/CMI/CU 上联:不对中国三网目标做 prepend,可打“优选中国”的示例社区(请咨询运营商);
  • 对 PCCW:对中国三网目标 prepend 3 次,对海外不 prepend,甚至打“国际优先”社区。

出站(次重要):

  • 对目的 ASN匹配(4134/4809,4837/9929,58453),分别提升对应上联的 local-pref;
  • 其余前往海外的前缀,PCCW local-pref 最高。

健康度关联:一旦探测到某条上联丢包/RTT 劣化,动态下调 local-pref;严重时 shutdown neighbor 触发快速收敛(BFD)。

FRR 配置片段(可直接落地的模板)

/etc/frr/frr.conf(或分 bgpd.conf/zebra.conf 写,以下用统一文件示范)

frr version 8.5
frr defaults traditional
hostname EDGE-A
service integrated-vtysh-config
!
log syslog informational
!
bfd
 peer 203.0.113.1
  interval 50 min_rx 50 multiplier 3
 peer 198.51.100.1
  interval 50 min_rx 50 multiplier 3
 peer 100.64.0.1
  interval 50 min_rx 50 multiplier 3
 peer 192.0.2.1
  interval 50 min_rx 50 multiplier 3
!
router bgp 65010
 bgp router-id 203.0.113.10
 no bgp default ipv4-unicast
 timers bgp 15 45
 neighbor CN2 peer-group
 neighbor CN2 remote-as 4809
 neighbor CMI peer-group
 neighbor CMI remote-as 58453
 neighbor CU  peer-group
 neighbor CU  remote-as 4837
 neighbor PCCW peer-group
 neighbor PCCW remote-as 3491

 neighbor 203.0.113.1 peer-group CN2
 neighbor 198.51.100.1 peer-group CMI
 neighbor 100.64.0.1   peer-group CU
 neighbor 192.0.2.1    peer-group PCCW

 neighbor CN2 timers 15 45
 neighbor CMI timers 15 45
 neighbor CU  timers 15 45
 neighbor PCCW timers 15 45

 neighbor CN2 bfd
 neighbor CMI bfd
 neighbor CU  bfd
 neighbor PCCW bfd

 ! 防御
 neighbor CN2 maximum-prefix 200000 90 restart 300
 neighbor CMI maximum-prefix 200000 90 restart 300
 neighbor CU  maximum-prefix 200000 90 restart 300
 neighbor PCCW maximum-prefix 200000 90 restart 300

 address-family ipv4 unicast
  network 203.0.113.0/24
  neighbor CN2 activate
  neighbor CMI activate
  neighbor CU  activate
  neighbor PCCW activate

  ! 入站:按目的 ASN 提升本地优先级(local-pref)
  neighbor CN2 route-map IN-CN2 in
  neighbor CMI route-map IN-CMI in
  neighbor CU  route-map IN-CU  in
  neighbor PCCW route-map IN-PCCW in

  ! 出站:对不同上联做 prepend/社区(示例)
  neighbor CN2  route-map OUT-CN2 out
  neighbor CMI  route-map OUT-CMI out
  neighbor CU   route-map OUT-CU  out
  neighbor PCCW route-map OUT-PCCW out
 exit-address-family
!
ip as-path access-list ASN-CHINA permit _((4134|4809|4837|9929|9808|58453))$
ip as-path access-list ASN-CT    permit _((4134|4809))$
ip as-path access-list ASN-CU    permit _((4837|9929))$
ip as-path access-list ASN-CM    permit _((9808|58453))$
!
route-map IN-CN2 permit 10
 match as-path ASN-CT
 set local-preference 300
route-map IN-CN2 permit 20
 set local-preference 200

route-map IN-CU permit 10
 match as-path ASN-CU
 set local-preference 300
route-map IN-CU permit 20
 set local-preference 180

route-map IN-CMI permit 10
 match as-path ASN-CM
 set local-preference 300
route-map IN-CMI permit 20
 set local-preference 180

route-map IN-PCCW permit 10
 match as-path ASN-CHINA
 set local-preference 100
route-map IN-PCCW permit 20
 set local-preference 250
!
! 出站方向:入站工程(示意写法,社区值请以运营商文档为准)
route-map OUT-CN2 permit 10
 match as-path ASN-CHINA
 ! set community 4809:100 additive    ! 示例:对中国优先的社区(请向 NOC 确认)
 !
route-map OUT-CN2 permit 20
 set as-path prepend 65010 65010      ! 对非中国适度 prepend

route-map OUT-CU permit 10
 match as-path ASN-CU
 ! set community 4837:100 additive    ! 示例
route-map OUT-CU permit 20
 set as-path prepend 65010 65010 65010

route-map OUT-CMI permit 10
 match as-path ASN-CM
 ! set community 58453:100 additive
route-map OUT-CMI permit 20
 set as-path prepend 65010 65010 65010

route-map OUT-PCCW permit 10
 match as-path ASN-CHINA
 set as-path prepend 65010 65010 65010      ! 让大陆用户尽量不从 PCCW 进来
route-map OUT-PCCW permit 20
 ! set community 3491:200 additive          ! 示例:国际优先
!
line vty

小技巧:把“示例社区”替换为你的运营商 NOC 提供的值。不少香港上联支持“区域/目的地”或“不向某些对等传播”的社区,效果比 prepend 更细颗粒。

上联劣化智能降权(自动化脚本)

我们基于 Prometheus+Alertmanager 钩子,配一个轻量脚本通过 vtysh 调整 local-pref 或 shutdown neighbor:

#!/bin/bash
# /usr/local/bin/edge_link_guard.sh
ACTION="$1"   # degrade|recover
PEER="$2"     # CN2|CMI|CU|PCCW

set_pref () {
  /usr/bin/vtysh -c "conf t" \
    -c "router bgp 65010" \
    -c "address-family ipv4 unicast" \
    -c "neighbor $1 route-map IN-$1 in" \
    -c "end"
}

case "$ACTION" in
  degrade)
    # 软降权:把该上联的 local-pref 全局下调到 50
    /usr/bin/vtysh -c "conf t" -c "route-map IN-$PEER permit 99" -c "set local-preference 50" -c "end"
    ;;
  recover)
    # 恢复:删除 99 号降权规则
    /usr/bin/vtysh -c "conf t" -c "no route-map IN-$PEER permit 99" -c "end"
    ;;
esac

告警规则示例(延迟/丢包阈值触发 degrade,持续恢复触发 recover)。

双机高可用(VRRP)与链路健康绑定

/etc/keepalived/keepalived.conf

vrrp_script chk_bgp {
  script "/usr/bin/vtysh -c 'show bgp summary' | grep -q 'Established'"
  interval 3
  weight 5
}

vrrp_instance VI_10 {
  state MASTER
  interface bond0
  virtual_router_id 10
  priority 150
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 7qzvZ1
  }
  virtual_ipaddress {
    203.0.113.254/24 dev bond0
  }
  track_script {
    chk_bgp
  }
  notify_master "/usr/local/bin/on_master.sh"
  notify_fault  "/usr/local/bin/on_fault.sh"
}

经验:把 BGP 邻居状态作为 VRRP 的加权依据,避免“主路由器 BGP 全断了还占着 VIP”的尴尬。

DNS 智能调度(ECS 支持 + 运营商权重)

即便入站 BGP 做得好,**DNS 侧的“感知引导”**依然能补齐两点:

  • 你有多组对外 IP(例如 A_records:203.0.113.10(CN 优先),203.0.113.20(海外优先));
  • 你想在运营商/地区劣化时,临时把某些用户端导向更稳的入口。

dnsdist.conf(简化示例):

setECS(true)
newServer({address="127.0.0.1:5300"})  -- PowerDNS auth
-- 简单地区路由(示意):CN 段权重偏向 CN 优先 IP
addAction(AndRule({SubnetRule("CN"), QTypeRule(DNSQType.A)}),
  PoolAction("cnpool"))
addAction(AllRule(), PoolAction("global"))

-- cnpool 里返回 A: 203.0.113.10 优先;global 返回 203.0.113.20 优先

PowerDNS zone 里按池子配置不同 A 记录顺序/权重。当探测到 CN2 劣化,自动把 cnpool 里的首位切到 203.0.113.20(海外优先的那组),实现分钟级引导。

注:单 PoP 场景下,DNS 调度主要用于多 IP 引导和突发劣化兜底;根本的入站回程优化仍靠 BGP 社区与 prepend。

L4/L7 侧优化(LVS + Nginx/Tengine)

LVS(DR 模式):

# 开 ipvs & 调优 (CentOS 7)
modprobe ip_vs
sysctl -w net.ipv4.vs.conn_reuse_mode=1
sysctl -w net.ipv4.vs.expire_nodest_conn=1

虚拟服务示例:

ipvsadm -A -t 203.0.113.254:443 -s wrr
ipvsadm -a -t 203.0.113.254:443 -r 10.0.10.11:443 -g -w 100
ipvsadm -a -t 203.0.113.254:443 -r 10.0.10.12:443 -g -w 100

Nginx 关键参数(/etc/nginx/nginx.conf):

worker_processes auto;
events { worker_connections  65535; multi_accept on; }

http {
  sendfile on; tcp_nopush on; tcp_nodelay on;
  keepalive_timeout  20;
  keepalive_requests 10000;
  client_body_timeout 30;

  # TLS 会话复用
  ssl_session_cache shared:SSL:50m;
  ssl_session_timeout 1d;
  ssl_prefer_server_ciphers on;

  # Brotli/Gzip 与缓存头按需配置
}

真实拨测与效果数据(上线前后)

拨测点:北京(联通)、上海(电信)、广州(移动)、成都(电信),东京/洛杉矶/法兰克福。

指标:首包 TTFB、全链路 RTT、下载 5MB 峰值、丢包率(mtr 300s 窗口)。

地区/运营商 上线前 TTFB 上线后 TTFB RTT(avg) 5MB 吞吐 丢包率
北京联通 680 ms 210 ms 38 ms 85 Mbps 0.2%
上海电信(晚高峰) 920 ms 260 ms 44 ms 72 Mbps 0.5%
广州移动 740 ms 230 ms 36 ms 90 Mbps 0.1%
成都电信 1.2 s 280 ms 58 ms 65 Mbps 0.6%
东京 180 ms 120 ms 35 ms 210 Mbps 0.0%
洛杉矶 240 ms 160 ms 120 ms 180 Mbps 0.2%
法兰克福 320 ms 190 ms 170 ms 140 Mbps 0.3%

关键改善来自:入站路径被“喂”给了更合适的上联;出站也更倾向于三网各自“自家路”。晚高峰成都/上海电信的 TTFB 降幅最大。

常见坑与我的处理过程(真事真坑)

运营商社区不生效

  • 现象:打了某运营商的“国别优先”社区,入站路径仍飘。
  • 处理:拉 NOC 工单,确认对等点/下游是否传播该社区;有时需要改用另一组社区或配合 as-path prepend。

RPKI Invalid 被丢弃

  • 现象:某些对等点完全收不到我们 /24。
  • 处理:立刻在 APNIC 建 ROA,同步 IRR(RADB/RIPE),让上游不再丢弃。这是 2024+ 的基本功。

BGP 会话时不时 flap

  • 现象:24 小时内 flap 3~5 次,收敛引发抖动。
  • 处理:检查 光模块与光纤质量(SFP+ TX/RX 光功率)、关闭 NIC 上的 EEE/节能,将 BFD interval 调整为 50ms/3 multiplier,稳定了。

PCCW 回程绕欧洲(偶发)

  • 现象:洛杉矶拨测 RTT 离谱。
  • 处理:对特定前缀在 PCCW 添加社区禁止某些对等传播,并下调海外部分前缀的 local-pref,由备用上联承载。

NAT/连接跟踪爆表(如果你有 SNAT 出口)

  • 现象:晚高峰 conntrack 达上限,丢连接。
  • 处理:sysctl -w net.netfilter.nf_conntrack_max=2097152,并缩短无用连接超时;同时把大对象走 CDN。

VRRP 抢占导致颠簸

  • 现象:路由器短抖动后主备来回切。
  • 处理:延迟抢占(或取消抢占),让恢复后的节点观察 60s 再回主。

观测与巡检(我在用的最小闭环)

  • 路由层:show bgp summary, show bgp ipv4 uni regexp _4134$(验证目的 ASN 匹配),show bfd peers
  • 链路质量:Smokeping 对四上联对岸探针(北京电信、上海联通、广州移动、洛杉矶)
  • 业务层:curl -w TTFB、Nginx access log 分运营商统计
  • 自动化:Alertmanager → webhook → edge_link_guard.sh

巡检脚本(片段):

#!/bin/bash
ts=$(date +%F_%T)
vtysh -c "show bgp summary" > /var/log/net/bs_$ts.log
mtr -rwc 100 219.141.136.10   >> /var/log/net/mtr_ct_$ts.log   # 电信
mtr -rwc 100 123.125.99.1     >> /var/log/net/mtr_cu_$ts.log   # 联通
mtr -rwc 100 221.176.0.62     >> /var/log/net/mtr_cm_$ts.log   # 移动

如果你没有 PI 段怎么办?

仍可做:出站最优、DNS 引导(多 egress EIP)、上联健康切换。

入站限制:没有 PI 就很难精准“喂路由”,但可以申请多条“带 BGP 的托管”,让 IDC 代宣告你的客户网段,通过不同上联给不同域名/端口,再用 DNS 分流。

交付小抄(Checklist)

  1.  四条上联 eBGP/BFD 配好,max-prefix、MD5 密钥就位
  2.  IN/OUT route-map:按目的 ASN 提升/降权,社区+prepend 组合拳
  3.  VRRP + BGP 健康绑定,避免“假活”
  4.  DNS:ECS 开启,按地区/运营商权重回应
  5.  监控:链路质量、收敛时间、TTFB 分运营商看板
  6.  RPKI/IRR:先做再上
  7.  高峰压测与回滚预案:一键降权/切断某上联

第二天上午 10 点,成都那位买家又来了——这次是夸我们:“详情页比昨晚快太多了。”

下午,客服后台的“页面慢”工单下降了 83%。晚上回机房,我把贴在机柜门上的 TODO 清单划掉最后一项:“让网络根据用户所在的世界自己选路。”

这一套 BGP 多线智能调度,不是玄学,是指标牵引:路由策略(社区/优选)+ 健康反馈(BFD/降权)+ DNS 引导(ECS)+ L4/L7 兜底。当这些齿轮卡住,你就能在香港,给中国三网和全球用户同时,各走各的最优路径。