在我的设置中,多播TX流量由iptables标记,但是使用新路由表的策略路由从未起作用。虽然它适用于单播TX数据包(将原始数据包从eth0重定向到eth5)。使用tc我可以将eth0的广播流量发送到eth5。src mac和src ip地址已更改为eth5的值,因此不会对交换机学习造成任何问题。必须启用对内核数据包调度CONFIG_NET_SCHED的所有内核支持
在WORKS下面,用于从eth0重定向到eth5的单播和多播流量
Netfilter可用于直接与表示内核中数据包的结构进行交互。这个结构sk_buff包含一个我们将要修改的名为“ __u32 nfmark”的字段。然后,TC将读取该值以选择数据包的目标类别。
IP_ADDR_ETH0 = ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
iptables -t mangle -A输出-s $ {IP_ADDR_ETH0} -p udp --match multiport --dports 329330 -o eth0 -j MARK --set-mark 2
要创建代表我们的调度策略并使用PRIO qdisc(数据包调度程序)的树(可以尝试其他可用的树)。qdiscs附加在设备的根目录
tc qdisc添加dev eth0根句柄15:prio
现在,一方面具有流量整形策略,另一方面具有数据包标记。要连接两者,我们需要一个过滤器。
请参阅man tc-mirred(8):mirred操作允许对接收到的数据包进行镜像(复制)或重定向(窃取)。镜像有时称为交换端口分析器(SPAN),通常用于分析和/或调试流。
请参阅man tc-fw(8):fw-fwmark流量控制过滤器fw过滤器允许根据iptables根据先前设置的fwmark对数据包进行分类。如果与过滤器的“句柄”相同,则过滤器匹配。iptables允许使用MARK目标标记单个数据包,或使用CONNMARK标记整个连接。
MAC_ADDR_ETH1 = cat /sys/class/net/eth1/address
IP_ADDR_ETH1 = ifconfig eth1 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
tc过滤器添加dev eth0父级15:0协议ip prio 1处理0x2 fw action pedit ex munge eth src set $ {MAC_ADDR_ETH1} pipe \ action pedit ex munge ip src set $ {IP_ADDR_ETH1} pipe \ action mirred出口dev eth1
显示以上设置规则:tc qdisc显示dev eth0 tc过滤器show dev eth0
删除/取消设置规则:tc qdisc del dev eth0 root