![Linux tc IPv6 流量整形](https://linux22.com/image/602846/Linux%20tc%20IPv6%20%E6%B5%81%E9%87%8F%E6%95%B4%E5%BD%A2.png)
我已使用 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 数据包。