香港服务器如何用 BGP(CN2/CMIN2/CU/PCCW)做“智能调度”,让国内三网与东南亚访问都一样快
技术教程 2025-09-18 14:02 186


那天是周四晚上 11 点,香港葵涌机房 12℃ 的冷风往我袖口里钻。一个电商客户在 9·9 大促前夜压测,工单里两句话:“内地移动用户有抖动,越南和马来西亚延迟也不稳。” 我盯着 Smokeping 的红点,脑子里飞快过了一遍拓扑:同一台香港出口服务器,四路 BGP 上联(CN2/CMIN2/CU/PCCW),应用在 Kubernetes 上跑得很稳,问题只可能出在路由与回程。我对同事说:“把 PCCW 的回程先降权,东南亚放 PCCW 优先,国内三网按 CN2/CMIN2/CU 走优选线,先把 BFD 拉起来。”十分钟后,抖动线段开始收敛,那一刻我知道,这篇“智能调度”的部署笔记该写下来了。

1. 场景与目标

目标:在 香港单点(可扩展为 HK+SG 两点 Anycast)场景下,利用多上联 BGP(CN2/GIA、CMIN2、CU/9929、PCCW)做出入向的策略调度,实现:

  • 内地三网(电信/联通/移动)直连/优选回程,降低丢包与抖动。
  • 东南亚(SG/MY/ID/TH/VN/PH)用户优先走 PCCW/区域最优上联。
  • 出口健康探测+BFD、策略自动切换、路由收敛可观测。
  • 以Linux + FRRouting(FRR)作为用户态 BGP 引擎,成本可控、可复制。

2. 硬件与网络参数(我用的这套)

2.1 机柜与服务器

配置
机柜 香港葵涌 DC,双路 220V UPS,A+B 供电
交换机 2× 10G ToR(VPC/MLAG),支持 BFD 与 802.3ad
路由节点 2× 1U 服务器(主用/热备)
CPU Intel Xeon Silver 4314(16C/32T)
内存 64GB ECC
网卡 Intel X710-DA4(4×10G SFP+),万兆光模块
系统盘 2× 480GB SSD(RAID1)
OS Debian 12 / Kernel 6.1 LTS
虚拟化 无(路由节点纯物理),业务集群另置

说明:路由节点我坚持“纯物理、纯路由”,把应用与路由职责彻底解耦,避免高负载时用户态抢占影响 BGP/BFD。

2.2 上联与 BGP 规划

上联 常见 ASN 口速/承诺 用途建议 备注
CN2/GIA(电信) AS4809 10G / 3G commit 国内电信优选、国内综合兜底二选 GIA 成本高,in/out 控制需谨慎
CMIN2(移动) AS58453(CMI) 10G / 3G commit 国内移动优选 有时对东南亚也不错
CU/9929(联通精品) AS9929 10G / 2G commit 国内联通优选 CU 169(AS4837)可作兜底
PCCW Global AS3491 10G / 5G commit 东南亚/APAC 优选 提供丰富社区策略

提醒:不同运营商的 BGP Community 手册与可用策略范围不同,文中社区值以“示例/占位”标记,以你的上游 NOC 文档为准。

2.3 地址与命名

  • 业务前端段(Anycast 可选):203.XX.YY.0/24
  • 路由器回环:10.255.0.1/32(主),10.255.0.2/32(备)

上联点对点:

  • CN2:192.0.2.2/30(我方)↔ 192.0.2.1/30(对侧)
  • CMIN2:198.51.100.2/30 ↔ 198.51.100.1/30
  • CU/9929:203.0.113.2/30 ↔ 203.0.113.1/30
  • PCCW:100.64.0.2/30 ↔ 100.64.0.1/30

3. 系统与内核调优(路由节点)

# /etc/sysctl.d/99-net-tuning.conf
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_mtu_probing = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.arp_announce = 2
net.ipv4.fib_multipath_hash_policy = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_syncookies = 1
  • BBR 对长 RTT 的东南亚链路吞吐提升明显。
  • 开 rp_filter=0 避免策略路由/非对称路径被误杀。
  • fib_multipath_hash_policy=1 以五元组散列,降低乱序。

4. FRRouting 部署(BGP + RPKI + BFD)

4.1 安装

apt update
apt install -y frr frr-pythontools rpki-client
# 开启 bgpd, bfdd, zebra, staticd
sed -i 's/bgpd=no/bgpd=yes/' /etc/frr/daemons
sed -i 's/bfdd=no/bfdd=yes/' /etc/frr/daemons
systemctl enable --now frr

4.2 RPKI 校验与 RTR

# rpki-client 定时拉取 RPKI 数据
cat >/etc/cron.d/rpki-client <<'EOF'
*/30 * * * * root rpki-client -j /var/lib/rpki-client/json
EOF

# FRR bgpd.conf 里启用 RTR
rpki
 rpki cache 127.0.0.1 3323 preference 1
 exit

好处:丢弃 INVALID 路由,减少被路由投毒/劫持影响。

4.3 BFD 快速失效

bfd
 profile fast
  transmit-interval 50
  receive-interval 50
  echo-interval 50
  detect-multiplier 5
 !
!

约 250ms 级别的失效感知,避免上游软失败时长时间黑洞。

5. 目的地区域识别与策略基础数据

智能调度的关键是识别“去往哪里”。我用两层做法:

  • 国家/区域前缀集(CN、SEA):每日从 APNIC/各社区项目同步,生成 prefix-list;
  • ASN 维度兜底:针对已知大 ASN(AS4134/AS4809/AS9929/AS58453/AS9808 等)做 as-path 匹配。

5.1 同步脚本(CN 与 SEA 前缀)

#!/usr/bin/env bash
set -euo pipefail
WORK=/etc/frr/prefixes
mkdir -p $WORK

# 以下数据源示例,请替换为你实际使用的可信源(APNIC、社区CIDR项目、商业DB等)
curl -sSL https://example.com/cn-cidr.txt  | awk '{print " ip prefix-list CN-PFX permit "$1}' > $WORK/cn.list
curl -sSL https://example.com/sea-cidr.txt | awk '{print " ip prefix-list SEA-PFX permit "$1}' > $WORK/sea.list

{
  echo "ip prefix-list CN-PFX seq 5 deny 0.0.0.0/0"
  cat $WORK/cn.list
} > /etc/frr/cn.prefix

{
  echo "ip prefix-list SEA-PFX seq 5 deny 0.0.0.0/0"
  cat $WORK/sea.list
} > /etc/frr/sea.prefix

systemctl reload frr

注意:数据源必须可溯源、更新频率高。CIDR 过期会直接导致“错路、抖动”。

5.2 ASN 匹配(as-path access-list)

ip as-path access-list CT-AS permit (_4134_|_4809_)
ip as-path access-list CU-AS permit (_4837_|_9929_)
ip as-path access-list CM-AS permit (_9808_|_58453_)

6. BGP 会话与基础属性

router bgp 65001
 bgp router-id 10.255.0.1
 no bgp default ipv4-unicast
 bgp log-neighbor-changes
 bgp bestpath as-path multipath-relax
 timers bgp 5 15
 neighbor PASSWORD secret XxYyZz123   ! 推荐 TCP-MD5
 !
 address-family ipv4 unicast
  network 203.XX.YY.0/24 route-map ANNOUNCE
 exit-address-family

! CN2
neighbor 192.0.2.1 remote-as 4809
neighbor 192.0.2.1 description CN2-GIA
neighbor 192.0.2.1 password XxYyZz123
neighbor 192.0.2.1 timers 5 15
neighbor 192.0.2.1 bfd profile fast
address-family ipv4 unicast
 neighbor 192.0.2.1 activate
 neighbor 192.0.2.1 route-map OUT-CN2 out
 neighbor 192.0.2.1 route-map IN-CN2 in
exit-address-family

! CMIN2
neighbor 198.51.100.1 remote-as 58453
neighbor 198.51.100.1 description CMI-CMIN2
neighbor 198.51.100.1 password XxYyZz123
neighbor 198.51.100.1 bfd profile fast
address-family ipv4 unicast
 neighbor 198.51.100.1 activate
 neighbor 198.51.100.1 route-map OUT-CMI out
 neighbor 198.51.100.1 route-map IN-CMI in
exit-address-family

! CU/9929
neighbor 203.0.113.1 remote-as 9929
neighbor 203.0.113.1 description CU-9929
neighbor 203.0.113.1 password XxYyZz123
neighbor 203.0.113.1 bfd profile fast
address-family ipv4 unicast
 neighbor 203.0.113.1 activate
 neighbor 203.0.113.1 route-map OUT-CU out
 neighbor 203.0.113.1 route-map IN-CU in
exit-address-family

! PCCW
neighbor 100.64.0.1 remote-as 3491
neighbor 100.64.0.1 description PCCW
neighbor 100.64.0.1 password XxYyZz123
neighbor 100.64.0.1 bfd profile fast
address-family ipv4 unicast
 neighbor 100.64.0.1 activate
 neighbor 100.64.0.1 route-map OUT-PCCW out
 neighbor 100.64.0.1 route-map IN-PCCW in
exit-address-family

7. “智能调度”策略核心(出向与入向)

7.1 出向(我们到用户)——LocalPref + 前缀/ASN 匹配

思路:CN 前缀与 CT/CU/CM ASN 匹配 → 提升 CN2/9929/CMIN2 的 LocalPref;SEA 前缀 → 提升 PCCW LocalPref;其余维持均衡(或成本优先)。

route-map IN-CN2 permit 10
 match ip address prefix-list CN-PFX
 set local-preference 300
route-map IN-CN2 permit 20
 match as-path CT-AS
 set local-preference 300
route-map IN-CN2 permit 30
 set local-preference 150

route-map IN-CMI permit 10
 match ip address prefix-list CN-PFX
 set local-preference 280   ! 移动次优
route-map IN-CMI permit 20
 match as-path CM-AS
 set local-preference 320   ! 移动到移动优先
route-map IN-CMI permit 30
 set local-preference 120

route-map IN-CU permit 10
 match ip address prefix-list CN-PFX
 set local-preference 280
route-map IN-CU permit 20
 match as-path CU-AS
 set local-preference 320
route-map IN-CU permit 30
 set local-preference 120

route-map IN-PCCW permit 10
 match ip address prefix-list SEA-PFX
 set local-preference 320   ! SEA 走 PCCW
route-map IN-PCCW permit 20
 set local-preference 100   ! CN 场景不给高分

实战里,我会实时看流量成本,对非高峰时段降低高价链路 LP,峰值时再拉高。

7.2 入向(用户到我们)——Community + AS-PATH Prepend

入向可控性弱,但上游 Community + 选择性 Prepend很关键。策略是:

  • 给 CN2/CMIN2/9929:对中国区不做 prepend(或设置“优选/高本地优先”社区),保证三网客户来路“愿意选它”。
  • 给 PCCW:对中国区 prepend 3 次(或用“对中国地区降权”的社区),但对东南亚不 prepend。
  • 必要时对某上游设置 no-export to CN 或“只向 APAC 宣告”,以最小/渐进方式测试(先对 /32 测,后 /24)。

社区值示例(仅占位):

  • PCCW:3491:ASIA-HIGHLP、3491:CN-LOWLP
  • CMI:58453:CN-HIGHLP
  • CN2:4809:PREF-HIGH
  • CU/9929:9929:CN-LOCALPREF-HIGH

输出方向 route-map(示例):

route-map ANNOUNCE permit 10
 set community 65001:100 additive     ! 自用标记,便于LG观察

route-map OUT-PCCW permit 10
 match ip address prefix-list CN-PFX
 set as-path prepend 65001 65001 65001
 set community 3491:CN-LOWLP additive
route-map OUT-PCCW permit 20
 match ip address prefix-list SEA-PFX
 set community 3491:ASIA-HIGHLP additive

route-map OUT-CN2 permit 10
 match ip address prefix-list CN-PFX
 set community 4809:PREF-HIGH additive

route-map OUT-CMI permit 10
 match as-path CM-AS
 set community 58453:CN-HIGHLP additive

route-map OUT-CU permit 10
 match as-path CU-AS
 set community 9929:CN-LOCALPREF-HIGH additive

强烈建议:在与上游 NOC 沟通后,先对一小段 /32 做灰度宣告/撤销,确认 region-scope 社区生效,再扩到业务前缀 /24。

8. 健康探测、故障切换与“黑洞保护”

8.1 BFD 与 LP 回落

当 BFD 掉线时,我会触发 LP 降级,避免“半坏链路”继续被选中。

event-handler CMI_DOWN
 event bfd peer 198.51.100.1 state down
 action exec vtysh -c 'conf t' -c 'route-map IN-CMI permit 99' -c 'set local-preference 50' -c 'end' -c 'clear ip bgp 198.51.100.1 soft in'

FRR 的 event-handler 简洁好用,结合 Prometheus Alert 也能做更精细化的自动化切换。

8.2 RTBH(远程触发黑洞)预案

为 DDoS 预案在上游注册 blackhole community,在流量“淹没”时对单 IP 下发 /32 blackhole,保服务主体可用。

ip prefix-list RTBH-PFX permit 203.XX.YY.123/32
route-map OUT-RTBH permit 10
 match ip address prefix-list RTBH-PFX
 set community <UPSTREAM:BLACKHOLE> additive

9. 业务层收口:L4/L7 优化(简述)

  • Nginx/QUIC:TLS1.3、开启 reuseport、http2/quic,Gzip/Brotli 自适应;
  • Keepalive 与缓冲:东南亚长 RTT 下 keepalive_requests 和 proxy_buffering 合理放宽;
  • 连接复用:内地移动/电信在弱网时 tcp_nodelay off 能提升吞吐稳定性;
  • MTU:保持 1500,全程启用 PMTUD,遇到运营商奇怪路径,把 MSS clamping 1460/1440 作为兜底。

10. 优化前后数据对比(实测摘要)

采样工具:Smokeping(CT/CM/CU/SG/MY/ID 六点)、iperf3,时段:工作日晚高峰(20:00–23:00)

区域/运营商 调优前 RTT(ms) 调优后 RTT(ms) 丢包(调优前/后) 备注
中国电信(华东) 45–70 34–42 0.8% → 0.2% 入向走 CN2,出向提升 CN2 LP
中国联通(华北) 60–85 38–48 1.1% → 0.3% 9929 优先
中国移动(华南) 55–90 36–50 1.5% → 0.5% CMIN2 优先
新加坡 28–40 27–32 0.3% → 0.2% PCCW 优先
马来西亚 35–55 32–40 0.6% → 0.3% PCCW 优先
越南 45–70 36–45 0.9% → 0.4% PCCW 优先

熟悉的朋友知道:数字受当日骨干拥塞与互联状况影响,但趋势与稳定性是可复制的。

11. 观测与验证(我怎么判断“生效了”)

  • Looking Glass:多点(HK/SG/CN)查看我前缀的入向选择是否按计划;
  • MTR:客户端到我(入向)、我到客户端(出向)各跑 10 次取均值;
  • sFlow/NetFlow:出入向 top ASN/国家占比;
  • Prometheus + Grafana:BGP 会话、RPKI 统计、BFD flap、LocalPref 热力图;
  • 合成事务:北京/广州/成都/新加坡 4 点压测 HLS/HTTP/HTTPS,取 95/99 线。

12. 部署中踩过的坑(以及我是怎么填的)

  • 社区不生效:PCCW 的“区域社区”需要对侧开白名单,我最开始直接按文档推,结果没影响。后来找 NOC 要了demo 社区试对一个 /32,确认 route-map OUT-PCCW 的顺序也会影响(一定比默认 ANNOUNCE 更早匹配)。
  • CIDR 过期导致“东南亚流到 CN2”:自动同步脚本失败了两天我没注意,SEA 前缀不更新,LP 落在 CN2,导致马来用户抖动。加了文件更新完整性校验与回滚。
  • BFD 太激进:50ms/×3 在上游维护抖动时引发频繁 flap,我把 multiplier 提到 5 并加抖动抑制(hold-down)。
  • MSS 问题:部分链路中间设备 MTU 限制,QUIC/HTTP3 正常,TCP 下载速率掉到 5–8MB/s。开启 iptables mangle 做 MSS clamp,稳定到 30MB/s 以上。
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
  • RPKI 初次启用“误杀”:上游某小运营商还没签,标成 NotFound 被我误当 Invalid 拦了。FRR 里我把策略调成:Invalid 丢弃,NotFound 降权,避免过度保守。
  • 成本与峰值:高峰时段 CN2/9929 费用飞涨。我加了时段策略(CRON 切 LP),并在非峰时让 PCCW 接一部分国内回程(轻 prepend),成本-体验取得平衡。

13. 可选:HK+SG Anycast 双点更稳

若业务用户在 SG 也多,我会在 新加坡再起一套同构路由节点,将 203.XX.YY.0/24 切为 /23 或两个 /24,分别在 HK/SG 宣告,用 BGP 自然收敛实现就近接入。

入向:APAC 大多会选 SG,CN 仍优选 HK(CN2/CMIN2/9929 稳定)。

一致性:业务层用 共享 Redis/MQ 或 多活,对状态有要求的走 一致性哈希。

14. 变更与回滚流程(真实可执行)

  • 拟定策略:在测试路由器/VRF 里对 /32 灰度宣告,验证上游 LG 生效;
  • 变更窗口:选低峰(02:00–05:00),通知应用侧;
  • 按序推送:先出向(IN-xxx LP),后入向(OUT-xxx 社区/Prepend);
  • 5 分钟观测:RTT、丢包、BGP flap、成本;
  • 回滚:一键撤销 route-map 变更,恢复默认 LP=100,撤销 prepend;
  • 复盘:记录“社区是否按预期生效”“上游是否有静默策略”。

15. 一份最小可用配置(浓缩版)

可直接落地的“骨架”,把你的上游 IP/ASN/社区值替换进去即可。

! ---------- 基础 ----------
router bgp 65001
 bgp router-id 10.255.0.1
 bgp bestpath as-path multipath-relax
 timers bgp 5 15
!
address-family ipv4 unicast
 network 203.XX.YY.0/24 route-map ANNOUNCE
exit-address-family

! ---------- 邻居 ----------
! CN2
neighbor 192.0.2.1 remote-as 4809
neighbor 192.0.2.1 bfd profile fast
address-family ipv4 unicast
 neighbor 192.0.2.1 activate
 neighbor 192.0.2.1 route-map IN-CN2 in
 neighbor 192.0.2.1 route-map OUT-CN2 out
exit-address-family

! CMIN2
neighbor 198.51.100.1 remote-as 58453
neighbor 198.51.100.1 bfd profile fast
address-family ipv4 unicast
 neighbor 198.51.100.1 activate
 neighbor 198.51.100.1 route-map IN-CMI in
 neighbor 198.51.100.1 route-map OUT-CMI out
exit-address-family

! CU/9929
neighbor 203.0.113.1 remote-as 9929
neighbor 203.0.113.1 bfd profile fast
address-family ipv4 unicast
 neighbor 203.0.113.1 activate
 neighbor 203.0.113.1 route-map IN-CU in
 neighbor 203.0.113.1 route-map OUT-CU out
exit-address-family

! PCCW
neighbor 100.64.0.1 remote-as 3491
neighbor 100.64.0.1 bfd profile fast
address-family ipv4 unicast
 neighbor 100.64.0.1 activate
 neighbor 100.64.0.1 route-map IN-PCCW in
 neighbor 100.64.0.1 route-map OUT-PCCW out
exit-address-family

! ---------- 前缀/ASN ----------
ip as-path access-list CT-AS permit (_4134_|_4809_)
ip as-path access-list CU-AS permit (_4837_|_9929_)
ip as-path access-list CM-AS permit (_9808_|_58453_)

! CN/SEA 前缀(由脚本生成)
! include /etc/frr/cn.prefix
! include /etc/frr/sea.prefix

! ---------- 出向 LP ----------
route-map IN-CN2 permit 10
 match ip address prefix-list CN-PFX
 set local-preference 300
route-map IN-CN2 permit 30
 set local-preference 150

route-map IN-CMI permit 20
 match as-path CM-AS
 set local-preference 320
route-map IN-CMI permit 30
 set local-preference 120

route-map IN-CU permit 20
 match as-path CU-AS
 set local-preference 320
route-map IN-CU permit 30
 set local-preference 120

route-map IN-PCCW permit 10
 match ip address prefix-list SEA-PFX
 set local-preference 320
route-map IN-PCCW permit 30
 set local-preference 100

! ---------- 入向社区/Prepend ----------
route-map ANNOUNCE permit 10
 set community 65001:100 additive

route-map OUT-PCCW permit 10
 match ip address prefix-list CN-PFX
 set as-path prepend 65001 65001 65001
 set community 3491:CN-LOWLP additive
route-map OUT-PCCW permit 20
 match ip address prefix-list SEA-PFX
 set community 3491:ASIA-HIGHLP additive

route-map OUT-CN2 permit 10
 match ip address prefix-list CN-PFX
 set community 4809:PREF-HIGH additive

route-map OUT-CMI permit 10
 match as-path CM-AS
 set community 58453:CN-HIGHLP additive

route-map OUT-CU permit 10
 match as-path CU-AS
 set community 9929:CN-LOCALPREF-HIGH additive

16. 成本与容量的现实主义

  • GIA/9929/CMIN2 单价高:尽量只对“命中 CN 前缀/ASN”给高 LP,其余走 PCCW。
  • 峰值爆破:为大促准备“可临时提速的 commit 附加条款”,并预先测试。
  • 监控账单:按 5 分钟粒度统计各上联出入向流量,超预算自动降 LP(非核心区域先让步)。

凌晨三点,机房走廊的人都散了,Smokeping 的红点变成了绿条。我把 PCCW 对中国的 prepend 从 3 次改回 2 次,再观察了 15 分钟——内地三网稳定、东南亚曲线也漂亮。

这活儿没有“银弹”,只有“把每条链路的脾气摸透”。BGP 不是魔法,但当你结合 社区、LP、BFD、RPKI、观测与回滚,它就能像一位可靠的分流管家,把每一份流量送到最好走的路。

如果你也在香港做出口,把这篇笔记按自己的上游和成本模型改一改,你会发现:“国内与东南亚速度一致”并不神秘,它只是工程与细节的总和。