本文面向已经把 GA 基础型加速器挂到边缘计算 ECS 上的运维人员,聚焦 ECS 内部 Linux 路由配置。文中给出两类典型场景(虚机默认走本地公网 vs 默认走 GA 出公网)的命令、参数含义、跨重启持久化脚本以及验证与回滚方法,帮助您在多网卡边缘 ECS 上精确控制出向/回程流量路径。
在“GA 基础型加速器 + 跨域带宽 CRB + 边缘计算 ECS”的组合方案中,加速器和跨域带宽的开通、加速 IP 挂载等步骤在控制台完成,方案落地的最后一步落在 ECS 内部:Linux 系统路由决定了 GA 入向流量的回包路径,以及虚机主动访问公网时的出口选择。
边缘计算 ECS 通常具备两张网卡(eth0 为 VPC 内网卡,eth1 为本地公网卡),因此存在两条候选出公网路径:
eth1 直接走本地公网出口。eth0 经 VPC 子网网关,最终经由 GA/跨域带宽承载出公网。不同业务对“客户端如何接入”和“虚机如何出公网”的诉求不同。本文将 国内→海外游戏加速 — 三层加速 + 香港代理中转 和 国内→海外游戏加速 — 三层加速 + 国内就近接入 两个实践中的路由配置部分统一整理为两个典型场景:

两种场景在 GA 控制台侧的资源创建步骤完全一致,差异只在 ECS 内部路由,请先根据下表做出选择。
| 对比维度 | 场景一:默认走本地公网 | 场景二:默认走 GA 出公网 |
|---|---|---|
| 客户端接入地址 | GA 加速 IP | ECS 虚机公网 IP |
| 虚机主动出公网默认路径 | 本地公网出口(eth1)不变 | 改走 eth0 至 VPC 子网网关,经 GA/跨域链路 |
| 路由改造方式 | 增加策略路由(ip rule + 独立路由表 table 100) | 修改系统默认路由(ip route change default) |
| 默认路由是否被替换 | 否 | 是 |
| 运维风险 | 低,原默认路由保留 | 高,需提前确认管理入口与回滚方式 |
| 典型用途 | 客户端加速接入,虚机保留本地出口访问外部依赖 | 虚机作为业务代理/透明代理,统一走 GA 跨境出口 |
决策指引:
bind 特定网卡 IP 精细化控制单条连接的出口(见下文提示)。说明
无论哪种场景,ECS 内的程序都可以通过主动 bind eth0 或 eth1 上的私网/公网 IP 来决定该连接的出公网流量是否走 GA 跨境。这提供了在同一台虚机上并存两种出口的灵活性。
注意
本文介绍的路由配置只是实验环境下的参考配置,在生产环境中可能需要根据操作系统版本和业务逻辑进行适当调整。
以 root 或 sudo 权限执行以下命令:
ip rule add from {VPC子网} lookup 100 ip route add default dev eth0 via {VPC子网网关} table 100
命令语义:
ip rule 添加一条策略路由规则:来源地址属于 VPC 子网网段的流量,查表 100。ip route 在路由表 100 中写入默认路由,出接口 eth0、下一跳为 VPC 子网网关。由此,来自 VPC 子网(即 GA 转发进来的入向流量)按预期通过 eth0 回包;虚机主 main 路由表未被触碰,主动出公网仍走本地公网。
| 参数 | 说明 | 示例 |
|---|---|---|
{VPC子网} | ECS 所在 VPC 子网的 CIDR | 10.0.0.0/24 |
{VPC子网网关} | VPC 子网网关,取子网第一个 IP | 10.0.0.1 |
table 100 | 自定义路由表编号,与 ip rule 中的 lookup 100 保持一致;如与现有路由表冲突可改为其他未占用编号 | 100 |
说明
场景一的核心是“只对指定来源流量走策略路由”。虚机原有默认路由不被替换,因此虚机主动出公网仍走本地公网。
直接执行 ip rule / ip route add 只在当前内核会话内生效,实例重启后规则会丢失。以下脚本会自动从 eth0 提取 IP 与掩码、推导 VPC 子网和网关(网关取网段第一个 IP),并把生效命令写入 /etc/rc.local 实现开机自动加载。使用 root 权限执行:
#!/bin/bash rc_local=/etc/rc.local table_id=100 ETH=eth0 ip=$(ip addr show $ETH | awk '$1=="inet"{print $2}' | head -n1) ip_part=${ip%/*} mask_part=${ip#*/} IFS='.' read -r i1 i2 i3 i4 <<< "$ip_part" ip_int=$(( (i1 << 24) | (i2 << 16) | (i3 << 8) | i4 )) mask_bits=$(( 0xFFFFFFFF << (32 - mask_part) )) network_int=$(( ip_int & mask_bits )) netgw_int=$(( network_int + 1 )) netgw=$(printf "%d.%d.%d.%d\n" \ $(( (netgw_int >> 24) & 0xFF )) \ $(( (netgw_int >> 16) & 0xFF )) \ $(( (netgw_int >> 8) & 0xFF )) \ $(( netgw_int & 0xFF ))) network=$(printf "%d.%d.%d.%d/%d\n" \ $(( (network_int >> 24) & 0xFF )) \ $(( (network_int >> 16) & 0xFF )) \ $(( (network_int >> 8) & 0xFF )) \ $(( network_int & 0xFF )) \ $mask_part) cat >$rc_local <<EOF #!/bin/bash ip rule add from $network lookup $table_id ip route add default dev eth0 via $netgw table $table_id exit 0 EOF chmod +x $rc_local
执行完毕后,可通过 cat /etc/rc.local 检查生成的内容是否符合预期,并确认 rc.local 已有可执行权限。
以 root 或 sudo 权限执行:
ip route change default dev eth0 via {VPC子网网关}
命令语义:将系统 main 路由表中的默认路由改为经 eth0 至 VPC 子网网关,从而把所有未匹配到具体路由的流量都推向 GA/跨域链路。
| 参数 | 说明 | 示例 |
|---|---|---|
{VPC子网网关} | VPC 子网网关,取子网第一个 IP | 10.0.0.1 |
注意
该命令会直接替换系统默认路由,影响虚机所有默认出公网流量。执行前请务必确认以下事项,避免误改后失去对虚机的运维访问:
eth0 的链路;如果 SSH 依赖本地公网 IP 直连(即 eth1),需先补充针对源 IP 的策略路由或保留一条明细路由,防止会话断开。eth1)上是否仍需可达;若客户端已切到虚机公网 IP,回包路径也需要走 eth1,必要时结合策略路由处理入向流量。iptables 拦截。ip route show default),并准备好回滚命令 ip route change default dev eth1 via <本地公网网关>,以及通过 VPC 跳板机、控制台 VNC 登录的兜底方案。修改默认路由的动作也需要在实例重启后自动重放。以下按操作系统分别提供脚本,均以 root 权限执行。
写入 /etc/sysconfig/network-scripts/route-eth0,让 network 服务在 eth0 up 时应用默认路由:
#!/bin/bash route_file=/etc/sysconfig/network-scripts/route-eth0 ETH=eth0 ip=$(ip addr show $ETH | awk '$1=="inet"{print $2}' | head -n1) ip_part=${ip%/*} mask_part=${ip#*/} IFS='.' read -r i1 i2 i3 i4 <<< "$ip_part" ip_int=$(( (i1 << 24) | (i2 << 16) | (i3 << 8) | i4 )) mask_bits=$(( 0xFFFFFFFF << (32 - mask_part) )) network_int=$(( ip_int & mask_bits )) netgw_int=$(( network_int + 1 )) netgw=$(printf "%d.%d.%d.%d\n" \ $(( (netgw_int >> 24) & 0xFF )) \ $(( (netgw_int >> 16) & 0xFF )) \ $(( (netgw_int >> 8) & 0xFF )) \ $(( netgw_int & 0xFF ))) cat >$route_file <<EOF default dev eth0 via $netgw EOF
写入 /etc/network/if-up.d/route-to-ga,让 ifupdown 在网卡 up 事件中触发默认路由修改:
#!/bin/bash route_file=/etc/network/if-up.d/route-to-ga ETH=eth0 ip=$(ip addr show $ETH | awk '$1=="inet"{print $2}' | head -n1) ip_part=${ip%/*} mask_part=${ip#*/} IFS='.' read -r i1 i2 i3 i4 <<< "$ip_part" ip_int=$(( (i1 << 24) | (i2 << 16) | (i3 << 8) | i4 )) mask_bits=$(( 0xFFFFFFFF << (32 - mask_part) )) network_int=$(( ip_int & mask_bits )) netgw_int=$(( network_int + 1 )) netgw=$(printf "%d.%d.%d.%d\n" \ $(( (netgw_int >> 24) & 0xFF )) \ $(( (netgw_int >> 16) & 0xFF )) \ $(( (netgw_int >> 8) & 0xFF )) \ $(( netgw_int & 0xFF ))) cat >$route_file <<EOF #!/bin/bash ip route change default dev "$ETH" via "$netgw" exit 0 EOF chmod +x $route_file
配置生效后,建议按以下命令自检,确认路由与规则符合预期。
查看主路由表默认路由:
ip route show default
eth1(本地公网卡),未被修改。eth0 与 VPC 子网网关。查看策略路由规则:
ip rule show
场景一下应能看到形如 from 10.0.0.0/24 lookup 100 的自定义规则。
查看自定义路由表内容:
ip route show table 100
场景一下应能看到 default via <VPC子网网关> dev eth0。
端到端连通性验证:
curl ifconfig.me 观察出公网 IP,应为本地公网 IP。curl ifconfig.me 应显示为 GA 出口 IP。若配置后出现连通性问题,可按对应场景快速回滚。
场景一回滚:删除策略路由规则和自定义路由表条目即可,主路由表未受影响。
ip rule del from {VPC子网} lookup 100 ip route del default dev eth0 via {VPC子网网关} table 100
如果已经写入 /etc/rc.local,需要同步清空或删除持久化脚本内容,防止重启后再次生效。
场景二回滚:将默认路由改回本地公网出口。
ip route change default dev eth1 via <本地公网网关>
同时删除或修改 /etc/sysconfig/network-scripts/route-eth0(CentOS)或 /etc/network/if-up.d/route-to-ga(Debian/Ubuntu),避免下次重启自动重放。
说明
若在场景二下已经因误改默认路由丢失 SSH 访问,可通过火山引擎控制台的 VNC 登录进入实例,或经由 VPC 内跳板机走内网 eth0 登录,再执行回滚命令。