openssh 8.2+ 可通过 sshd_config 中 match 块内的 limitbandwidth 指令限制 sftp 用户总带宽(上传+下载),单位字节/秒,仅作用于 internal-sftp 用户;旧版本可用 tc 在端口级限速。

Linux SSH 服务本身不直接限制“传输带宽”,但可通过配置 SFTP 子系统或底层网络策略,对使用 SSH 协议的文件传输(如 sftp、scp)实施有效的速率控制。关键在于区分:SSH 连接本身(交互式 shell)无需限速,而基于 SSH 的文件传输(sftp/scp)才需要带宽管理。最稳妥、原生支持且维护成本低的方式是利用 OpenSSH 内置的 LimitBandwidth 指令,仅需修改 /etc/ssh/sshd_config 即可生效。
用 LimitBandwidth 直接限制 SFTP 用户带宽(推荐)
OpenSSH 8.2+(Ubuntu 20.04+/CentOS 8+/Debian 11+ 默认搭载)原生支持 LimitBandwidth 指令,单位为字节/秒,作用于整个 SFTP 会话(上传+下载总和)。它只影响启用 internal-sftp 的用户,不影响普通 SSH 登录。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 编辑配置:
sudo nano /etc/ssh/sshd_config - 添加匹配段(以用户为例):
Match User alice<br> ForceCommand internal-sftp<br> ChrootDirectory /home/alice<br> LimitBandwidth 524288
(即限制 alice 总带宽为 512 KB/s) - 若限制整个组(如
sftpusers),改用:Match Group sftpusers<br> ForceCommand internal-sftp<br> LimitBandwidth 1048576
- 保存后执行:
sudo systemctl restart sshd
用 tc 精确控制端口级流量(适合旧版或细粒度需求)
当 OpenSSH 版本过低(tc(Traffic Control)在网卡层做整形。它不依赖 SSH 配置,但需手动指定网络接口(如 eth0)和端口(SFTP 默认走 SSH 端口 22)。
- 先清空旧规则:
sudo tc qdisc del dev eth0 root 2>/dev/null - 创建 HTB 队列:
sudo tc qdisc add dev eth0 root handle 1: htb default 30 - 设总带宽类(例如 2 Mbps):
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 2mbit - 为 SFTP 流量打标并限速:
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 2mbit - 匹配目标端口(22)并分流:
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 22 0xffff flowid 1:10 - 规则重启失效,建议写入
/etc/rc.local或 systemd service 持久化
避免常见误区与验证方法
限速配置容易因语法错误或作用域错配而失效。务必注意:
-
LimitBandwidth必须放在Match块内,且该块需在sshd_config文件末尾;前面不能有未闭合的Match或缩进错误 - scp 客户端侧也可临时限速(
scp -l 500 file user@host:/path,单位 kb/s),但这只是客户端请求,服务端无强制力,不可替代服务端配置 - 验证是否生效:用另一台机器连接 SFTP,执行大文件上传/下载,用
iftop -P 22或iptraf-ng观察实时速率是否被压至设定值 - 若用户仍能超速,检查是否绕过了
internal-sftp(比如用了外部 sftp-server)或Match条件未命中(用户名/组名拼写错误、大小写敏感)










