尝试同时调整 IPv4 和 IPv6 的流量会导致冲突

尝试同时调整 IPv4 和 IPv6 的流量会导致冲突

在我的服务器上,我尝试设置流量整形,如果我针对 IPv4 或 IPv6 进行此操作,一切都很顺利:已安装该特定协议的所有过滤规则。但是,当我尝试同时整形两者时,我收到错误,并且一些过滤规则被拒绝,并显示以下错误消息:

Error: Filter with specified priority/protocol not found.
We have an error talking to the kernel, -1

对 tc 规则进行一些修改后,我发现了以下特点:当我仅激活 IPv4 或 IPv6 整形时,我可以启用其他协议中优先级最高的过滤器,它仍然可以工作,但是,只要我尝试添加更多过滤器,优先级较低的过滤器就会被拒绝,并出现上述错误消息。

因此,考虑到这可能是可以附加的过滤器数量的某种模糊限制,我注释掉了每个协议优先级最低的两条规则,并启用了优先级最高的两条规则,但这也无济于事。只有另一个块中优先级最高的规则(即 IPv6,因为 IPv4 的规则首先安装)才会安装,优先级较低的规则会被拒绝。

然后我尝试反过来做,取消注释其中一个协议的所有规则,并注释掉另一个协议的所有内容,除了带有最低优先级,但也被拒绝了。

TL;DR:尝试在 IPv4 和 IPv6 上塑造网络流量会失败,因为尝试安装具有不同句柄和优先级的多个过滤器显然会引起某种冲突,从而只允许安装具有最高优先级的过滤器。

脚本的相关部分如下:

/sbin/tc qdisc add dev eth0 root handle 1:0 htb default 16
/sbin/tc class add dev eth0 parent 1:0 classid 1:20 htb rate 102000kbit ceil 102000kbit
/sbin/tc class add dev eth0 parent 1:20 classid 1:1 htb rate 25kbit ceil 102000kbit prio 0 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:2 htb rate 25kbit ceil 102000kbit prio 1 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:3 htb rate 10200kbit ceil 102000kbit prio 2 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:4 htb rate 20400kbit ceil 102000kbit prio 3 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:16 htb rate 71350kbit ceil 102000kbit prio 4 quantum 3000
/sbin/tc qdisc add dev eth0 parent 1:4 hhf
/sbin/tc qdisc add dev eth0 parent 1:16 hhf
/sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ip handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ip handle 4/0xF fw flowid 1:4
/sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ipv6 handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ipv6 handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ipv6 handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ipv6 handle 4/0xF fw flowid 1:4

我正在使用 iptables 为过滤器适当地标记网络数据包。

  • 优先级 0:小数据包(最大 128 字节)和 DNS(对于 IPv6 NDP 也包括 ICMP)
  • 优先级 1:交互式 SSH
  • 优先级 2:端口映射器/NFS
  • 优先级 3:IPsec
  • 批量流量没有专门的过滤器,因此优先级最低。

现在我不知道这里可能出了什么问题。如果我在这里犯了错误,我现在就只见树木不见森林了。

答案1

过滤优先级不​​特定于系列。

因此,创建过滤器的命令应如下所示:

/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ip handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ip handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 4 protocol ip handle 4/0xF fw flowid 1:4
/sbin/tc filter add dev eth0 parent 1:0 prio 5 protocol ipv6 handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 6 protocol ipv6 handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 7 protocol ipv6 handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 8 protocol ipv6 handle 4/0xF fw flowid 1:4

相关内容