如何设置每个客户端的一般网络限制 + TCP 确认优先级

如何设置每个客户端的一般网络限制 + TCP 确认优先级

以下情况:

  • 网络 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 连接。然后,您可以在连接机器中用CONNMARKtarget 标记它们。这样,使用-j CONNMARK --restore-marktarget,当此连接中的数据包沿 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,如果你不明白的话可以问我任何事。

相关内容