中继带宽跑满后,问题远不止“慢”

把中继服务器部署在公网后,远程访问内网系统的路径就变成了:Client 到中继、中继再到 Server。这条链路上任何一段的抖动、拥塞或限速,都会直接作用在 Git 拉取、SQL 查询或 CI 构建上。一个常被忽视的事实是:中继节点的带宽瓶颈往往不是总吞吐,而是单连接吞吐。即便中继服务器买了 100Mbps 带宽,单个 TCP 会话经过 NAT、防火墙和转发队列后实际能跑到的速率可能只有标称值的十分之一。这解释了为什么用户在办公室千兆内网直连 SVN 时没问题,一换上远程中继就掉到几十 KB/s。

私有化中继的核心命题,就是让链路退化从“不可控”变为“可度量、可取舍”。安全策略会消耗带宽和时延——TLS 加密、逐包校验、会话持久化、访问审计,每一项都有真实开销。安全与性能不是对立的两端,而是一组可以在部署阶段就作出明确选择的参数。问题在于,多数团队在部署中继时只测通和测速,很少细致区分流量类型,也从不做端到端的丢包归因。

中继部署形态怎么选:裸机、容器、还是云上私有中转

私有化中继的部署位置决定了第一跳和第二跳的可控程度。三种常见形态的取舍差异极大:

部署形态典型场景性能优势安全与运维代价
企业内网边缘裸机/VM已有 DMZ 或边界服务器资源,内网出口带宽足够到内网 Server 的第二跳最短,可原生接入内网防火墙策略需要自行维护公网映射、证书、系统补丁和告警
内网侧 Docker/K8s 容器中继与 Server 同机房或同集群部署资源弹性伸缩,便于快速扩缩转发实例容器网络栈对长连接和大流量 TCP 调优需要额外处理
云上私有中继(单租户)多分支机构、外包开发或跨地域访问集中化第一跳走云骨干网,可做 BGP 入口、多线接入转发资源长期保留成本高;数据流经云需做合规确认

裸机部署最大的坑在操作系统网络参数。Linux 默认的 net.ipv4.tcp_rmem、tcp_wmem 和拥塞控制算法不是为中转场景优化的。高延迟、跨运营商链路上,默认 cubic 结合较小的 socket buffer 会让大文件传输速率长时间缓慢爬坡。容器部署则需要注意:如果中继容器用了 bridge 网络,每个转发的包都要过 iptables NAT 和 veth pair,对比 host 网络模式会有可测的吞吐损失。

[插图建议:三种中继部署形态的网络路径图,标注第一跳和第二跳的流量方向]

让流量有“优先级”,而不是靠中继硬扛所有连接

多用户同时通过一个中继访问 SVN、MySQL、Jenkins 时,总带宽不是唯一瓶颈。一个开发者的全量 Git 仓库同步就可能占满中继的上行队列,导致其他人的 SQL 响应从几十毫秒跌到几秒。这不是“带宽不够”,而是没有对流量的突发性和时延敏感性做区分。

通用的做法区分两类流量:

  • 批量吞吐型:大文件检出、Nexus 依赖包下载、数据库全量备份拉取。这类流量对单包时延不敏感,但对带宽占用极不友好,容易引发队头阻塞。
  • 交互时延型:SQL 逐条查询、SVN 小文件 diff、GitLab 页面操作、Jenkins 日志滚动。建立连接的频率高、请求包小、响应要求快,一旦被大流量挤在队列后面体感立刻恶化。

只靠中继层做包转发无法区分这些特征,需要的是一层资源级控制:把不同内网服务映射为不同端口,再对端口做独立授权,而不是整条隧道不分青红皂白地全部打通。更进一步,可以限制单设备对高带宽消耗端口的并发连接数,防止某个客户端误操作(比如不小心把整个库 clone 回本地磁盘)打垮其他人的会话。

中继的安全加固不能照搬 VPN 那套操作

私有化中继本质上是一个运行在公网的转发程序。它虽然没有业务功能,但一旦暴露在公网,就会成为扫描器和暴力破解的首要目标。安全策略要围绕“中继只做转发,不做身份与授权的源头”来设计,但这不等于中继可以裸奔。

一批有效但常被忽视的措施:

  1. 中继监听地址只暴露必要的转发端口,管理端口绑定内网或回环接口,走单独防火墙链路;
  2. 中继节点之间启用双向证书感知,拒绝未知服务端或客户端身份接入;
  3. 控制面与数据面分离。设备授权、资源端口变更等信息不应存储在中继本地,中继只是按策略强制执行;
  4. 记录流级元数据而非内容:源地址、目标端口、连接起止时间、传输字节数、异常重置原因。审计的颗粒度选这一层,对性能几乎无感,且足够做追溯。

性能上最敏感的是第 4 点。逐包深度检查或在数据面上做 TLS 终结点解密,对中继是巨大的 CPU 负担,会让单节点可以承载的并发连接数直接减半。审计的策略定位很重要:中继适合做元数据级记录,内容审计应在内网侧边缘完成。

只用内网侧 Server 就能搭“最小可用中继”吗?

理解分布式远程访问时最常见的误区是把“Server”理解成中继本身。实际上,某些方案的架构里 Server 安装在内网侧,它承担的是接入、策略执行与对 Client 的合法性感知。真正的流量转发路径取决于两点:Client 和 Server 之间能否 P2P 直连,以及是否需要额外部署中继节点做兜底。

NexTunnel 的部署模式就是这一类的典型分工:Server 在企业内网侧,Client 在员工电脑上。Client 发起的访问请求经过 Server 身份判定和设备授权后在目标端口上放行。当网络条件允许,Client 与 Server 可以协商走 P2P 直连,彻底绕开中间转发;当链路无法穿越 NAT 或跨运营商丢包严重时,才需要有中继节点搭把手。这个架构下,中继是一个可选项,而不是必消耗品的性能瓶颈。

具体到落地操作,有一个环节最值得做:在后台把端口白名单维护成两层。第一层是全局开放的公共资源,比如知识库的只读端口和所有人的 SVN HTTPS;第二层是按设备或账号授信的敏感资源,比如生产 MySQL 的 3306、RDP 或 Jenkins 的 SSH 通道。第二层默认清空,只在有人提申请后临时授权,到时间自动回收。这样做之后,即便某个 Client 在公网上被劫持,能触达的端口面仍然非常有限。访问日志里按设备追溯的关键,是确认每一条连接来自哪台授权过的 Client。

链路不稳时,优先检查中继本身的三个指标

远程访问内网应用连不上或极慢时,不要一上来就盯着内网服务日志。中继路径上的问题比人们预期的多得多。一个有效的排障顺序是:

  • 第一查 TCP 重传统计。在中继和被访问端之间反复出现的 retransmission,优先指向中继所在网络到内网的这一段,而不是全局网络差;小包重传带来的是卡顿,大包重传带来的是速率坍塌。
  • 第二查并发会话数与内存增长。长连接场景下中继进程如果持有每个连接的完整状态而不释放,一旦外部突发大量半开连接就会推高内存、触发系统 OOM 或主动丢弃新连接。看准峰值时的会话数,比看平均流量更有效。
  • 第三查单连接吞吐与总吞吐的比值。很多团队只在中继跑 iperf 拉到带宽上限就觉得“性能没问题”,但真实业务跑的是几百个并发 TCP 短连接,受 conntrack 表、端口复用和中继线程模型影响巨大。合成流量与真实流量完全不同。

对于长期计划采用私有化中继的团队,验收时要有一张“混合场景表”:一行仿 Nexus 大文件持续下载,一行做 50 并发小 SQL 查询,一行抽查 SVN 日志检出。三项同时跑,记录每项的延迟波动和最小可用吞吐。这种验收数据才能用来谈性能边界,而不是一次性测速通过就交付。

安全与性能的平衡是策略选择,不是配置调优竞赛

讲到底,私有化中继的意义在于让远程访问链路“受管辖”。企业内网永远不应该被一句“外网可以直连进来”捕获走。把入口收紧,把中继私有化,把访问设备授权到端口级,这些安全动作哪怕在性能上付出 5%—10% 的成本,在远程开发、外包协作和紧急运维的场景下也是必要支出。

但安全不能以盲目牺牲吞吐为代价。合适的落脚点是选择像 NexTunnel 这类在链路选择和授权粒度层做了工作,但在热路径上保持轻量代理的架构。先部署 Server 到内网、绑定 Client 设备,针对具体业务开放指定的端口;确定业务需要的资源,授权时给最小范围,并要求管理员从访问审计中定期倒查。真正落到实处的方法论很简单:不要默认全通,每开一个资源就先问一句“谁在什么设备上为了什么业务用这个端口”。