
那天是周四晚上 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、观测与回滚,它就能像一位可靠的分流管家,把每一份流量送到最好走的路。
如果你也在香港做出口,把这篇笔记按自己的上游和成本模型改一改,你会发现:“国内与东南亚速度一致”并不神秘,它只是工程与细节的总和。