Tc:入口监管和 ifb 镜像

nix*_*win 23 traffic-shaping tc

我正在尝试按照此处所述在 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 $WAN_INTERFACE parent ffff: protocol ip prio 1 u32 match ip dport $INTERACTIVE_PORT 0xffff flowid :1
    /sbin/tc filter add dev $WAN_INTERFACE parent ffff: protocol ip prio 5 0 u32 match ip src 0.0.0.0/0 police rate $MAX_DOWNRATE_INGRESS burst 20k drop flowid :2
Run Code Online (Sandbox Code Playgroud)

这段代码和 ifb 接口创建代码不能很好地结合在一起。自定义脚本被执行,但 ifb0 设备不显示任何流量统计信息。如果我注释掉入口 gist repo 代码(上面引用),那么 ifb0 设备会显示传输的数据包数量。这些行也不能一起执行:

/sbin/tc qdisc add dev $WAN_INTERFACE ingress
/sbin/tc qdisc add dev $WAN_INTERFACE handle ffff: ingress
Run Code Online (Sandbox Code Playgroud)

我得到文件存在错误。那么,如何在 WAN_INTERFACE 上调整入口,同时调整通过 ifb0 设备进入 LAN 的流量?

Sér*_*lho 49

IFB 是处理入口流量的 tc 过滤器的替代方案,通过将其重定向到虚拟接口并将其视为出口流量。每个物理接口需要一个 ifb 接口,将入口流量从 eth0 重定向到 ifb0,将 eth1 重定向到 ifb1 等等在。

插入 ifb 模块时,告诉它您需要的虚拟接口数量。默认值为 2:

modprobe ifb numifbs=1
Run Code Online (Sandbox Code Playgroud)

现在,启用所有 ifb 接口:

ip link set dev ifb0 up # repeat for ifb1, ifb2, ...
Run Code Online (Sandbox Code Playgroud)

并将入口流量从物理接口重定向到相应的 ifb 接口。对于 eth0 -> ifb0:

tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
Run Code Online (Sandbox Code Playgroud)

再次重复 eth1 -> ifb1、eth2 -> ifb2 等等,直到你想要塑造的所有接口都被覆盖。

现在,您可以应用所需的所有规则。eth0 的出口规则在 eth0 中照常进行。让我们限制带宽,例如:

tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit
Run Code Online (Sandbox Code Playgroud)

不用说,重复eth1,eth2,......

eth0 的入口规则,现在作为 ifb0 的出口规则(进入 ifb0 的任何东西都必须出来,只有 eth0 入口流量进入 ifb0)。再次,带宽限制示例:

tc qdisc add dev ifb0 root handle 1: htb default 10
tc class add dev ifb0 parent 1: classid 1:1 htb rate 1mbit
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 1mbit
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是出口规则比入口过滤器灵活得多。例如,过滤器只允许您丢弃数据包,而不会引入等待时间。通过将入口流量作为出口处理,您可以设置队列规则、流量类和过滤器(如果需要)。您可以访问整个 tc 树,而不仅仅是简单的过滤器。

  • 做得很好。看到专业人士提出摇滚明星的第一个答案总是很高兴。 (2认同)