在 Debian 上限制 SFTP 传输速率的可行方案
方案一 系统级流量整形 tc 按端口限速(推荐)
- 适用场景:需要对所有 SFTP(端口 22)或指定端口的流量进行限速,粒度到主机、用户或进程均可扩展。
- 步骤:
- 安装工具
sudo apt-get update
sudo apt-get install iproute2
- 对接口 eth0 设置根队列与类(示例限速 1 Mbps)
sudo tc qdisc add dev eth0 root handle 1: htb default 30
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit
- 按端口匹配 SFTP 流量(22)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 22 0xffff flowid 1:10
- 验证
tc -s qdisc ls dev eth0
tc -s class ls dev eth0
- 清理
sudo tc qdisc del dev eth0 root
- 说明:将接口名(如 eth0)替换为你的实际网卡;如需按源/目的 IP、用户(结合 cgroups)、或端口范围细化,可扩展 filter 规则。上述命令为永久生效的流量整形示例,重启后需按需重新应用。
方案二 按用户或进程限速 trickle(应用层)
- 适用场景:仅对某个 SFTP 用户的会话限速,或临时测试;无需改动系统网络栈。
- 步骤:
- 安装
sudo apt-get update
sudo apt-get install trickle
- 以受限用户启动 SFTP 会话
trickle -d 512 -u 256 sftp user@host
以上将下载限速为 512 KB/s,上传限速为 256 KB/s(trickle 单位为 KB/s)
- 说明:trickle 通过 LD_PRELOAD 影响进程的 socket 层,适合临时或单用户限速;对系统服务进程注入需谨慎,且可能与部分程序不兼容。
方案三 使用 rssh 的带宽限制(替代 SFTP 服务)
- 适用场景:可改用 rssh 作为受限的 SFTP 网关/服务,直接提供带宽限制能力。
- 步骤:
- 安装
sudo apt-get update
sudo apt-get install rssh
- 配置 /etc/rssh.conf(示例限速 1 MB/s)
limitbandwidth yes
bandwidthlimit 1024
- 重启服务
sudo systemctl restart rssh
- 说明:rssh 功能相对简单,若需更复杂的 SFTP 集成与系统统一认证,仍建议以 OpenSSH 为主并采用方案一/二。
常见注意事项
- 单位换算:1 Mbps ≈ 128 KB/s;配置限速时请区分 Mb/s(兆比特每秒) 与 MB/s(兆字节每秒)。
- 接口与端口:tc 限速依赖网卡名(如 eth0)与端口(默认 22);若 SFTP 使用非标准端口,需相应调整 filter。
- 生效与回滚:修改网络整形规则前建议记录当前规则(tc -s …),变更后及时验证;必要时保留清理命令以便快速回滚。
- 方案选择:系统级(tc)适合全局与稳定策略;应用层(trickle)适合临时与单用户;rssh 适合替代方案与简单场景。