标签: tc

Tc:入口监管和 ifb 镜像

我正在尝试按照此处所述在 Linux 网关上设置流量整形。脚本需要自定义,因为我有多个 LAN 接口。因此,为了塑造 LAN 端,我计划创建一个 ifb 伪设备,如下所示:

     modprobe ifb
     ip link set dev ifb0 up
    /sbin/tc qdisc add dev $WAN_INTERFACE ingress
    /sbin/tc filter add dev $WAN_INTERFACE parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
Run Code Online (Sandbox Code Playgroud)

上面提到的 gist repo 中的脚本有以下几行:

 /sbin/tc qdisc add dev $WAN_INTERFACE handle ffff: ingress
    /sbin/tc filter add dev $WAN_INTERFACE parent ffff: protocol ip prio 1 u32 match ip sport $INTERACTIVE_PORT 0xffff flowid :1
    /sbin/tc filter add dev …
Run Code Online (Sandbox Code Playgroud)

traffic-shaping tc

23
推荐指数
1
解决办法
4万
查看次数

使用 tc 将数据包延迟到单个 IP 地址

我是使用tcnetem 的新手。我想延迟发送到特定 IP 地址的数据包。但是,以下命令会导致系统上的所有数据包延迟,而不仅仅是 IP 地址 1.2.3.4:

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1
Run Code Online (Sandbox Code Playgroud)

我的猜测是我最后需要某种全能过滤器来指定所有剩余流量不应通过 netem。但我什么也做不了。我如何让这个工作?

linux traffic-shaping tc

22
推荐指数
2
解决办法
4万
查看次数

将队列规则重置回默认的 pfifo_fast 规则?

我正在尝试临时设置一个限速队列规则,然后稍后将其删除:

# /sbin/tc qdisc add dev eth1 root tbf rate 600kbit latency 50ms burst 1540
# /sbin/tc qdisc del dev eth1 root
Run Code Online (Sandbox Code Playgroud)

不幸的是,这完全消除了队列规则并阻止了队列被删除后传出数据传输的工作。

我希望能够将队列规则重置回默认规则:

qdisc pfifo_fast 0: dev eth1 root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

但是看起来pfifo_fast qdisc 不能手动创建:

# /sbin/tc qdisc add dev eth1 root pfifo_fast
qdisc 'pfifo_fast' does not support option parsing
Run Code Online (Sandbox Code Playgroud)

我发现的解决方法是创建一个新的简单队列规则:

# /sbin/tc qdisc add dev eth1 root prio
Run Code Online (Sandbox Code Playgroud)

但是,我想知道如何在不重新启动的 …

linux tc

15
推荐指数
2
解决办法
4万
查看次数

Linux TC 类/过滤器编号

我目前正在为 ISP 级公司开发流量整形解决方案,并遇到了一个有趣的(有点哲学)问题。

查看系统应该处理的端点数量(大约 20k),我有点担心当我需要策略/调整更多用户的流量时会发生什么。由于我目前正在为整个网络使用 HFSC 整形树(参见 tc-hfsc,主要是与众所周知的 HTB 相同但更酷的东西),我需要使用更多的 ClassID(显然每个用户至少有一个)网络)。我发现的问题是 TC ClassID 的数量有限——它们是 16 位数字,这使我可能最多有 64k 用户受此解决方案影响。

同样,如果我想有效地管理 TC 过滤器(例如,不使用“刷新所有技术”),我需要能够删除或修改单个过滤器条目。(我正在使用类似于 LARTC [1] 中的哈希表的东西)。同样,似乎唯一可行的方法是使用单独的优先级为所有过滤器编号(tc filter add dev ... prio 1)。没有其他参数可用于此目的,遗憾的是,prio 也是 16 位的。

我的问题如下:是否存在一些好的方法来扩大可用的“标识符空间”,例如 'tc class' 命令的 32 位 clsid,以及 'tc filter' 的 32 位优先级(或任何其他修改句柄)命令?

非常感谢,

-mk

(顺便说一句,我希望这不会出现“64k 用户应该对每个人都足够”的情况......)

networking linux traffic-shaping isp tc

12
推荐指数
1
解决办法
2710
查看次数

tc u32 --- 如何在最近的内核中匹配 L2 协议?

我有一个很好的整形器,带有散列过滤,构建在 linux 桥上。简而言之,br0连接externalinternal物理接口,VLAN 标记的数据包是“透明地”桥接的(我的意思是,那里没有 VLAN 接口)。

现在,不同的内核以不同的方式执行此操作。我可能对确切的内核版本范围有误,请原谅。谢谢。

2.6.26

因此,在 debian 中,2.6.26 及更高版本(我相信最高为 2.6.32)---这有效:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200
Run Code Online (Sandbox Code Playgroud)

在这里,“内核”将“协议”字段中的两个字节与 0x8100 匹配,但将 ip 数据包的开头视为“零位置”(对不起,我的英语,如果我有点不清楚)。

2.6.32

同样,在 debian(我还没有构建 vanilla 内核)中,2.6.32-5 --- 这有效:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 at 20 flowid 1:200
Run Code Online (Sandbox Code Playgroud)

在这里,“内核”与协议匹配,但计算从该协议头开始的偏移量——我必须添加 4 个字节到偏移量(20,而不是 16 用于 …

vlan traffic-shaping linux-networking linux-kernel tc

12
推荐指数
2
解决办法
5683
查看次数

流量整形:tc filter catch all filter

如何配置“捕获所有”过滤器tc filter

我使用以下代码进行了测试,但它给了我错误"Unknown filter "1:100", hence option "protocol" is unparsable"

tc filter add dev $IF_LAN parent 1:100 protocol ip prio 7 flowid 1:190
Run Code Online (Sandbox Code Playgroud)

提前致谢。

qos traffic-shaping filter tc

6
推荐指数
1
解决办法
3797
查看次数

删除 tc 中的过滤器

我在 tc 中添加了一个过滤器,如下所示:

tc filter add dev eth0 parent 1: protocol ip handle 6 fw flowid 1:6
Run Code Online (Sandbox Code Playgroud)

这应该是将 iptables 标记为 '--set-mark 6' 的数据包发送到类 1:6。问题是,我不知道以后如何删除这个过滤器。用“删除”替换“添加”不起作用,我收到“RTNETLINK 答案:没有这样的文件或目录”错误消息。我尝试了许多其他组合来删除它,但似乎都不起作用。

谢谢你的帮助。

networking linux routing traffic-shaping tc

6
推荐指数
1
解决办法
2万
查看次数

带有外部程序的高级动态路由

我需要构建一个系统,在该系统中我能够根据许多参数(例如端口/协议等)路由数据包,这些参数在某种程度上是“正常的”,但也包括其他方面,例如队列长度和其他外部因素. 我的路由器由 2 个内部接口 (802.11) 和两个外部接口(一个 ADSL,一个 LTE)组成。所以我想通过外部程序检查每个数据包,并决定应该路由哪个接口。

我看了一下iproute2,但我没有找到任何方法将每个数据包传递给外部程序,或者以某种方式为每个数据包动态选择路由。

所以问题是:做到这一点的最佳方法是什么?是否已经有朝这个方向发展的工具,还是我应该依靠自己制作的东西,并通过 linux 标准工具传递数据包?

linux routing iptables tc iproute2

6
推荐指数
2
解决办法
1037
查看次数

如何限制每个 VPN 连接的带宽?

我有一个 StrongSwan (IKEv2) 服务器设置,并希望将每个 VPN 连接限制为 512kb/s。

经过研究,我遇到tc了 Ubuntu。我不太明白,正在阅读手册页。

DEV=eth0
tc qdisc del dev $DEV root
tc qdisc add dev $DEV handle 1: root htb default 11
tc qdisc add dev $DEV parent 1:11 handle 11: sfq perturb 60 
Run Code Online (Sandbox Code Playgroud)

我认为这意味着将未分类的流量重新路由到 ID 11,然后每 60 秒将其平衡一次。sqf 还保证请求之间平等数据流的公平性。

队列算法扰动的时间间隔(以秒为单位)。默认为 0,这意味着不会发生扰动。不要为每个扰动设置太低可能会导致某些数据包重新排序或丢失。建议值:60 该值在使用外部流分类时没有影响。最好增加除数值以降低哈希冲突的风险。

我不太确定这两个。在我看来,主要连接将被限制为 512kbps,而未分类的连接将被限制为 128kbps。但我不确定。

tc class add dev $DEV parent 1: classid 1:1 htb rate 512kbps
tc class add dev $DEV parent 1:1 classid 1:11 htb rate 128kbps
Run Code Online (Sandbox Code Playgroud)

最糟糕的是,我不确定每个 VPN 连接是否也符合上述这些规则,或者这些规则是否仅影响 …

ipsec tc strongswan ikev2 ubuntu-16.04

6
推荐指数
0
解决办法
625
查看次数

使用 tc qdiscs 进行带宽限制

我试图限制一个简单的 iperf 服务器和客户端之间的带宽,使用第三台被动机器作为桥梁。在没有干扰的情况下,iperf 返回约 90 Mbits/sec 的带宽。我的目标是创建一个根 qdisc,将所有未分类的流量(所有内容)发送到子 HTB 类,在那里设置我的带宽,然后路由到叶 qdisc,一旦我开始工作,将在其中设置额外的 tc 参数。我的实现很简短:

sudo tc qdisc add dev $interface root handle 1: htb default 10

sudo tc class add dev $interface parent 1:0 classid 1:10 htb rate $bandwidth burst $burst

sudo tc qdisc add dev $interface parent 1:10 handle 10:0 netem #other stuff goes here
Run Code Online (Sandbox Code Playgroud)

当这个 bash 脚本在带有$interface = eth1, $bandwidth = 500kbps,的网桥上实现时$burst = 15k,我看到 iperf 带宽有所减少,但还没有接近规定值(通常约为 5Mbps)。

我的脚本中有错误吗?我是否滥用了突发变量?请帮忙。

更新:经过进一步调查,我发现这种流量控制在应用于与 SERVER 接口的以太网卡时工作正常,但是当将相同的命令应用于 CLIENT 端时会出现问题。当整个设置颠倒时也是如此。

bash iperf traffic-shaping tc htb

5
推荐指数
1
解决办法
863
查看次数