![如何设置每个客户端的一般网络限制 + TCP 确认优先级](https://linux22.com/image/708220/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E6%AF%8F%E4%B8%AA%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E4%B8%80%E8%88%AC%E7%BD%91%E7%BB%9C%E9%99%90%E5%88%B6%20%2B%20TCP%20%E7%A1%AE%E8%AE%A4%E4%BC%98%E5%85%88%E7%BA%A7.png)
以下情况:
- 网络 A 通过慢速连接连接到网络 B。
- 网络 A 中的不同主机想要发送流量到网络 B 中的主机。
- 网络 B 中的主机向网络 A 发送命令。
该怎么办:
- 允许网络 A 中的主机以平均 0.3 MBit/s 和最大 0.5MBit/s 的速度发送数据。我想为此使用令牌桶。
- 从 A 向 B 优先发送 TCP 确认。来自网络 B 的命令将通过 TCP 发送。我不想阻止命令传输,然后客户端使用空口进行从 A->B 的数据传输。
网关路由器是具有两个接口的 Linux 系统。我发现我可以使用 tc 来配置流量整形。
我的命令:
sudo tc qdisc add dev eth0 handle 1: root tbf rate 300000 burst 500000 latency 1ms
使用 iperf 进行速度测试的结果为 265 Kbits/秒。
问题:如何设置正确的 tc 规则来限制每个客户端的流量并优先考虑 TCP ACK?
答案1
要正确回答的问题有很多,而且可能的实现方式也有很多,我只能做一些假设并提出一个您可以稍后修改的解决方案。
您可以使用 TCP 标志和 conntrack(Linux 内核中的连接机器)来查找哪些连接是 B 到 A 的 TCP 连接。然后,您可以在连接机器中用CONNMARK
target 标记它们。这样,使用-j CONNMARK --restore-mark
target,当此连接中的数据包沿 A 到 B 方向传输时,它将被标记为 100。
TC 方面,我使用 htb 作为有类 QDISC。如果流量太大,HTB 类将丢弃数据包。fq_codel 用作队列。fq_codel 会组织每个类中的队列。
root htb qdisc 将没有标记的数据包发送到 1:1000 类中。标记的数据包将进入 1:100。
tc filter
用于识别标记的 100 个数据包并将其发送到 1:100 类中。
tc class
用于设置限制带宽。
以下代码假设您的最大带宽为 1Mb/s,您的网络 B 接口为 eth0,您的网络 A 为 eth1,并且您的层为以太网。
# Spread connmark to mark
iptables -t mangle -A POSTROUTING -o eth0 -j CONNMARK --restore-mark
# New TCP connections from B to A : connmark 100
iptables -t mangle -A POSTROUTING -o eth1 -p tcp --syn -m state --state NEW -j CONNMARK --set-mark 100
# Interface : eth0, qdisc : htb, default leaf : 1000
tc qdisc add dev eth0 root handle 1:0 htb default 1000
# Interface eth0, parent branch node : 1:0, branch id : 1:10
tc class add dev eth0 parent 1:0 classid 1:10 htb rate 1000kbit ceil 1000kbit
# CLASS - B to A TCP branch
tc class add dev eth0 parent 1:10 classid 1:100 htb rate 700kbit ceil 1000kbit burst 5k prio 0 linklayer ethernet
# QDISC - Queue
tc qdisc add dev eth0 parent 1:100 handle 110: fq_codel
# FILTER - Filter
tc filter add dev eth0 parent 1:0 protocol ip prio 0 handle 100 fw flowid 1:100
# CLASS - Default branch
tc class add dev eth0 parent 1:10 classid 1:200 htb rate 300kbit ceil 500kbit burst 5k prio 7 linklayer ethernet
# QDISC - default branch queue
tc qdisc add dev eth0 parent 1:1000 handle 1010: fq_codel
我可能没有我想要的那么清楚,B,如果你不明白的话可以问我任何事。