如何在 ssh_config 中限制 SSH 隧道的最大传输带宽?

文章导读
ssh_config 配置文件本身没有原生指令能直接限制 SSH 隧道的传输带宽。这是许多管理员容易混淆的地方,最稳妥的方案是结合命令行参数或外部流量控制工具。
📋 目录
  1. Linux 环境实操方案
  2. Windows 环境替代方案
  3. 验证方法
  4. 技术风险与常见坑
  5. 参考来源
A A

ssh_config 配置文件本身没有原生指令能直接限制 SSH 隧道的传输带宽。这是许多管理员容易混淆的地方,最稳妥的方案是结合命令行参数或外部流量控制工具。

先说结论:客户端配置文件不支持直接写带宽限制,需在连接命令中加参数或用系统级工具拦截。

  • 适合:需要临时或脚本化控制本地转发流量的场景
  • 先确认:区分是客户端隧道限制还是服务端 SFTP 限制
  • 再验证:使用流量监控工具观察实际速率是否达标

Linux 环境实操方案

1. 使用 ssh 命令 -l 参数(无需安装)

在发起隧道连接时,直接使用 -l 选项限制总带宽。例如限制为 512Kbit/s:

ssh -l 512 -N -L 本地端口:目标 IP:目标端口 用户名@服务器 IP

注意:-N 参数表示不执行远程命令,仅转发端口。

2. 使用 trickle 工具(上下行独立控制)

如果需要分别限制上传和下载,且 ssh 命令不支持细粒度控制,可安装 trickle。不同发行版安装命令如下:

如何在 ssh_config 中限制 SSH 隧道的最大传输带宽?
# Debian/Ubuntu
sudo apt-get install trickle

# CentOS/RHEL (需先启用 EPEL 源)
sudo yum install -y epel-release
sudo yum install -y trickle

启动隧道时包裹命令:

trickle -d 1024 -u 512 ssh -N -L 9006:127.0.0.1:3306 user@host

其中 -d 是下载限制,-u 是上传限制,单位通常是 KB/s。

Windows 环境替代方案

Windows 原生 CMD 或 PowerShell 的 OpenSSH 客户端同样不支持配置文件带宽限制。PuTTY 图形界面也无此选项。

  • WSL 方案:在 Windows 子系统 (WSL) 中运行 Linux 版 ssh 或 trickle,命令同上。
  • 流量整形工具:使用 NetLimiter 等第三方 Windows 流量控制软件,针对 ssh.exe 或 putty.exe 进程进行限速。

验证方法

配置完成后,需用工具实测,注意以下命令通常需要 root 权限:

1. 使用 iftop 查看实时流量

sudo iftop -P -n -i eth0

观察对应端口的流量峰值是否被限制在设定值附近。

如何在 ssh_config 中限制 SSH 隧道的最大传输带宽?

2. 使用 nethogs 按进程查看

sudo nethogs eth0

找到 ssh 进程,观察其带宽占用是否稳定在限制范围内。

3. 大文件传输测试

通过隧道传输一个已知大小的文件,计算耗时,估算平均速率是否符合预期。

技术风险与常见坑

1. -l 参数影响整个连接(重要)

ssh 命令的 -l 限制的是整个加密连接的带宽。若开启 ControlMaster 连接复用,同一连接下的所有隧道会共享这个带宽限额,相互影响。

如何在 ssh_config 中限制 SSH 隧道的最大传输带宽?

2. trickle 兼容性与安全策略

trickle 依赖 LD_PRELOAD 机制注入动态库。在以下场景可能失效:

  • 安全策略禁止动态库注入(如某些加固系统)。
  • ssh 二进制文件为静态编译。
  • 程序具有 setuid 权限。

3. 单位混淆

ssh -l 的单位是 Kbit/s,而 trickle 通常使用 KB/s。配置时注意换算,1 Byte = 8 bits。

4. 服务端限制不生效

如果在服务端 sshd_config 配置了带宽限制但无效,需确认 OpenSSH 版本是否支持该指令,部分旧版本或编译选项可能未启用相关功能。

参考来源

  • OpenSSH 官方手册:ssh 命令 -l 参数说明及 ssh_config 配置文件关键字列表
  • Linux 发行版官方文档:trickle 软件包说明