手游出海如何通过香港服务器的多线 BGP 网络提升南美与东南亚玩家的接入稳定性?

半夜 2:40,香港观塘机房的监控墙上巴西圣保罗的延迟曲线像心电图一样忽高忽低,玩家工单里“瞬移”“橡皮筋”刷屏。我们在香港只上了一条“看起来很干净”的国际线路,东南亚玩家还好,但南美用户一激增,跨洲抖动立刻放大。那晚我做了一个决定:用多线 BGP + 策略路由 + 轻量隧道,把南美和东南亚流量拆开走最稳的路径,并把资产分发迁到支持 HTTP/3 的边缘上。48 小时内,我们把丢包从 3% 拉到 0.2% 以下,把 95 线抖动压到 15ms 左右。下面是复盘与全流程教程。
目标:
- 南美(重点巴西/阿根廷)与东南亚(新加坡/印尼/越南/菲律宾)玩家的进服握手稳定、技能释放无橡皮筋、重连无感;
- 峰值期间丢包 < 0.5%,95 线 RTT 抖动 < 20ms;
- 故障可在 30s 内自动切走,回源透传无状态或最小状态保持。
核心思路:
- 香港多线 BGP 边缘作为入站统一入口;
- 通过WireGuard/GRE 轻量隧道把特定区域流量分流至更顺的洲际路径(例如先北向美国西海岸再南下拉美,或直接东南亚短路径);
- 策略路由 + BGP 社区(如可用)控制出口;
- BBR/QUIC/队列调度降低排队延迟;
- HA 与健康探测确保链路与进程级快速切换;
- 观测用 MTR/Blackbox/Smokeping/Prometheus 形成闭环。
2. 现场环境与硬件清单(我正在线上使用的组合)
| 角色 | 型号/规格 | 关键点 |
|---|---|---|
| HK 边缘(入口)x2 | AMD EPYC 7443P / 256GB / NVMe 3.2TB / Intel X710 10GbE | 多线 BGP 接入(含多家运营商),10G 口,支持私有 ASN 或托管 BGP 会话 |
| 隧道中继 LA | 8 vCPU / 16GB / 10Gbps 虚拟口 | 北美中转,去南美更稳 |
| 隧道中继 SG | 8 vCPU / 16GB / 10Gbps 虚拟口 | 东南亚回程就近 |
| HK 业务集群 | 4~12 台,规格同上或略低 | 游戏网关/匹配/房间服,支持横向扩展 |
| 操作系统 | CentOS 7(生产历史包袱)/ Rocky 9(新机器) | CentOS 7 已 EOL;我给出两套指令,老业务按 ELRepo 走,新机建议 Rocky/Alma |
| 交换机 | L2/10G,支持 LACP | 内网汇聚与冗余 |
| 监控 | Prometheus + Grafana + Smokeping | 烟雾测试 + 端到端黑盒探测 |
注:如果没有自有 ASN/前缀,仍可用本文方案(DNS/GSLB + 策略路由 + 隧道)。有 ASN 则可进一步用 BGP 社区做更细路由偏好。
3. 拓扑与流量走向(文字版)
玩家(南美/东南亚)
│
▼
香港多线BGP入口(Anycast或GSLB)
├─ 本地转发 → 业务网关/匹配/房间服
├─ WG 隧道 → LA 中继(再南下巴西/阿根廷运营商)
└─ WG 隧道 → SG 中继(回东南亚本地运营商)
↑
Policy Routing 基于客户端国家/AS → 打标 → 选路
4. 网络与系统调优基线
4.1 内核与 TCP/队列(CentOS 7 与 Rocky 分别给出)
CentOS 7(建议装新内核 + BBR)
# 安装 ELRepo 并上 kernel-ml(示例 5.x)
yum install -y epel-release
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
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 && grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
# 启用 BBR + FQ
cat >> /etc/sysctl.d/99-net-tuning.conf <<'EOF'
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
net.core.rmem_max=67108864
net.core.wmem_max=67108864
net.ipv4.tcp_rmem=4096 87380 33554432
net.ipv4.tcp_wmem=4096 65536 33554432
net.ipv4.tcp_mtu_probing=1
net.ipv4.tcp_ecn=1
net.ipv4.ip_local_port_range=10000 65000
net.netfilter.nf_conntrack_max=4194304
net.ipv4.tcp_fin_timeout=10
EOF
sysctl --system
Rocky 9(系统自带新内核,直接启用)
cat >> /etc/sysctl.d/99-net-tuning.conf <<'EOF'
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
net.ipv4.tcp_ecn=1
...
EOF
sysctl --system
4.2 网卡与中断
# 关闭部分会导致抖动的 offload(按需验证)
ethtool -K eno1 tso off gso off gro off rx on tx on
# 中断亲和与 RPS/RFS
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
for q in /sys/class/net/eno1/queues/rx-*; do echo 4096 > $q/rps_flow_cnt; done
# irqbalance 建议开启
systemctl enable --now irqbalance
5. 多线 BGP 的两种使用姿势
5.1 无自有 ASN/前缀(大多数团队)
- 让香港机房提供“多线 BGP 出口”与可选的路由偏好接口(有些厂商支持BGP 社区或工单切换偏好)。
- 我们把分区流量打标,通过WireGuard 隧道送到 LA/SG,再走各自当地更稳的运营商落地。
- 入站入口可用GSLB(按区域/健康度/权重),无需自己对外广播 BGP。
5.2 有自有 ASN(进阶)
与香港机房建立 BGP session(Bird/FRR/ExaBGP),对上游打 Community(如:偏好某运营商、抑制/提升本地优先级)。
对外可做Anycast(同一前缀在多点宣布)。
本文附 Bird/ExaBGP 示例。
6. 区域分流:WireGuard 隧道 + 策略路由
6.1 安装 WireGuard
CentOS 7(用 ELRepo 内核后装)
yum install -y epel-release
yum install -y wireguard-tools
modprobe wireguard
Rocky 9
dnf install -y wireguard-tools
6.2 建立两条隧道(到 LA 与 SG)
/etc/wireguard/wg-la.conf
[Interface]
Address = 10.10.1.1/30
ListenPort = 51820
PrivateKey = <HK_PRIVATE_KEY>
MTU = 1420
[Peer]
PublicKey = <LA_PUBLIC_KEY>
AllowedIPs = 10.10.1.2/32
Endpoint = <LA_PUBLIC_IP>:51820
PersistentKeepalive = 15
/etc/wireguard/wg-sg.conf
[Interface]
Address = 10.10.2.1/30
ListenPort = 51821
PrivateKey = <HK_PRIVATE_KEY_2>
MTU = 1420
[Peer]
PublicKey = <SG_PUBLIC_KEY>
AllowedIPs = 10.10.2.2/32
Endpoint = <SG_PUBLIC_IP>:51821
PersistentKeepalive = 15
启动:
wg-quick up wg-la
wg-quick up wg-sg
systemctl enable wg-quick@wg-la wg-quick@wg-sg
6.3 基于国家/AS 的打标与策略路由(nftables 版本)
准备国家段(用官方 CIDR 列表离线生成):
# 例:把 BR/AR 走 LA,SEA 国家走 SG
# /etc/nftables.d/geo.nft
define BR = { 177.0.0.0/8, 200.128.0.0/9, ... }
define AR = { 181.0.0.0/8, 200.0.32.0/19, ... }
define SEA = { 101.100.0.0/16, 103.0.0.0/8, ... } # 示例,实际请导入国家库
策略与打标:
cat > /etc/nftables.conf <<'EOF'
flush ruleset
table inet preroute {
set br_ar { type ipv4_addr; flags interval; }
set sea { type ipv4_addr; flags interval; }
chain mangle_in {
type filter hook prerouting priority mangle; policy accept;
ip saddr @br_ar meta mark set 10
ip saddr @sea meta mark set 20
# MTU 黑洞保护(TCP MSS clamp)
tcp flags syn tcp option maxseg size set rt mtu
}
}
EOF
nft -f /etc/nftables.conf
systemctl enable nftables
路由表与规则:
# /etc/iproute2/rt_tables
echo "100 la" >> /etc/iproute2/rt_tables
echo "200 sg" >> /etc/iproute2/rt_tables
ip route add default dev wg-la table la
ip route add default dev wg-sg table sg
ip rule add fwmark 10 table la
ip rule add fwmark 20 table sg
在 HK 入口机器上,这就实现了“来自 BR/AR 的玩家 → 走 LA 隧道 → 再南下”的路径;SEA 国家段走 SG 隧道。国家库建议定时离线更新。
7. (可选)有 ASN 时的 BGP 控制示例
7.1 Bird2 入门配置(对上游 peer)
/etc/bird/bird.conf(节选)
router id 203.0.113.2;
protocol device {}
protocol kernel {
persist;
scan time 20;
import all;
export all;
}
filter upstream_pref {
# 给南美相关前缀加 localpref 或加社区以偏好某转运商
if net ~ [ 200.0.0.0/7+, 181.0.0.0/8+ ] then {
bgp_local_pref = 200;
# bgp_community.add((65000, 100)); # 示例:让上游偏好运营商A
}
accept;
}
protocol bgp up1 {
local as 64512;
neighbor 198.51.100.1 as 65530;
import all;
export filter upstream_pref;
graceful restart on;
}
7.2 ExaBGP 宣布本地路由(简单粗暴)
/etc/exabgp/exabgp.conf
neighbor 198.51.100.1 {
router-id 203.0.113.2;
local-as 64512;
peer-as 65530;
family {
ipv4 unicast;
}
api {
processes [ announce ];
}
}
process announce {
run /usr/bin/python3 /opt/announce.py;
}
/opt/announce.py(动态根据健康度宣布/撤销前缀,略)
注:具体社区值与策略需要跟上游协商;部分厂商支持“拉美优先/东南亚优先”的社区模板,极其好用。
8. 业务接入与会话层
8.1 L4/L7 入口(HAProxy + Keepalived)
/etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eno1
virtual_router_id 51
priority 120
advert_int 1
authentication { auth_type PASS auth_pass s3cr3t }
virtual_ipaddress { 203.0.113.10/24 dev eno1 }
track_script { chk_haproxy }
}
vrrp_script chk_haproxy { script "/usr/bin/pgrep haproxy"; interval 2; weight 10; }
/etc/haproxy/haproxy.cfg(UDP/QUIC 旁路,TCP 为例)
global
maxconn 200000
tune.bufsize 65536
log 127.0.0.1 local0
defaults
mode tcp
option tcplog
timeout connect 3s
timeout client 60s
timeout server 60s
frontend game_in
bind 0.0.0.0:443
default_backend game_pool
backend game_pool
balance leastconn
server g1 10.0.0.11:8443 check
server g2 10.0.0.12:8443 check
8.2 资产分发与 HTTP/3(Nginx 新版)
/etc/nginx/nginx.conf(片段)
http {
http2 on;
server {
listen 443 ssl http2;
# HTTP/3 需要另开
listen 443 quic reuseport;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
add_header alt-svc 'h3=":443"; ma=86400';
add_header QUIC-Status $quic;
location /assets/ {
root /data/cdn;
expires max;
}
}
}
静态资源走 HTTP/3 能显著降低弱网首包等待;游戏长连(TCP/UDP)仍按协议栈设计走网关。
8.3 UDP 游戏协议的弱网优化(可选)
自研或采用 KCP + FEC(前向纠错),把突发丢包“抹平”;
Linux tc 维持 fq 调度,减少队头阻塞。
控制发送窗口,避免 RTT 抖动时过度重传。
9. 观测与压测
- Smokeping:香港 → LA/SG 隧道对端的抖动与丢包;
- MTR:玩家热点城市拨测至 VIP、至隧道对端;
- Prometheus Blackbox:TCP/UDP 握手、TLS、HTTP 首包;
- 业务埋点:登录耗时、首包、技能释放到达时间、重连率。
示例告警(Prometheus 规则):
groups:
- name: edge
rules:
- alert: SouthAmericaJitterHigh
expr: (histogram_quantile(0.95, sum(rate(rtt_seconds_bucket{region="BR"}[5m])) by (le))) > 0.08
for: 10m
labels: { severity: page }
annotations:
summary: "BR 95线 RTT 抖动 > 80ms"
10. 实战数据(取近一次版本上线周)
| 区域 | 优化前 RTT 中位 | 优化后 RTT 中位 | 优化前丢包 | 优化后丢包 | 95 线抖动 |
|---|---|---|---|---|---|
| 圣保罗 | 340ms | 260ms | 3.2% | 0.3% | 15ms |
| 里约 | 360ms | 275ms | 2.8% | 0.4% | 17ms |
| 布宜诺斯艾利斯 | 330ms | 250ms | 2.5% | 0.3% | 14ms |
| 雅加达 | 75ms | 53ms | 1.1% | 0.2% | 9ms |
| 马尼拉 | 88ms | 62ms | 1.4% | 0.2% | 11ms |
| 河内 | 71ms | 55ms | 0.9% | 0.2% | 10ms |
解释:南美通过 HK→LA→南下 的复合路径,整体 RTT 仍是洲际级,但抖动和丢包显著下降;东南亚基本走 HK↔SG 近邻口,改善更直接。
11. 部署步骤清单(从零到上线)
- 拿到机器:HK 两台入口(多线 BGP)、LA/SG 中继各一台;交换机与 VLAN 打通。
- 装系统与基线调优:CentOS 7 的装 ELRepo 新内核、启 BBR、队列与中断优化;Rocky 9 直接启 BBR。
- WireGuard 隧道:HK↔LA、HK↔SG 建好,MTU 1420,Keepalive=15。
- 国家/AS 库:生成 BR/AR/SEA 等 ipset 或 nft set。
- nftables:按国家打 mark(10=南美走 LA,20=东南亚走 SG),ip rule 绑定到不同路由表。
- L4 入口:HAProxy + Keepalived 部署 VIP,业务后端做健康检查与弹性扩容。
- 静态资源:Nginx 开启 HTTP/2 + HTTP/3,assets 长缓存。
- (可选)BGP 控制:有 ASN 的按 Bird/ExaBGP 与上游调偏好与社区;无 ASN 的通过厂商工单模板切偏好。
- 监控与告警:Smokeping/MTR 基线;Blackbox 监测握手与首包;业务埋点接入。
- 灰度与回滚:先 5% 地区白名单启用分流,观察 24h;任一指标劣化自动回切默认出口。
12. 过程中踩过的坑与现场解法
MTU 黑洞:WireGuard 默认 MTU 不合适,TCP 分片后握手卡住。
解法:WG 端 MTU 固定 1420,并在 nftables 里做 tcp mss clamp;UDP 协议侧缩小包体。
conntrack 爆表:晚高峰 NAT 表溢出,掉线与重连暴增。
解法:nf_conntrack_max 提升到数百万级,HAProxy 减少非必要 keepalive,业务长连走直连端口。
“只有延迟低,没有稳定”:单路径 RTT 好看,但抖动大。
解法:宁可走略长但可预期的链路;用抖动与 95 线作为主指标,而不是 RTT 中位数。
上游“机房说已优化”但曲线无变化:口头确认不等于路由生效。
解法:用 MTR 对比 AS 路径、看 Community 是否如预期落地;必要时改走自建隧道。
HTTP/3 首包超时:某些 ISP 防火墙对 QUIC 不友好。
解法:GSLB 对该 ASN/国家回退到 HTTP/2,或只对静态资源使用 H3。
13. 成本与容量估算(经验值)
- 10Gbps 峰值:HK 入口 2 台足够(CPU <40%,中断均衡良好);LA/SG 中继按各 4~6Gbps 预留。
- 隧道开销:WireGuard CPU 在 AES-NI/VAES 下可忽略,建议观测单核占比与包率(pps)。
- 运营开销:国家库每日更新一次;路由策略变更先在影子规则中模拟命中率。
14. 最小可用配置(给时间很赶的同学)
- HK 单入口 + 多线 BGP 口
- HK↔SG 一条 WG 隧道(覆盖东南亚)
- nftables 国家打标 + ip rule 分流
- Nginx 开启 HTTP/3 分发静态资源
- Smokeping 观测 + MTR 定时快照
- 先把 SEA 稳住,再加 LA 中继去拉美。
15. 安全与合规
- 隧道与边缘仅开放必要端口;SSH 用跳板与 MFA;
- WG 密钥 90 天轮换;
- Prometheus/管理面走独立安全网段;
- 日志脱敏,遵守各地数据出境与隐私要求。
一个星期后,社区里巴西玩家发了段 PVP 视频,评论里第一次没有“rubber banding”的吐槽。凌晨告警减少到个位数,机房里那台老旧的电扇终于不像审问室一样嗡嗡作响。
这套“香港多线 BGP + 隧道分流 + 策略路由 + 传输层优化”不是玄学,它只是把网络的可预期性找了回来。对出海手游来说,稳定就是体验,体验就是留存,留存就是生命线。希望这份实操笔记,能帮你在下一次高峰来临前,心里更有底