Linux tc IPv6 流量整形

Linux tc IPv6 流量整形

我已使用 tc 和 htb 进行流量整形,对于 IPv4 来说一切都运行良好。现在我想将传入 IPv6 ssh/sftp 流量的带宽限制在合理的范围内,这样它就不会干扰更重要的流量。简而言之,什么都不起作用:

tc class add dev eth0 parent 1:0 classid 1:14 htb rate 3000kbit ceil 3000kbit prio 3

ip6tables -A POSTROUTING -t mangle -o eth0 -p tcp --dport 22 -j MARK --set-mark 14
tc filter add dev eth0 parent 1:0 protocol ip handle 14 fw flowid 1:14
# or
tc filter add dev eth0 parent 1:0 protocol ipv6 u32 match ip6 protocol 6 0xff match ip6 dport 22 0xffff flowid 1:14
# or variations of these...

如何使用 tc 对 IPv6 数据进行流量整形?

答案1

至少在我的调制解调器/路由器(Actiontec C1000A、BusyBox v1.17.2、内核版本 2.6.30)上,我能够使用以下命令直接匹配目标 IPv6 地址tc(即无需ip6tables标记数据包):

tc class add dev eth0 parent 1:0 classid 1:14 htb rate 3000kbit ceil 3000kbit prio 3
tc filter add dev eth0 parent 1:0 protocol ipv6 prio 16 \
    u32 match ip6 dst $IPV6_ADDR flowid 1:14

所以,这只是一个猜测,但我认为以下方法可行:

tc filter add dev eth0 parent 1:0 protocol ipv6 prio 16 u32 match ip6 dport 80 flowid 1:14

或者,使用你的ip6tables混淆:

tc filter add dev eth0 parent 1:0 protocol ipv6 handle 14 fw flowid 1:14

答案2

不幸的是,tc 还不能用于 IPv6。

引用:

路由策略数据库 (RPDB) 取代了 Linux 内核中的 IPv4 路由和寻址结构,从而带来了本 HOWTO 描述的所有出色功能。遗憾的是,Linux 中的 IPv6 结构是在此核心结构之外实现的。尽管它们确实共享一些功能,但基本的 RPDB 结构并不参与 IPv6 寻址和路由结构。

这肯定会改变,我们只是需要再等待一段时间。

来源:http://lartc.org/lartc.html#AEN1446

如果有人知道从某个内核版本开始是否修复了这个问题,或者是否有计划在未来的版本中修复这个问题,请随时更新!

可能的解决方法(目前我自己还没有测试过)是隧道传输 IPv6 流量(SIT 隧道)并过滤包含 IPv6 数据包的 IPv4 数据包。

相关内容