如何在香港服务器上跑Windows Server,做多WAN + BGP多线接入,稳住跨境访问

周五夜里,我在值班室被同事一通电话叫醒:“大陆用户今晚一卡一卡的,广东到香港抖成筛子,平均 RTT 飙到 200ms+。”我背上工具包进了机房,三根光纤从不同运营商的 ODF 口进来,在机柜顶端汇聚到我们的两台边界盒子。应用跑在 Windows Server 上,边界要做多 WAN+BGP,多线就绪,但流量分布不稳、回程路径发散。那晚我做了两件事:
- 把多 WAN 物理与逻辑路径重新梳理;
- 让BGP 说人话——有策略、有度量,知道给谁让路、让几步。
第二天清晨 6 点,烟雾测试、拨测、流监都回到顺滑曲线,工单才算真正关单。
文章适用读者与目标
适用对象:需要在香港机房用 Windows Server 承载业务的运维/网络/架构人员;需要多 ISP 出口、跨境访问优化的人。
目标:
- 拿到一份可落地的多 WAN + BGP 实操流程;
- 既能在有自有 ASN+/24 的正规多宿场景跑通,也能在没有自有资源时用 “BGP 隧道/中转” 方案快速上线;
- 给出参数、配置片段、测试与回滚方法;
- 列出坑与解决路径。
1. 拓扑与硬件清单(真实可复刻)
1.1 目标拓扑
拓扑:
┌────────────────────┐
ISP-A ───────┤ Edge-Router-1 ├─────(LAN)─────┐
(eBGP) │ (VyOS/CCR) │ │
└────────────────────┘ │
┌────────────────────┐ │
ISP-B ───────┤ Edge-Router-2 ├─────(LAN)─────┤── Windows Server Farm
(eBGP) │ (VyOS/CCR) │ │ (IIS/.NET/SQL/…
└────────────────────┘ │
┌────────────────────┐ │
ISP-C ───────┤ Edge-Router-1/2 ├─────(LAN)─────┘
(eBGP) │ (第三口/子接口) │
└────────────────────┘
↑ ↑
VRRP/MC-LAG冗余 East-West
eBGP多宿 Traffic
原则:BGP 建议跑在专用边界路由器(物理/虚拟皆可),Windows Server 专注业务。Windows 自身也能跑 RRAS+BGP,但工程上不推荐承载互联网边界(可当过渡/实验)。
1.2 硬件与链路表
| 角色 | 型号/规格 | 关键参数 | 备注 |
|---|---|---|---|
| 边界路由器 | x86 1U(Intel i5/i7 或 Xeon D)/MikroTik CCR2004 | 4-8C / 16-32GB RAM / NVMe 128GB / 4×10GbE | 跑 VyOS 1.4 LTS 或 RouterOS v7 |
| TOR 交换机 | 10G L2/L3(支持 LACP、VLAN、VRRP 或 MLAG) | 2×10G 上联,24×10G 下联 | 建议双机 MLAG |
| Windows 服务器 | 2×Intel NIC 10G、NVMe SSD | Windows Server 2019/2022 Datacenter | 业务与日志分盘 |
| ISP-A/B/C | 港区不同运营商 | GPON/以太专线/交割 1G/2G/10G | 提供 eBGP Peering |
| 时钟/监控 | NTP、Smokeping、NetFlow/sFlow | RTT/Loss/抖动/路径 | 用于回路验证 |
接口命名示例:
- Edge-R1:eth0→ISP-A、eth1→LAN、eth2→ISP-C
- Edge-R2:eth0→ISP-B、eth1→LAN、eth2→ISP-C 备
2. 前置条件:你有没有 ASN 和 /24?
有自有 ASN + /24(APNIC/代理):首选。你可以把同一前缀用 BGP 对外多宿宣告,做入站工程(AS-PATH Prepend、ISP 社区/Community、MED)。
没有自有资源:两条常见路:
- BGP 隧道/代播:和中转商建立 GRE/WireGuard 隧道,由对方宣告你的业务前缀(或借用其前缀)并回注到你;你对外仍可多线出站、对内统一入口。
- SD-WAN/策略路由:不涉及 BGP,对入站工程有限,只能做出站选择与健康探测。
- 本文主线走“自有 ASN+/24”,并附带“BGP 隧道”作为可落地替代。
3. 物理与基础网络落地
3.1 端口与 MTU
ISP 口:建议 MTU 1500(若走隧道,隧道口 MTU 1476/1460,并MSS Clamping 1436/1420)。
LAN 口:10G,MTU 1500(东西向可 9000,但注意 Windows 端 NIC/交换机一致)。
3.2 Windows 网卡基础
# 统一驱动/固件,固定速率与双工
Get-NetAdapter | Format-Table Name, Status, LinkSpeed
# 禁用可能引发跨境乱序的硬件合并
Disable-NetAdapterRsc -Name "Ethernet*"
Disable-NetAdapterLso -Name "Ethernet*"
# TCP 全局
netsh interface tcp show global
netsh interface tcp set global autotuninglevel=normal ecncapability=disabled rss=enabled rsc=disabled
# MTU(示例)
netsh interface ipv4 set subinterface "Ethernet0" mtu=1500 store=persistent
坑 1:某些 NIC 的 RSC/LSO 在高延迟+抖动链路下会放大重传,跨境访问时建议关闭做 A/B。
4. 在边界路由器上启用 BGP(推荐 VyOS)
我选择 VyOS 1.4 LTS(滚动配置直观、开源、稳定)。MikroTik CCR 也可,语法略有差异。
4.1 基础系统与接口
# 系统与接口
set system host-name 'hk-edge-1'
set interfaces ethernet eth0 description 'to-ISP-A'
set interfaces ethernet eth0 address '203.0.113.2/30' # 对端 ISP-A: 203.0.113.1
set interfaces ethernet eth2 description 'to-ISP-C'
set interfaces ethernet eth2 address '198.51.100.2/30' # 对端 ISP-C: 198.51.100.1
set interfaces ethernet eth1 description 'to-LAN'
set interfaces ethernet eth1 address '10.10.10.1/24'
# VRRP (与 Edge-2 组对,提高网关可靠性)
set high-availability vrrp group G1 interface 'eth1'
set high-availability vrrp group G1 virtual-address '10.10.10.254/24'
set high-availability vrrp group G1 priority '110'
4.2 BGP 主体与 Peers
# 本地 ASN
set protocols bgp 65010 parameters router-id '203.0.113.10'
set protocols bgp 65010 parameters graceful-restart
set protocols bgp 65010 address-family ipv4-unicast maximum-paths ebgp 2
# 我方播报的前缀(自有 /24)
set protocols bgp 65010 network '203.0.113.0/24'
# 邻居 ISP-A
set protocols bgp 65010 neighbor 203.0.113.1 remote-as '64512'
set protocols bgp 65010 neighbor 203.0.113.1 timers holdtime '12'
set protocols bgp 65010 neighbor 203.0.113.1 timers keepalive '4'
set protocols bgp 65010 neighbor 203.0.113.1 ebgp-multihop '2'
set protocols bgp 65010 neighbor 203.0.113.1 update-source '203.0.113.2'
# 邻居 ISP-C
set protocols bgp 65010 neighbor 198.51.100.1 remote-as '64513'
set protocols bgp 65010 neighbor 198.51.100.1 timers holdtime '12'
set protocols bgp 65010 neighbor 198.51.100.1 timers keepalive '4'
set protocols bgp 65010 neighbor 198.51.100.1 ebgp-multihop '2'
set protocols bgp 65010 neighbor 198.51.100.1 update-source '198.51.100.2'
4.3 入站/出站工程(本地优选与回程收敛)
出站(我们选哪条出去):用 local-preference(仅本 AS 有效)
入站(外界如何选进来):用 AS-PATH Prepend、MED 或 ISP 社区(取决于对端支持)
# 定义前缀列表(必要时做更细粒度)
set policy prefix-list MY-PFX rule 10 action 'permit'
set policy prefix-list MY-PFX rule 10 prefix '203.0.113.0/24'
# 对 ISP-A:出站默认更偏好(本地优先级高)
set policy route-map OUT-TO-ISPA rule 10 action 'permit'
set policy route-map OUT-TO-ISPA rule 10 match ip address prefix-list 'MY-PFX'
set policy route-map OUT-TO-ISPA rule 10 set local-preference '200'
set protocols bgp 65010 neighbor 203.0.113.1 route-map 'OUT-TO-ISPA' out
# 对 ISP-C:对某些地域(例如海外)不做 prepend;对大陆入口适当 prepend 3 次
set policy prefix-list CN-ENTRY rule 10 action 'permit'
set policy prefix-list CN-ENTRY rule 10 prefix '203.0.113.0/24'
set policy route-map OUT-TO-ISPC rule 10 action 'permit'
set policy route-map OUT-TO-ISPC rule 10 match ip address prefix-list 'CN-ENTRY'
set policy route-map OUT-TO-ISPC rule 10 set as-path-prepend '65010 65010 65010'
set protocols bgp 65010 neighbor 198.51.100.1 route-map 'OUT-TO-ISPC' out
# 入站过滤:只收对方的默认/必要前缀,避免全表
set policy route-map IN-FILTER rule 10 action 'permit'
set policy route-map IN-FILTER rule 10 match ip address prefix-list 'DEFAULT-ONLY'
set policy prefix-list DEFAULT-ONLY rule 10 action 'permit'
set policy prefix-list DEFAULT-ONLY rule 10 prefix '0.0.0.0/0'
set protocols bgp 65010 neighbor 203.0.113.1 route-map 'IN-FILTER' in
set protocols bgp 65010 neighbor 198.51.100.1 route-map 'IN-FILTER' in
提示:如果 ISP 提供 Community 手册,通常能更优雅地影响其上游(例如“提高优先级”“不向特定区域传播”),优先使用 社区 而不是盲目 prepend。
4.4 健康检测与快速收敛
# BFD 快速检测
set protocols bgp 65010 neighbor 203.0.113.1 bfd
set protocols bgp 65010 neighbor 198.51.100.1 bfd
# 静态缺省(作为临时/回退)
set protocols static route 0.0.0.0/0 next-hop 203.0.113.1 distance '250'
set protocols static route 0.0.0.0/0 next-hop 198.51.100.1 distance '251'
5. Windows Server 侧的网络与网关
Windows 服务器不直接跑 BGP,只需把缺省网关指向 VRRP 虚 IP(例如 10.10.10.254)。
New-NetIPAddress -InterfaceAlias "Ethernet0" -IPAddress 10.10.10.10 -PrefixLength 24 -DefaultGateway 10.10.10.254
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddresses 10.10.10.2,10.10.10.3
坑 2:如果一台服务器有多块上行(多网关),Windows 的“死网关检测”并不总是可靠,容易走错路。生产里只保留一个网关,把智能切换交给边界路由器。
6. 没有 ASN+/24?用 BGP 隧道落地
当你没有自有前缀时,和“中转/代播”服务商拉一条 GRE/WireGuard 隧道最省事:
对端在多个 ISP 宣告其前缀(或为你代播一个 /24),把回程通过隧道打回你;
你这边出站照样多 WAN(策略路由/ECMP),入站统一从隧道来。
VyOS 侧示例(WireGuard):
set interfaces wireguard wg0 address '172.16.0.2/30'
set interfaces wireguard wg0 peer transit1 public-key 'xxx='
set interfaces wireguard wg0 peer transit1 endpoint 'x.x.x.x:51820'
set interfaces wireguard wg0 peer transit1 allowed-ips '0.0.0.0/0'
set protocols static route 0.0.0.0/0 next-hop 172.16.0.1 distance '5' # 入站/默认走隧道
# 出站仍可根据策略分流到 ISP-A/B/C
MSS Clamping(很关键):
set policy route pbr TCP-MSS rule 10 protocol 'tcp'
set policy route pbr TCP-MSS rule 10 tcp flags 'syn'
set policy route pbr TCP-MSS rule 10 tcp mss 'set 1436'
set interfaces wireguard wg0 policy route 'TCP-MSS'
7. 跨境优化的“几板斧”
路径工程:
- 出站用 local-pref 或基于目的前缀的策略(国内方向优先某 ISP)。
- 入站优先用 Community(如果 ISP 支持),其次是 AS-PATH Prepend。
传输层:
- Windows 上关闭 RSC/LSO,保留 RSS;
- autotuninglevel=normal,ECN 视对端启用情况;
- 正确的 MSS Clamping(尤其隧道链路)。
DNS 策略:
- 用 GeoDNS/EDNS ECS,让大陆解析到更友好的入口;
- TTL 不要过大,便于快切。
观测:
- Smokeping(HK→华南/华东/华北)、拨测节点;
- NetFlow/sFlow 看不对称与热点;
- BGP 会话与路由变化告警(BFD flap、Prefix Count)。
8. 验证与数据(真实格式示例)
8.1 拨测结果(优化前后)
| 目的地 | 方案 | 平均 RTT | Jitter | 丢包 | 备注 |
|---|---|---|---|---|---|
| 深圳移动 | 优化前 | 168ms | 22ms | 1.8% | 路径漂移 |
| 深圳移动 | 优化后 | 62ms | 4ms | 0.2% | 入站社区 + 出站优选 |
| 上海联通 | 优化前 | 190ms | 30ms | 2.1% | - |
| 上海联通 | 优化后 | 78ms | 6ms | 0.4% | Prepend 到不优链 |
| 北京电信 | 优化前 | 210ms | 28ms | 2.5% | - |
| 北京电信 | 优化后 | 95ms | 8ms | 0.6% | BFD 快切生效 |
8.2 会话与前缀健康
| 项 | 值 |
|---|---|
| eBGP 会话 | 2/2 Established(A、C) |
| 收前缀 | 1(默认) |
| 播前缀 | 1(/24) |
| BFD | Up(Detect 300ms) |
| VRRP | Master on Edge-1(优先级 110) |
9. 常见坑与“现场解法”
异步路由引发会话 Reset
现象:大陆方向入口走 ISP-A,回程误走 ISP-C,引发 QoS/丢包。
解法:用 Community 限制某入口的传播或对不优链 Prepend,确保“来回一致”。
MTU 黑洞
现象:大包卡死,小包正常。
解法:MSS Clamping 到 1436/1420(取决于隧道),端到端统一 MTU。
RRAS/BGP 在 Windows 上实战不稳
现象:测试可用,上生产扛不住边界复杂度。
解法:BGP 固化到边界路由器,Windows 只做业务与 East-West。
硬件卸载导致乱序/延迟抖动
现象:跨境 TCP Retrans 增多。
解法:关闭 RSC/LSO,保留 RSS;观察 netsh tcp 统计项。
ISP 只给静态路由/不愿 eBGP
现象:谈不拢 BGP。
解法:签补充协议或走 BGP 隧道/中转 暂替;同时给对方做健康检测承诺(BFD/探测)。
路由抖动(Flap)触发对端抑制
现象:频繁切换触发 Flap-Damping。
解法:稳住健康检测阈值,避免“抖一下就切”;出站策略尽量确定性。
IRR/ROA 不齐
现象:前缀被过滤。
解法:在相应 IRR 建好 Route-Object,完整 RPKI/ROA(若有)。
10. 进阶:把 BGP 与业务“黏”起来
按业务分前缀/Anycast:热点业务切出独立 /24,便于独立工程。
灰度切换:把 GeoDNS 权重与 BGP 策略联动,先 10% 观察,再放量。
可观测栈:
- BGP:ExaBGP + Prometheus Exporter;
- 链路:Smokeping/LibreNMS;
- 业务:APM(入口 RTT/错误率)。
11. 附:Windows RRAS+BGP(实验/过渡用)
谨慎使用:生产边界不建议;但很多人会问“能不能在 Windows 上直接跑 BGP?”。可以,做法如下(以 2019/2022 为例):
# 安装 RRAS / Routing
Install-WindowsFeature RemoteAccess -IncludeManagementTools
Install-WindowsFeature Routing
# 初始化(GUI 可选:打开“路由和远程访问”,配置仅路由)
# BGP 相关 PowerShell(命令以版本为准,以下为常用形态)
Add-BgpRouter -LocalASN 65010 -RouterId 203.0.113.10
Add-BgpPeer -Name "ISP-A" -LocalASN 65010 -PeerASN 64512 -PeerIPAddress 203.0.113.1 -LocalIPAddress 203.0.113.2 -PeeringMode IPv4 -HoldTime 12 -KeepAliveTime 4
Add-BgpPeer -Name "ISP-C" -LocalASN 65010 -PeerASN 64513 -PeerIPAddress 198.51.100.1 -LocalIPAddress 198.51.100.2 -PeeringMode IPv4 -HoldTime 12 -KeepAliveTime 4
# 公告前缀(把服务前缀引入 BGP)
#(不同版本可能为 Add-BgpCustomRoute / Add-BgpRoute 等,建议 Get-Command -Module RemoteAccess/Routing 查准)
# 示例:
# Add-BgpCustomRoute -Network 203.0.113.0/24
# 查看状态
Get-BgpPeer
Get-BgpRoute -All
强提醒:RRAS BGP 的路由策略、社区、过滤在 GUI/PowerShell 的灵活度和观测性都不如专业边界设备。生产建议迁出到边界路由器。
12. 变更/回滚与 SOP
变更窗口:跨境高峰外(凌晨 1–3 点),灰度(先单 ISP)→ 全量。
三步验证:
BGP 会话 Established,前缀数/默认路由正确;
Smokeping 拨测三地(华南/华东/华北)稳定;
业务 APM:错误率/时延无异常。
回滚:
移除新 Route-Map/Prepend,恢复原策略;
关闭新建 eBGP Peer;
静态缺省恢复到旧链路(distance 更低)。
13. 成本与收益评估(样例)
| 项目 | 一次性 | 月租/运维 | 备注 |
|---|---|---|---|
| 边界路由器(x86×2) | 2×¥10,000 | - | 可虚拟化节省 |
| ISP-A/B/C 专线 | - | ¥X,XXX–¥XX,XXX | 视带宽/运营商 |
| 机柜/交叉(X-Connect) | ¥1,000–¥3,000 | ¥500–¥1,000 | 机房定价差异 |
| 观测/拨测 | - | ¥200–¥1,000 | 自建基本免费 |
| 收益 | - | - | 跨境 RTT/Jitter 降低 40–60%,峰值错误率下降 50%+ |
14. “收官”的那个清晨
早上 5 点 40,VRRP 主备在 HSRP 旁一排绿灯,Smokeping 的绿条拉回了久违的平直。我们把针对华东的 Prepend 收了一格,华南入口固定在 A 链路。站在机柜前,我把工单里的“临时策略”打了删除线,留下一份可复用的 SOP。
运维的浪漫不过是:让每一次波峰起落,都在我们的预期之内。
15. 速查清单(Checklist)
- 物理与 MTU/MSS 一致
- BGP 会话稳(BFD/GR 开启)
- 入站:社区/Prepend 策略生效
- 出站:Local-Pref/策略路由合理
- Windows:RSC/LSO 关闭,RSS/Autotune 正常
- DNS:ECS/Geo 策略与路由一致
- 观测:RTT/Jitter/丢包 + BGP 事件告警
- 回滚路径清晰可操作
这篇不是“某某黑科技”的神话,只有边界清晰、参数可追溯、策略能复盘的老老实实工程。把 多 WAN + BGP 收拾利索,Windows Server 就能安心做业务,跨境访问也会回到它该有的样子——稳定、可预期、能被度量。如果你也正卡在香港机房的那口风里,不妨照着这份手册走一遍;等到烟雾测试的曲线变直,你会知道,折腾是值得的。