3步实现sshuttle流量整形:用tc命令控制传输速率
你是否遇到过sshuttle隧道占用过多带宽导致其他服务卡顿?是否需要为不同类型流量分配优先级?本文将通过Linux的tc(Traffic Control)工具与sshuttle结合,实现精细化的传输速率控制,让你在合规使用网络的同时兼顾带宽管理。
为什么需要流量整形
sshuttle作为轻量级隧道转发工具,通过SSH连接转发流量,但其本身不提供带宽控制功能。当同时传输大文件和进行实时通信时,可能出现视频会议卡顿、SSH连接超时等问题。通过tc工具可实现:
- 限制单用户/IP的最大带宽
- 为SSH控制信道分配高优先级
- 避免突发流量冲击网络
tc与sshuttle的协同工作原理
Linux的tc(Traffic Control)工具通过以下组件实现流量控制:
- QDisc(排队规则):控制数据包如何排队等待传输
- Class(类别):将流量分组并分配不同带宽
- Filter(过滤器):根据条件(如端口、IP)将流量分配到不同类别
sshuttle的流量特征:
- 默认使用TCP 22端口建立SSH连接
- 数据转发通过tunnel.py模块实现
- 所有转发流量经过虚拟网卡或原始套接字
实施步骤
1. 安装依赖工具
确保系统已安装tc相关组件:
sudo apt-get install iproute2 # Debian/Ubuntu
# 或
sudo yum install iproute-tc # CentOS/RHEL
2. 创建tc配置脚本
在项目中创建流量控制脚本:
#!/bin/bash
# 创建于 scripts/traffic-control.sh
# 清除现有规则
sudo tc qdisc del dev eth0 root
# 添加根队列规则
sudo tc qdisc add dev eth0 root handle 1: htb default 10
# 创建主类别(总带宽100Mbps)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
# 创建sshuttle专用类别(20Mbps带宽,最高30Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 20mbit ceil 30mbit
# 添加SFQ公平队列
sudo tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
# 过滤sshuttle流量(假设使用默认SSH端口)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip dport 22 0xffff flowid 1:10
3. 集成到sshuttle启动流程
修改sshuttle启动脚本,添加流量控制支持:
# 在 [sshuttle/__main__.py](https://link.gitcode.com/i/e852f75be453052fb5502408e9dab47a) 中添加
import subprocess
def start_traffic_control():
"""启动流量控制"""
subprocess.run(["sudo", "./scripts/traffic-control.sh"], check=True)
def stop_traffic_control():
"""停止流量控制"""
subprocess.run(["sudo", "tc", "qdisc", "del", "dev", "eth0", "root"], check=True)
# 在main函数中添加
if args.traffic_control:
start_traffic_control()
atexit.register(stop_traffic_control)
验证与监控
使用以下命令监控流量控制效果:
# 查看tc配置
sudo tc qdisc show dev eth0
sudo tc class show dev eth0
# 实时监控带宽使用
sudo tc -s qdisc ls dev eth0
# 结合iftop查看流量
sudo iftop -i eth0 -f 'port 22'
高级配置:基于用户的带宽限制
通过扩展tc过滤器,可以为不同用户分配不同带宽:
# 添加用户ID过滤规则
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip src 192.168.1.100 flowid 1:10 # 用户A
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip src 192.168.1.101 flowid 1:20 # 用户B
注意事项
- tc配置需要root权限
- 不同网络接口名称可能不同(eth0、wlan0等)
- 规则在系统重启后会丢失,需添加到启动脚本
- 详细参数调整请参考 Linux TC官方文档
参考资料
通过以上配置,你可以有效控制sshuttle的网络带宽使用,确保关键服务的流畅运行。如需更复杂的流量控制策略,可以扩展tc规则或结合sshuttle的firewall.py模块实现深度集成。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



