vsftpd带宽限制与防拥堵实践
一 核心思路
- 在服务器侧对 vsftpd 进行限速,控制每个连接与每类用户的速率,避免单个用户或单连接占满带宽。
- 限制并发连接数与每 IP 连接数,抑制“多线程/多连接”把带宽吃满的行为。
- 必要时在网络层对 FTP 流量做整形,按用户或接口统一限速,作为兜底策略。
二 在 vsftpd 中配置限速与并发
三 网络层整形兜底(tc + iptables/cgroups)
- 适用场景:需要对某用户、某网段或整台服务器的 FTP 流量做统一整形,或 vsftpd 配置之外再叠加一层硬上限。
- 按用户 IP 限速示例(HTB 队列,接口 eth0,单位 kbit/s):
- 建立根队列与父类
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 100mbit ceil 100mbit
- 为用户 192.168.1.100 创建 10mbit 的类
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit ceil 10mbit
- 用 iptables 标记该用户出站流量
sudo iptables -t mangle -A OUTPUT -s 192.168.1.100 -j MARK --set-mark 10
- 将标记流量导入对应类
sudo tc filter add dev eth0 parent 1: protocol ip prio 1 handle 10 fw flowid 1:10
- 监控与调整:tc -s qdisc ls dev eth0;tc -s class ls dev eth0
- 按用户 UID 限速(cgroups + tc,更精细):
- 将 vsftpd 进程或相应用户会话加入 cgroup,用 iptables 按 UID 打标记,再用 tc 的 fw filter 导流到限速类,实现“按系统用户”的带宽上限。
- 说明:tc 属于内核级整形,优先级高于应用层限速,适合作为全局/兜底策略;注意单位换算(1 Byte = 8 bit)。
四 其他可选工具
- trickle(用户态限速,适合临时或按进程限速)
- 安装:sudo apt-get install trickle(或 yum/dnf 安装)
- 用法示例:sudo trickle -d 1024 -u 1024 vsftpd(限制下载/上传各约 1 MB/s)
- 特点:无需改 vsftpd 配置,但仅对能由 trickle 启动/注入的进程生效,系统级或 root 启动的 vsftpd 可能不适用。
- wondershaper(整接口限速的简易工具)
- 安装:sudo apt-get install wondershaper
- 用法示例:sudo wondershaper -a eth0 -d 3072 -u 2048(接口 eth0 下载 3 Mbps、上传 2 Mbps)
- 特点:对接口做整体整形,简单有效,但粒度较粗,无法区分用户/进程。
五 部署与验证建议
- 先确定链路可用总带宽(如 100 Mbps),按业务分配:给 FTP 预留不超过 30%(如 30 Mbps ≈ 3.75 MB/s),其余留给业务/管理流量。
- 计算单用户限速:例如每用户 2 MB/s(≈16 Mbps),则并发用户上限约为 3.75/2 ≈ 1–2;若需支持 10 个并发用户,单用户限速应≤ 0.37–0.4 MB/s(≈3–4 Mbps)。
- 在 vsftpd 中设置 local_max_rate/anon_max_rate 与 max_per_ip、max_clients;必要时在网络层用 tc 做接口或按用户兜底。
- 验证方法:
- 单连接 iperf3/ftp 实测速率应接近设定值(注意字节/比特单位换算)。
- 多连接与并发边界测试:验证 max_per_ip、max_clients 是否按预期拒绝超额连接。
- 观察系统负载、网卡吞吐与丢包,必要时微调速率与并发阈值。