我很高兴通过端口限制上传速度 - 但真的想通过进程限制下载。
看来 iptables 确实具有按进程以--pid-owner
or的形式匹配和标记数据包的功能--cmd-owner
- 但现在两者都已被删除?
$ iptables -m owner --help
...
owner match options:
[!] --uid-owner userid[-userid] Match local UID
[!] --gid-owner groupid[-groupid] Match local GID
[!] --socket-exists Match if socket exists
似乎有按用户或组匹配的选项,但没有按进程匹配的选项。
我知道trickle和wondershaper - 但都不允许对已经运行的进程进行整形
答案1
将进程放入net_cls
cgroup 中,使用 cgroup 设置数据包的类别,然后使用有类过滤器tc
对该类别中的数据包进行速率限制。例如:
cgcreate -g net_cls:slow
echo 0x10001 > /sys/fs/cgroup/net_cls/slow/net_cls.classid
cgclassify -g net_cls:slow <pid of the process you want to limit>
tc qdisc add dev eth0 root handle 1: htb
tc filter add dev eth0 parent 1: handle 1: cgroup
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbps
这应该意味着您指定的进程(及其任何子进程)的带宽限制为每秒 1 兆字节 - 将最后一个命令的参数调整为您想要的任何带宽。